GNU/Linux >> Znalost Linux >  >> Linux

Programujte hardware z příkazového řádku Linuxu

RT-Thread je open source operační systém v reálném čase používaný k programování zařízení internetu věcí (IoT). FinSH je komponenta příkazového řádku RT-Thread a poskytuje sadu operačních rozhraní umožňujících uživatelům kontaktovat zařízení z příkazového řádku. Používá se hlavně k ladění nebo zobrazení informací o systému.

Obvykle se ladění vývoje zobrazuje pomocí hardwarových debuggerů a printf protokoly. V některých případech však tyto dvě metody nejsou příliš užitečné, protože jsou abstrahovány od toho, co běží, a může být obtížné je analyzovat. RT-Thread je však vícevláknový systém, který je užitečný, když chcete znát stav běžícího vlákna nebo aktuální stav systému ručního ovládání. Protože je vícevláknový, můžete mít interaktivní shell, takže můžete zadávat příkazy, volat funkci přímo na zařízení, abyste získali potřebné informace, nebo ovládat chování programu. To se vám může zdát běžné, pokud jste zvyklí pouze na moderní operační systémy, jako je Linux nebo BSD, ale pro hardwarové hackery je to hluboký luxus a je na hony vzdáleno zapojování sériových kabelů přímo na desky, aby bylo možné získat záblesky chyb.

FinSH má dva režimy:

  • Režim tlumočníka jazyka C, známý jako c-style
  • Tradiční režim příkazového řádku, známý jako msh (shell modulu)

V režimu interpretace jazyka C může FinSH analyzovat výrazy, které provádějí většinu jazyka C a přistupovat k funkcím a globálním proměnným v systému pomocí volání funkcí. Může také vytvářet proměnné z příkazového řádku.

V msh v režimu FinSH funguje podobně jako tradiční shelly, jako je Bash.

Standard příkazů GNU

Další zdroje pro Linux

  • Cheat pro příkazy Linuxu
  • Cheat sheet pro pokročilé příkazy systému Linux
  • Bezplatný online kurz:Technický přehled RHEL
  • Síťový cheat pro Linux
  • Cheat sheet SELinux
  • Cheat pro běžné příkazy pro Linux
  • Co jsou kontejnery systému Linux?
  • Naše nejnovější články o Linuxu

Když jsme vyvíjeli FinSH, naučili jsme se, že než budete moci napsat aplikaci příkazového řádku, musíte se seznámit se standardy příkazového řádku GNU. Tento rámec standardních postupů pomáhá přiblížit rozhraní, což vývojářům pomáhá cítit se při jeho používání pohodlně a produktivně.

Kompletní příkaz GNU se skládá ze čtyř hlavních částí:

  1. Název příkazu (spustitelného souboru): Název programu příkazového řádku
  2. Dílčí příkaz: Název podfunkce příkazového programu
  3. Možnosti: Možnosti konfigurace pro funkci dílčího příkazu
  4. Argumenty: Odpovídající argumenty pro možnosti konfigurace funkce dílčího příkazu

Můžete to vidět v akci s jakýmkoli příkazem. Vezměme si jako příklad Git:

git reset --hard HEAD~1

Což se dělí takto:

    Spustitelný příkaz je git , dílčí příkaz je resetovat , použitá možnost je --head a argument je HEAD~1 .

    Další příklad:

    systemctl enable --now firewalld

    Spustitelný příkaz je systemctl , dílčí příkaz je enable , možnost je --nyní a argument je firewalld .

    Představte si, že chcete napsat program příkazového řádku, který vyhovuje standardům GNU pomocí RT-Thread. FinSH má vše, co potřebujete, a spustí váš kód podle očekávání. A co je ještě lepší, můžete se na tuto shodu spolehnout, takže můžete s jistotou portovat své oblíbené linuxové programy.

    Napište elegantní program příkazového řádku

    Zde je příklad, jak RT-Thread spouští příkaz, který vývojáři RT-Thread používají každý den.

    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

    Jak můžete říci, vypadá povědomě a funguje jako většina aplikací POSIX, které již můžete provozovat na Linuxu nebo BSD. Nápověda je poskytována, když je použita nesprávná nebo nedostatečná syntaxe, jsou podporovány dlouhé i krátké možnosti a obecné uživatelské rozhraní je známé každému, kdo používá terminál Unix.

    Druhy možností

    Existuje mnoho různých druhů možností a lze je rozdělit do dvou hlavních kategorií podle délky:

    1. Krátké možnosti: Skládají se z jedné pomlčky a jednoho písmene, např. -h možnost v pkgs -h
    2. Dlouhé možnosti: Skládají se ze dvou pomlček a slov nebo písmen, např. --target možnost v scons- --target-mdk5

    Tyto možnosti můžete rozdělit do tří kategorií podle toho, zda mají argumenty:

    1. Žádné argumenty: Za volbou nemohou následovat argumenty
    2. Musí být zahrnuty argumenty: Za volbou musí následovat argument
    3. Argumenty volitelné: Argumenty za možností jsou povoleny, ale nejsou povinné

    Jak byste očekávali od většiny příkazů Linuxu, analýza možností FinSH je docela flexibilní. Dokáže odlišit možnost od argumentu na základě mezery nebo znaménka rovná se jako oddělovač, nebo pouze extrahováním samotné možnosti a předpokladem, že argumentem je to, co následuje (jinými slovy, žádný oddělovač):

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

    Použití optparse

    Pokud jste někdy psali aplikaci příkazového řádku, možná víte, že obecně existuje knihovna nebo modul pro váš jazyk, který se nazývá optparse. Je poskytován programátorům, takže možnosti (jako -v nebo --verbose ) zadané jako součást příkazu lze analyzovat ve vztahu ke zbytku příkazu. To pomáhá vašemu kódu poznat volbu z dílčího příkazu nebo argumentu.

    Při psaní příkazu pro FinSH optparse balíček očekává tento formát:

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

    Možnosti můžete implementovat pomocí dlouhého nebo krátkého formuláře nebo obou. Například:

    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}
    };

    Po vytvoření možností napište příkaz a pokyny pro každou možnost a její argumenty:

    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");
    }

    Dalším krokem je analýza. Zatímco jeho funkce zatím nemůžete implementovat, rámec analyzovaného kódu je stejný:

    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;
    }

    Zde je soubor hlavy funkce:

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

    Poté zkompilujte a stáhněte do zařízení.

    Hardwarové hackování

    Programovací hardware se může zdát zastrašující, ale s IoT je to čím dál častější. Ne všechno lze nebo by mělo být spuštěno na Raspberry Pi, ale s RT-Thread si můžete zachovat známý pocit z Linuxu díky FinSH.

    Pokud vás zajímá kódování na holém kovu, vyzkoušejte RT-Thread.


    Linux
    1. Jak vyvolat makro Openoffice z příkazového řádku Linuxu?

    2. Linux Základy příkazového řádku – Spouštění příkazů z příkazového řádku

    3. Generování hash SHA-256 z příkazového řádku Linuxu

    1. Nakonfigurujte pracovní prostor Linuxu vzdáleně z příkazového řádku

    2. Vynechání prvního řádku z jakéhokoli výstupu příkazu Linuxu

    3. Jak mohu zkopírovat složku z příkazového řádku systému Linux?

    1. Mít krávu na příkazovém řádku Linuxu

    2. Přihlaste se do příkazového řádku Linuxu

    3. Použití Stratisu ke správě linuxového úložiště z příkazového řádku