Maison > Article > Tutoriel système > Plusieurs étapes pour le développement d'un projet Linux embarqué
Les cartes de développement et les exemples de projets logiciels associés fournis par les fabricants de microcontrôleurs sont souvent d'une grande aide pour les ingénieurs lorsqu'ils démarrent une nouvelle conception. Cependant, une fois les premières étapes d'un projet de conception terminées, le logiciel fourni par le fabricant peut poser certains problèmes lors de la suite de la conception.
Il existe également de nombreux défis pour la conception de l'utilisation d'un système d'exploitation en temps réel comme plate-forme pour le code d'application. Par exemple, il s'agit de questions telles que la manière d'attribuer efficacement des fonctions à différentes tâches parallèles, la conception d'une communication inter-processus fiable et la manière de tester l'ensemble du progiciel sur le matériel.
De plus en plus de fabricants OEM ont découvert que le meilleur moyen d'éviter les problèmes ci-dessus est de lancer de nouvelles conceptions en utilisant un système d'exploitation Linux basé sur l'open source, éprouvé, évolutif et capable de fonctionner sur diverses plates-formes matérielles. Le nombre de systèmes d'exploitation Linux portés sur diverses plates-formes matérielles informatiques est également sans précédent.
Les dérivés de Linux ont été largement utilisés dans une variété de systèmes embarqués, notamment les routeurs réseau, les téléphones mobiles, les commandes d'automatisation des bâtiments, les téléviseurs et les consoles de jeux vidéo.
Bien que Linux soit largement utilisé et réussi, cela ne signifie pas qu'il est facile à utiliser. Linux contient plus d'un million de lignes de code et fonctionne d'une manière distincte "Linux", à laquelle les débutants peuvent prendre un certain temps pour s'y habituer.
Le but de cet article est donc d'aider à démarrer un nouveau projet de conception utilisant μClinux, une version du système d'exploitation embarqué Linux. Ce guide sera divisé en cinq étapes. Pour illustrer le guide, un projet μClinux implémenté sur le microcontrôleur STM32F429 de STMicroelectronics, qui utilise un cœur ARM Cortex-M4 avec une fréquence maximale de 180 MHz et utilise le package de support de carte Linux Discovery STM32F429 (BSP) d'Emcraft.
Chaque conception de logiciel embarqué commence par le choix des bons outils.
Une chaîne d'outils est un ensemble d'outils de développement logiciel connectés (ou liés) entre eux. Elle comprend des outils tels que la GNU Compiler Collection (GCC), binutils (un ensemble d'éditeurs de liens, d'assembleurs et d'autres outils pour le développement d'objets). fichiers et archives) et glibc (une bibliothèque C qui fournit des appels système et des fonctions de base) ; dans certains cas, d'autres outils tels que des compilateurs et des débogueurs peuvent également être inclus) ;
La chaîne d'outils utilisée pour le développement embarqué est une chaîne d'outils croisée, plus communément appelée compilateur croisé.
GNUBinutils est le premier composant de la chaîne d'outils Linux embarquée. GNUbinutils contient deux outils importants :
Quantity"as", assembleur, convertit le code assembleur (généré par GCC) en code binaire
Quantity "ld", connecteur, connecte des segments de code cible discrets à des bibliothèques ou forme des fichiers exécutables
Le compilateur est le deuxième élément important de la chaîne d'outils. Dans Embedded Linux, il s'appelle GCC et prend en charge de nombreux types d'architectures de microcontrôleurs et de processeurs.
Vient ensuite la bibliothèque de fonctions C. Il implémente l'interface de programmation d'applications (API) POSIX traditionnelle de Linux, qui peut être utilisée pour développer des applications en espace utilisateur. Il s'interface avec le noyau via des appels système et fournit des services de haut niveau.
Les ingénieurs disposent de plusieurs choix de bibliothèques de fonctions C :
weightglibc est une bibliothèque de fonctions C disponible fournie par le projet open source GNU. La bibliothèque est complète, portable et conforme aux normes Linux.
QuantityEmbedded GLIBC (EGLIBC) est une version dérivée optimisée pour les systèmes embarqués. Son code est rationalisé, prend en charge la compilation croisée et les tests croisés, et son code source et son code binaire sont compatibles avec GLIBC.
weightuClibc est une autre bibliothèque C qui peut être utilisée lorsque l'espace flash est limité et/ou que l'utilisation de la mémoire doit être minimale.
Un débogueur fait généralement également partie de la chaîne d'outils, puisqu'un débogueur croisé est nécessaire pour déboguer l'application exécutée sur la machine cible. Dans le domaine de Linux embarqué, GDB est un débogueur couramment utilisé.
Les outils ci-dessus sont tellement indispensables, mais lorsqu'ils fonctionnent de manière indépendante, la compilation du code source Linux et son intégration dans l'image finale prennent trop de temps. Heureusement, Buildroot automatise le processus de création d'un système embarqué complet et simplifie la compilation croisée en générant tout ou partie des tâches suivantes :
QuantityChaîne d'outils de compilation croisée
QuantitySystème de fichiers racine
QuantityImage du noyau
QuantityImage de démarrage
Pour les concepteurs de systèmes embarqués, il est également pratique d'utiliser un outil d'agrégation d'utilitaires, tel que BusyBox, qui intègre les outils généralement les plus nécessaires. Selon la page d'informations de BusyBox, « Il combine des versions minuscules de nombreux outils UNIX courants dans un petit exécutable. Il fournit une alternative à la plupart des outils que vous verriez généralement dans des outils comme GNU fileutils et shellutils. BusyBox Les outils de BusyBox sont généralement moins nombreux. plus sélectif que leurs homologues GNU complets ; mais les options incluses offrent les fonctionnalités et le comportement attendus qui sont pratiquement identiques à ceux fournis par les homologues GNU. Pour tout système petit ou intégré, BusyBox propose un environnement assez complet. »
Le dernier outil important est un BSP, spécialement conçu pour la carte mère équipée du MCU ou du processeur cible du projet.BSP comprend des outils préconfigurés, ainsi qu'un chargeur de démarrage pour charger le système d'exploitation sur la carte mère. Il fournit également le code source du noyau et des pilotes de périphérique (voir Figure 1).
1) Le micrologiciel du chargeur de démarrage (U-Boot dans l'exemple de projet) s'exécute dans la mémoire flash intégrée du MCU cible (aucune mémoire externe requise) et, après la mise sous tension/réinitialisation, effectue tous les travaux d'initialisation nécessaires, y compris la configuration du port série et l'utiliser en externe Contrôleur de mémoire pour l'accès à la mémoire (RAM).
2) U-Boot transfère l'image Linux du Flash externe vers la RAM externe et confie le contrôle au point d'entrée du noyau dans la RAM. Les images Linux peuvent être compressées pour économiser de l'espace flash au détriment du temps de décompression au moment du démarrage.
3) Linux démarre et installe un système de fichiers basé sur la RAM (initramfs) comme système de fichiers racine. Lorsque le projet est construit, Initramfs est rempli avec les fichiers et répertoires requis, puis simplement lié au noyau.
4) Sous le noyau Linux, exécutez /sbin/init. Le programme /sbin/init initialise le système selon la description du fichier de configuration dans /etc/inittab.
5) Une fois que le processus d'initialisation a terminé l'exécution au niveau de l'exécution et les commandes dans /sbin/init, il démarre un processus de connexion.
6) L'exécution du fichier d'initialisation du shell /etc/profile marque la fin du processus de démarrage.
Vous pouvez réduire considérablement le temps de démarrage et améliorer les performances globales en activant l'exécution sur place (ExecuteInPlace - XIP), qui est une méthode d'exécution de code à partir de la mémoire flash. En règle générale, le code Linux est chargé de la mémoire flash vers la mémoire externe, puis exécuté à partir de la mémoire externe. En exécutant à partir de la mémoire flash, moins de mémoire est requise car cette étape n'est plus copiée et la mémoire en lecture seule n'occupe plus d'espace programme.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!