GNU/Linux >> Belajar Linux >  >> Linux

Program perangkat keras dari baris perintah Linux

RT-Thread adalah sistem operasi real-time open source yang digunakan untuk memprogram perangkat Internet of Things (IoT). FinSH adalah komponen baris perintah RT-Thread, dan menyediakan satu set antarmuka operasi yang memungkinkan pengguna untuk menghubungi perangkat dari baris perintah. Ini terutama digunakan untuk men-debug atau melihat informasi sistem.

Biasanya, debugging pengembangan ditampilkan menggunakan debugger perangkat keras dan printf log. Namun, dalam beberapa kasus, kedua metode ini tidak terlalu berguna karena disarikan dari apa yang sedang berjalan, dan mungkin sulit untuk diuraikan. RT-Thread adalah sistem multi-utas, yang berguna ketika Anda ingin mengetahui status utas yang sedang berjalan, atau status sistem kontrol manual saat ini. Karena multi-threaded, Anda dapat memiliki shell interaktif, sehingga Anda dapat memasukkan perintah, memanggil fungsi secara langsung pada perangkat untuk mendapatkan informasi yang Anda butuhkan, atau mengontrol perilaku program. Ini mungkin tampak biasa bagi Anda jika Anda hanya terbiasa dengan sistem operasi modern seperti Linux atau BSD, tetapi bagi peretas perangkat keras ini adalah kemewahan yang luar biasa, dan jauh dari memasang kabel serial langsung ke papan untuk mendapatkan sekilas kesalahan.

FinSH memiliki dua mode:

  • Mode penerjemah bahasa C, yang dikenal sebagai gaya-c
  • Mode baris perintah tradisional, yang dikenal sebagai msh (kulit modul)

Dalam mode interpretasi bahasa C, FinSH dapat mengurai ekspresi yang mengeksekusi sebagian besar bahasa C dan mengakses fungsi dan variabel global pada sistem menggunakan pemanggilan fungsi. Itu juga dapat membuat variabel dari baris perintah.

Dalam msh mode, FinSH beroperasi mirip dengan shell tradisional seperti Bash.

Standar perintah GNU

Lebih banyak sumber daya Linux

  • Lembar contekan perintah Linux
  • Lembar contekan perintah Linux tingkat lanjut
  • Kursus online gratis:Ikhtisar Teknis RHEL
  • Lembar contekan jaringan Linux
  • Lembar contekan SELinux
  • Lembar contekan perintah umum Linux
  • Apa itu container Linux?
  • Artikel Linux terbaru kami

Saat kami mengembangkan FinSH, kami mempelajari bahwa sebelum Anda dapat menulis aplikasi baris perintah, Anda harus terbiasa dengan standar baris perintah GNU. Kerangka kerja praktik standar ini membantu menghadirkan keakraban pada antarmuka, yang membantu pengembang merasa nyaman dan produktif saat menggunakannya.

Perintah GNU lengkap terdiri dari empat bagian utama:

  1. Nama perintah (dapat dieksekusi): Nama program baris perintah
  2. Sub-perintah: Nama sub-fungsi dari program perintah
  3. Opsi: Opsi konfigurasi untuk fungsi sub-perintah
  4. Argumen: Argumen yang sesuai untuk opsi konfigurasi fungsi sub-perintah

Anda dapat melihat ini beraksi dengan perintah apa pun. Mengambil Git sebagai contoh:

git reset --hard HEAD~1

