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í:
- Název příkazu (spustitelného souboru): Název programu příkazového řádku
- Dílčí příkaz: Název podfunkce příkazového programu
- Možnosti: Možnosti konfigurace pro funkci dílčího příkazu
- 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:
- Krátké možnosti: Skládají se z jedné pomlčky a jednoho písmene, např.
-h
možnost vpkgs -h
- Dlouhé možnosti: Skládají se ze dvou pomlček a slov nebo písmen, např.
--target
možnost vscons- --target-mdk5
Tyto možnosti můžete rozdělit do tří kategorií podle toho, zda mají argumenty:
- Žádné argumenty: Za volbou nemohou následovat argumenty
- Musí být zahrnuty argumenty: Za volbou musí následovat argument
- 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.