GNU/Linux >> Tutoriels Linux >  >> Linux

Programmer le matériel à partir de la ligne de commande Linux

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 :

  1. Nom de la commande (exécutable) : Le nom du programme en ligne de commande
  2. Sous-commande : Le nom de la sous-fonction du programme de commande
  3. Choix : Options de configuration pour la fonction de sous-commande
  4. 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 :

    1. Options courtes : Composé d'un trait d'union et d'une seule lettre, par exemple, le -h option dans pkgs -h
    2. Options longues : Composé de deux traits d'union suivis de mots ou de lettres, par exemple, le --target option dans scons- --target-mdk5

    Vous pouvez diviser ces options en trois catégories, déterminées selon qu'elles ont ou non des arguments :

    1. Aucun argument : L'option ne peut pas être suivie d'arguments
    2. Les arguments doivent être inclus : L'option doit être suivie d'arguments
    3. 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.


    Linux
    1. 8 conseils pour la ligne de commande Linux

    2. Comment installer un logiciel à partir de la ligne de commande Linux

    3. Rapports d'E/S à partir de la ligne de commande Linux

    4. Migrer un serveur Linux depuis la ligne de commande

    5. Principes de base de la ligne de commande Linux - Exécution de commandes à partir de la ligne de commande

    Créer un collage de photos à partir de la ligne de commande Linux

    La ligne de commande Linux peut s'amuser de loin

    Maîtrisez la ligne de commande Linux

    Comment rechercher des fichiers à partir de la ligne de commande Linux

    Supprimer le répertoire sous Linux - Comment supprimer un dossier de la ligne de commande

    Omettre la première ligne de toute sortie de commande Linux