RT-Thread est un système d'exploitation en temps réel open source utilisé pour programmer les appareils de l'Internet des objets (IoT). FinSH est le composant de ligne de commande de RT-Thread, et il fournit un ensemble d'interfaces de fonctionnement permettant aux utilisateurs de contacter un appareil à partir de la ligne de commande. Il est principalement utilisé pour déboguer ou afficher les informations système.
Habituellement, le débogage de développement est affiché à l'aide de débogueurs matériels et de printf
journaux. Dans certains cas, cependant, ces deux méthodes ne sont pas très utiles car elles sont abstraites de ce qui est en cours d'exécution et peuvent être difficiles à analyser. RT-Thread est cependant un système multi-thread, ce qui est utile lorsque vous souhaitez connaître l'état d'un thread en cours d'exécution ou l'état actuel d'un système de contrôle manuel. Parce qu'il est multithread, vous pouvez avoir un shell interactif, vous pouvez donc entrer des commandes, appeler une fonction directement sur l'appareil pour obtenir les informations dont vous avez besoin ou contrôler le comportement du programme. Cela peut vous sembler ordinaire si vous n'êtes habitué qu'aux systèmes d'exploitation modernes tels que Linux ou BSD, mais pour les pirates informatiques, c'est un luxe profond, et bien loin de câbler des câbles série directement sur des cartes pour avoir un aperçu des erreurs. /P>
FinSH a deux modes :
- Un mode d'interprétation en langage C, appelé style c
- Un mode de ligne de commande traditionnel, appelé
msh
(enveloppe du module)
En mode d'interprétation du langage C, FinSH peut analyser des expressions qui exécutent la plupart du langage C et accéder à des fonctions et des variables globales sur le système à l'aide d'appels de fonction. Il peut également créer des variables à partir de la ligne de commande.
Dans msh
mode, FinSH fonctionne de la même manière que les shells traditionnels tels que Bash.
La norme de commande GNU
Plus de ressources Linux
- Aide-mémoire des commandes Linux
- Aide-mémoire des commandes Linux avancées
- Cours en ligne gratuit :Présentation technique de RHEL
- Aide-mémoire sur le réseau Linux
- Aide-mémoire SELinux
- Aide-mémoire sur les commandes courantes de Linux
- Que sont les conteneurs Linux ?
- Nos derniers articles Linux
Lorsque nous développions FinSH, nous avons appris qu'avant de pouvoir écrire une application en ligne de commande, vous devez vous familiariser avec les normes de ligne de commande GNU. Ce cadre de pratiques standard permet de familiariser une interface, ce qui aide les développeurs à se sentir à l'aise et productifs lorsqu'ils l'utilisent.
Une commande GNU complète se compose de quatre parties principales :
- Nom de la commande (exécutable) : Le nom du programme en ligne de commande
- Sous-commande : Le nom de la sous-fonction du programme de commande
- Choix : Options de configuration pour la fonction de sous-commande
- Arguments : Les arguments correspondants pour les options de configuration de la fonction de sous-commande
Vous pouvez voir cela en action avec n'importe quelle commande. En prenant Git comme exemple :
git reset --hard HEAD~1
Qui se décompose en :
La commande exécutable est git , la sous-commande est reset , l'option utilisée est --head , et l'argument est HEAD~1 .
Autre exemple :
systemctl enable --now firewalld
La commande exécutable est systemctl , la sous-commande est activer , l'option est --maintenant , et l'argument est firewalld .
Imaginez que vous souhaitiez écrire un programme en ligne de commande conforme aux normes GNU en utilisant RT-Thread. FinSH a tout ce dont vous avez besoin et exécutera votre code comme prévu. Mieux encore, vous pouvez compter sur cette conformité pour pouvoir porter en toute confiance vos programmes Linux préférés.
Écrire un programme élégant en ligne de commande
Voici un exemple de RT-Thread exécutant une commande que les développeurs RT-Thread utilisent tous les jours.
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
Comme vous pouvez le constater, il semble familier et agit comme la plupart des applications POSIX que vous pourriez déjà exécuter sous Linux ou BSD. Une aide est fournie lorsqu'une syntaxe incorrecte ou insuffisante est utilisée, les options longues et courtes sont prises en charge et l'interface utilisateur générale est familière à quiconque a utilisé un terminal Unix.
Types d'options
Il existe de nombreux types d'options, et elles peuvent être divisées en deux catégories principales en fonction de leur longueur :
- Options courtes : Composé d'un trait d'union et d'une seule lettre, par exemple, le
-h
option danspkgs -h
- Options longues : Composé de deux traits d'union suivis de mots ou de lettres, par exemple, le
--target
option dansscons- --target-mdk5
Vous pouvez diviser ces options en trois catégories, déterminées selon qu'elles ont ou non des arguments :
- Aucun argument : L'option ne peut pas être suivie d'arguments
- Les arguments doivent être inclus : L'option doit être suivie d'arguments
- Arguments facultatifs : Les arguments après l'option sont autorisés mais pas obligatoires
Comme on peut s'y attendre de la plupart des commandes Linux, l'analyse des options FinSH est assez flexible. Il peut distinguer une option d'un argument basé sur un espace ou un signe égal comme délimiteur, ou simplement en extrayant l'option elle-même et en supposant que ce qui suit est l'argument (en d'autres termes, pas de délimiteur du tout) :
wavplay -v 50
wavplay -v50
wavplay --vol=50
Utiliser optparse
Si vous avez déjà écrit une application en ligne de commande, vous savez peut-être qu'il existe généralement une bibliothèque ou un module pour le langage de votre choix appelé optparse. Il est fourni aux programmeurs afin que les options (telles que -v ou --verbeux ) entré dans le cadre d'une commande peut être parsé par rapport au reste de la commande. C'est ce qui aide votre code à reconnaître une option à partir d'une sous-commande ou d'un argument.
Lors de l'écriture d'une commande pour FinSH, le optparse
le paquet attend ce format :
MSH_CMD_EXPORT_ALIAS(pkgs, pkgs, this is test cmd.);
Vous pouvez implémenter des options en utilisant la forme longue ou courte, ou les deux. Par exemple :
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}
};
Une fois les options créées, écrivez la commande et les instructions pour chaque option et ses arguments :
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");
}
La prochaine étape est l'analyse. Bien que vous ne puissiez pas encore implémenter ses fonctions, le cadre du code analysé est le même :
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;
}
Voici le fichier principal de la fonction :
#include "optparse.h"
#include "finsh.h"
Ensuite, compilez et téléchargez sur un appareil.
Piratage matériel
Le matériel de programmation peut sembler intimidant, mais avec l'IoT, cela devient de plus en plus courant. Tout ne peut pas ou ne doit pas être exécuté sur un Raspberry Pi, mais avec RT-Thread, vous pouvez conserver une sensation Linux familière, grâce à FinSH.
Si vous souhaitez en savoir plus sur le codage sur métal nu, essayez RT-Thread.