Yang dipecah menjadi:

    Perintah yang dapat dieksekusi adalah git , sub-perintahnya adalah setel ulang , opsi yang digunakan adalah --head , dan argumennya adalah HEAD~1 .

    Contoh lain:

    systemctl enable --now firewalld

    Perintah yang dapat dieksekusi adalah systemctl , sub-perintahnya adalah aktifkan , opsinya adalah --sekarang , dan argumennya adalah firewall .

    Bayangkan Anda ingin menulis program baris perintah yang sesuai dengan standar GNU menggunakan RT-Thread. FinSH memiliki semua yang Anda butuhkan, dan akan menjalankan kode Anda seperti yang diharapkan. Lebih baik lagi, Anda dapat mengandalkan kepatuhan ini sehingga Anda dapat dengan percaya diri mem-porting program Linux favorit Anda.

    Tulis program baris perintah yang elegan

    Berikut adalah contoh RT-Thread yang menjalankan perintah yang digunakan developer RT-Thread setiap hari.

    usage: env.py package [-h] [--force-update] [--update] [--list] [--wizard]
                          [--upgrade] [--printenv]

    optional arguments:
      -h, --help      show this help message and exit
      --force-update  force update and clean packages, install or remove the
                      packages by your settings in menuconfig
      --update        update packages, install or remove the packages by your
                      settings in menuconfig
      --list          list target packages
      --wizard        create a new package with wizard
      --upgrade       upgrade local packages list and ENV scripts from git repo
      --printenv      print environmental variables to check

    Seperti yang Anda tahu, ini terlihat familier dan berfungsi seperti kebanyakan aplikasi POSIX yang mungkin sudah Anda jalankan di Linux atau BSD. Bantuan diberikan ketika sintaks yang digunakan tidak tepat atau tidak memadai, baik opsi panjang maupun pendek didukung, dan antarmuka pengguna umum akrab bagi siapa saja yang menggunakan terminal Unix.

    Jenis opsi

    Ada banyak jenis opsi yang berbeda, dan mereka dapat dibagi menjadi dua kategori utama berdasarkan panjangnya:

    1. Opsi singkat: Terdiri dari satu tanda hubung ditambah satu huruf, misalnya -h opsi di pkgs -h
    2. Opsi panjang: Terdiri dari dua tanda hubung ditambah kata atau huruf, misalnya --target opsi di scons- --target-mdk5

    Anda dapat membagi opsi ini menjadi tiga kategori, ditentukan oleh apakah opsi tersebut memiliki argumen:

    1. Tidak ada argumen: Opsi tidak dapat diikuti oleh argumen
    2. Argumen harus disertakan: Opsi harus diikuti dengan argumen
    3. Argumen opsional: Argumen setelah opsi diperbolehkan tetapi tidak wajib

    Seperti yang Anda harapkan dari sebagian besar perintah Linux, penguraian opsi FinSH cukup fleksibel. Itu dapat membedakan opsi dari argumen berdasarkan spasi atau tanda sama dengan sebagai pembatas, atau hanya dengan mengekstrak opsi itu sendiri dan mengasumsikan bahwa apa pun yang mengikuti adalah argumen (dengan kata lain, tidak ada pembatas sama sekali):

    • wavplay -v 50
    • wavplay -v50
    • wavplay --vol=50

    Menggunakan optparse

    Jika Anda pernah menulis aplikasi baris perintah, Anda mungkin tahu bahwa umumnya ada perpustakaan atau modul untuk bahasa pilihan Anda yang disebut optparse. Ini disediakan untuk pemrogram sehingga opsi (seperti -v atau --verbose ) yang dimasukkan sebagai bagian dari perintah dapat diurai dalam kaitannya dengan sisa perintah. Itu yang membantu kode Anda mengetahui opsi dari sub-perintah atau argumen.

    Saat menulis perintah untuk FinSH, optparse paket mengharapkan format ini:

    MSH_CMD_EXPORT_ALIAS(pkgs, pkgs, this is test cmd.);

    Anda dapat menerapkan opsi menggunakan formulir panjang atau pendek, atau keduanya. Misalnya:

    static struct optparse_long long_opts[] =
    {
        {"help"        , 'h', OPTPARSE_NONE}, // Long command: help, corresponding to short command h, without arguments.
        {"force-update",  0 , OPTPARSE_NONE}, // Long comman: force-update, without arguments
        {"update"      ,  0 , OPTPARSE_NONE},
        {"list"        ,  0 , OPTPARSE_NONE},
        {"wizard"      ,  0 , OPTPARSE_NONE},
        {"upgrade"     ,  0 , OPTPARSE_NONE},
        {"printenv"    ,  0 , OPTPARSE_NONE},
        { NULL         ,  0 , OPTPARSE_NONE}
    };

    Setelah opsi dibuat, tulis perintah dan instruksi untuk setiap opsi dan argumennya:

    static void usage(void)
    {
        rt_kprintf("usage: env.py package [-h] [--force-update] [--update] [--list] [--wizard]\n");
        rt_kprintf("                      [--upgrade] [--printenv]\n\n");
        rt_kprintf("optional arguments:\n");
        rt_kprintf("  -h, --help      show this help message and exit\n");
        rt_kprintf("  --force-update  force update and clean packages, install or remove the\n");
        rt_kprintf("                  packages by your settings in menuconfig\n");
        rt_kprintf("  --update        update packages, install or remove the packages by your\n");
        rt_kprintf("                  settings in menuconfig\n");
        rt_kprintf("  --list          list target packages\n");
        rt_kprintf("  --wizard        create a new package with wizard\n");
        rt_kprintf("  --upgrade       upgrade local packages list and ENV scripts from git repo\n");
        rt_kprintf("  --printenv      print environmental variables to check\n");
    }

    Langkah selanjutnya adalah parsing. Meskipun Anda belum dapat mengimplementasikan fungsinya, kerangka kerja kode yang diuraikan adalah sama:

    int pkgs(int argc, char **argv)
    {
        int ch;
        int option_index;
        struct optparse options;

        if(argc == 1)
        {
            usage();
            return RT_EOK;
        }

        optparse_init(&options, argv);
        while((ch = optparse_long(&options, long_opts, &option_index)) != -1)
        {
            ch = ch;

            rt_kprintf("\n");
            rt_kprintf("optopt = %c\n", options.optopt);
            rt_kprintf("optarg = %s\n", options.optarg);
            rt_kprintf("optind = %d\n", options.optind);
            rt_kprintf("option_index = %d\n", option_index);
        }
        rt_kprintf("\n");

        return RT_EOK;
    }

    Berikut adalah file kepala fungsi:

    #include "optparse.h"
    #include "finsh.h"

    Kemudian, kompilasi dan unduh ke perangkat.

    Peretasan perangkat keras

    Perangkat keras pemrograman mungkin tampak menakutkan, tetapi dengan IoT, hal itu menjadi semakin umum. Tidak semuanya dapat atau harus dijalankan pada Raspberry Pi, tetapi dengan RT-Thread Anda dapat mempertahankan nuansa Linux yang familier, berkat FinSH.

    Jika Anda penasaran tentang pengkodean pada bare metal, cobalah RT-Thread.


    Linux
    1. Miliki sapi di baris perintah Linux

    2. Masukkan diri Anda ke dalam baris perintah Linux

    3. Menggunakan Stratis untuk mengelola penyimpanan Linux dari baris perintah

    1. Pelaporan I/O dari baris perintah Linux

    2. Menggunakan Google Drive dari Baris Perintah Linux

    3. Migrasi server Linux dari baris perintah

    1. Konfigurasikan ruang kerja Linux dari jarak jauh dari baris perintah

    2. Dasar-dasar baris Perintah Linux – Menjalankan perintah dari baris perintah

    3. Bagaimana saya bisa menyalin folder dari baris perintah Linux?