Systèmes d'exploitation
Les systèmes embarqués n'ont souvent pas besoin d'un système d'exploitation complet. Certains utilisent de petits systèmes d'exploitation simples spécialement conçus qui démarrent très rapidement, d'autres n'en ont pas du tout besoin. Les systèmes embarqués ne s'adaptent pas aussi facilement, mais ils sont construits pour accomplir leurs tâches de manière beaucoup plus fiable. Comme le matériel est plus simple, il est aussi souvent moins cher à construire et fonctionne plus rapidement.
En revanche, un ordinateur polyvalent doit être prêt à recevoir de nouveaux pilotes et logiciels pour faire fonctionner du matériel dont il n'a pas encore connaissance, comme de nouvelles imprimantes ou de nouveaux disques durs. Il doit exécuter différents programmes d'application.
À mesure que les systèmes embarqués deviennent plus grands, des choses qui n'étaient auparavant que des ordinateurs à usage général ou même des ordinateurs centraux deviennent maintenant courantes sur les systèmes embarqués. Cela comprend un espace mémoire protégé et un environnement de programmation ouvert, notamment Linux, NetBSD, etc.
Quelques exemples de systèmes d'exploitation, du plus simple au plus complexe :
- Boucle de contrôle simple - Une minuterie et une boucle sont utilisées pour appeler différents sous-programmes de manière répétée. Cette opération est souvent effectuée par une seule personne pour les petits systèmes.
- Interruption contrôlée - Les tâches sont lancées par différents types d'événements. L'événement peut être chronométré (toutes les dix secondes, par exemple) ou résulter de la pression d'un bouton ou de la réception de données.
- multitâche non préventif - Chaque tâche est exécutée à son tour, et lorsqu'elle est terminée, elle appelle un planificateur dans le système d'exploitation pour exécuter la tâche suivante.
- multitâche préventif ou multithreading - Une tâche peut être arrêtée après un certain temps pour laisser une autre tâche se dérouler pendant un certain temps. Aucune tâche ne peut accaparer le système. À ce niveau, le système est considéré comme ayant un noyau de "système d'exploitation" et peut exécuter des tâches en parallèle. Ce type de système d'exploitation est généralement acheté à une société qui ne travaille que sur des systèmes d'exploitation embarqués.
Les systèmes d'exploitation en temps réel comprennent des produits comme MicroC/OS-II, Green Hills INTEGRITY, QNX ou VxWorks. Contrairement à MacOS ou Windows 7, ces systèmes d'exploitation ne sont pas très bien connus de la plupart des gens. Mais ils sont utilisés dans de nombreux endroits où le temps et la sécurité sont très importants. Les gens les utilisent tous les jours et ne s'en rendent pas compte.
Les exemples les plus courants de noyaux de plus grande taille sont Linux embarqué et Windows CE. Bien qu'ils n'aient pas les limites de temps étroites nécessaires à un système temps réel strict, ils sont de plus en plus courants, en particulier pour les appareils plus puissants tels que les routeurs sans fil et les GPS. Ils permettent la réutilisation du code dans le domaine public pour les pilotes de périphériques, les serveurs Web, les pare-feu et d'autres codes. Les développeurs de logiciels qui sont plus à l'aise pour écrire des applications pour PC trouveront cela plus familier aussi. Si nécessaire, un FPGA ou un autre matériel spécial peut être utilisé pour les choses qui nécessitent des délais serrés.
Outils
Comme pour les autres logiciels, les concepteurs de systèmes embarqués utilisent des compilateurs, des assembleurs et des débogueurs pour développer des logiciels de systèmes embarqués. Toutefois, ils peuvent également utiliser des outils plus spécifiques :
- Pour les systèmes utilisant le traitement numérique des signaux, les développeurs peuvent utiliser un outil mathématique tel que MATLAB, MathCad ou Mathematica.
- Des compilateurs et des éditeurs de liens personnalisés peuvent être utilisés pour améliorer l'optimisation d'un matériel particulier.
- Un système intégré peut avoir son propre langage ou outil de conception spécial, ou ajouter des améliorations à un langage existant comme celui utilisé par Basic Stamp.
Outils de débogage :
- Un débogueur en circuit (ICD), un dispositif matériel qui se connecte au microprocesseur via une interface JTAG. Ce dispositif démarre et arrête le microprocesseur de l'extérieur lorsqu'il exécute le logiciel. Il permet également de lire la mémoire et les registres, et de stocker le programme logiciel en mémoire.
- Débogage externe par journalisation ou sortie de port série pour retracer le fonctionnement à l'aide d'un moniteur clignotant (printfs).
- Débogage résident interactif - si le système d'exploitation le prend en charge, il s'agit d'un shell sur le processeur intégré qui exécute les commandes tapées par le développeur (Linux, par exemple).
- Un émulateur en circuit remplace le microprocesseur sur la carte, permettant un contrôle total sur tout ce que le microprocesseur pourrait faire.
- Un émulateur complet simule toutes les caractéristiques du matériel, ce qui permet de le contrôler et de le modifier. Le matériel n'existe pas vraiment, mais une version fictive de celui-ci (une machine "virtuelle") se trouve sur un PC normal.
- Vérification des lignes externes avec un analyseur logique ou un multimètre.
À moins qu'il ne soit limité au débogage externe, le programmeur peut généralement charger et exécuter un logiciel à l'aide des outils, visualiser le code exécuté dans le processeur, et démarrer ou arrêter son fonctionnement. La visualisation du code peut se faire sous forme de code assembleur ou de code source. Certains systèmes intégrés (comme VxWorks ou Green Hills) ont des caractéristiques spéciales, comme le suivi de l'espace occupé par le logiciel pendant son exécution, des tâches en cours d'exécution et du moment où les choses se passent.
Le type de système embarqué qui sera fabriqué aura une incidence sur la manière dont il pourra être débogué. Par exemple, le débogage d'un système à microprocesseur unique est différent du débogage d'un système où le traitement est également effectué sur un périphérique (DSP, FPGA, co-processeur).