Un système embarqué est un système informatique spécialisé — une combinaison d'un processeur , d'une mémoire et de périphériques d'entrée/sortie — qui remplit une fonction dédiée au sein d'un système mécanique ou électronique plus vaste. Il est intégré à un dispositif complet, comprenant souvent des composants électriques ou électroniques et des pièces mécaniques. Les systèmes embarqués contrôlent de nombreux appareils d'usage courant. les microprocesseurs fabriqués sont utilisés dans des systèmes embarqués. Étant donné qu'un système embarqué contrôle généralement les opérations physiques de la machine dans laquelle il est intégré, il est souvent soumis à des contraintes de calcul en temps réel . Les systèmes embarqués modernes reposent souvent sur des microcontrôleurs (c’est-à-dire des microprocesseurs avec mémoire intégrée et interfaces périphériques), mais les microprocesseurs classiques (utilisant des puces externes pour la mémoire et les circuits d’interface périphériques) sont également courants, notamment dans les systèmes plus complexes. Dans les deux cas, le ou les processeurs utilisés peuvent être de types variés : processeurs généralistes, processeurs spécialisés pour une catégorie de calculs particulière, voire processeurs conçus sur mesure pour l’application concernée. Les processeurs de signal numérique (DSP) constituent une catégorie standard courante de processeurs dédiés. Le système embarqué étant dédié à des tâches spécifiques, les ingénieurs concepteurs peuvent l’optimiser afin de réduire sa taille et son coût, tout en améliorant sa fiabilité et ses performances. Certains systèmes embarqués sont produits en série, ce qui permet de bénéficier d’ économies d’échelle . Les systèmes embarqués varient en taille, allant des appareils personnels portables tels que les montres numériques et les lecteurs MP3 aux machines plus importantes comme les appareils électroménagers , les chaînes de montage industrielles , les robots , les véhicules de transport, les contrôleurs de feux de circulation et les systèmes d'imagerie médicale . Ils constituent souvent des sous-systèmes d'autres machines, comme l'avionique dans les aéronefs et l'astronique dans les engins spatiaux . Les grandes installations telles que les usines , les pipelines et les réseaux électriques reposent sur de multiples systèmes embarqués interconnectés. Généralisés par la personnalisation logicielle, les systèmes embarqués, tels que les automates programmables, comprennent fréquemment leurs unités fonctionnelles.
Les premiers microprocesseurs multipuces, le Four-Phase Systems AL1 en 1969 et le Garrett AiResearch MP944 en 1970, ont été développés avec plusieurs puces MOS LSI. Le premier microprocesseur monopuce fut l' Intel 4004 , sorti en 1971. Il a été développé par Federico Faggin , utilisant sa technologie MOS à grille de silicium , en collaboration avec les ingénieurs d'Intel Marcian Hoff et Stan Mazor , et l'ingénieur de Busicom Masatoshi Shima .
Développement
L'un des premiers systèmes embarqués résolument modernes fut l' ordinateur de guidage Apollo , développé vers 1965 par Charles Stark Draper au Laboratoire d'instrumentation du MIT . Dès le lancement du projet, cet ordinateur était considéré comme l'élément le plus risqué, car il utilisait les circuits intégrés monolithiques, alors récemment mis au point , afin de réduire sa taille et son poids.
L'un des premiers systèmes embarqués produits en masse fut l' ordinateur de guidage Autonetics D-17 pour le missile Minuteman , sorti en 1961. Lorsque le Minuteman II entra en production en 1966, le D-17 fut remplacé par un nouvel ordinateur qui représentait la première utilisation à grande échelle de circuits intégrés.
Depuis les premières applications des années 1960, le coût des systèmes embarqués a considérablement baissé, tandis que leur puissance de traitement et leurs fonctionnalités ont connu une augmentation spectaculaire. L'un des premiers microprocesseurs, l' Intel 4004 (lancé en 1971), était conçu pour les calculatrices et autres petits systèmes, mais nécessitait encore de la mémoire externe et des puces de support. Au début des années 1980, la mémoire et les composants du système d'entrée/sortie étaient intégrés à la même puce que le processeur, formant ainsi un microcontrôleur. Les microcontrôleurs trouvent des applications là où un ordinateur classique serait trop onéreux. La baisse du coût des microprocesseurs et des microcontrôleurs a entraîné une augmentation de la prévalence des systèmes embarqués.
Un microcontrôleur relativement peu coûteux peut être programmé pour remplir la même fonction qu'un grand nombre de composants distincts. Grâce aux microcontrôleurs, il est devenu possible de remplacer, même dans les produits grand public, les composants analogiques onéreux à molette , tels que les potentiomètres et les condensateurs variables , par des boutons ou des molettes dont la valeur est lue par un microprocesseur. Bien que, dans ce contexte, un système embarqué soit généralement plus complexe qu'une solution traditionnelle, l'essentiel de cette complexité réside dans le microcontrôleur lui-même. Très peu de composants supplémentaires sont nécessaires et l'effort de conception se concentre principalement sur le logiciel. Le prototypage et les tests logiciels sont plus rapides que la conception et la construction d'un nouveau circuit sans processeur embarqué.
Applications

On retrouve couramment des systèmes embarqués dans les applications grand public, industrielles, automobiles , d'électroménager , médicales, de télécommunications, commerciales, aérospatiales et militaires.
Les systèmes de télécommunications utilisent de nombreux systèmes embarqués, allant des commutateurs téléphoniques du réseau aux téléphones portables de l' utilisateur final . Les réseaux informatiques utilisent des routeurs et des ponts réseau dédiés pour acheminer les données.
L'électronique grand public comprend les lecteurs MP3 , les téléviseurs , les téléphones portables , les consoles de jeux vidéo , les appareils photo numériques , les récepteurs GPS et les imprimantes . Les appareils électroménagers, tels que les fours à micro-ondes , les lave-linge et les lave-vaisselle , intègrent des systèmes embarqués pour plus de flexibilité, d'efficacité et de fonctionnalités. Les systèmes de chauffage, de ventilation et de climatisation (CVC) de pointe utilisent des thermostats connectés pour un contrôle plus précis et efficace de la température, qui peut varier selon l'heure et la saison . La domotique exploite les réseaux filaires et sans fil pour contrôler l'éclairage, le chauffage, la climatisation, la sécurité, l'audiovisuel, la surveillance, etc., grâce à des dispositifs embarqués de détection et de contrôle.
Les systèmes de transport, de l'aviation à l'automobile, utilisent de plus en plus les systèmes embarqués. Les nouveaux avions intègrent une avionique de pointe, comme les systèmes de guidage inertiel et les récepteurs GPS, qui imposent des exigences de sécurité considérables. Les engins spatiaux s'appuient sur des systèmes astroniques pour corriger leur trajectoire. Divers moteurs électriques – moteurs à courant continu sans balais , moteurs à induction et moteurs à courant continu – utilisent des contrôleurs électroniques . Les automobiles , les véhicules électriques et les véhicules hybrides utilisent de plus en plus les systèmes embarqués pour optimiser leur rendement et réduire la pollution. Parmi les autres systèmes de sécurité automobile utilisant des systèmes embarqués, on peut citer le système antiblocage des roues (ABS), le contrôle électronique de stabilité (ESC/ESP), l'antipatinage (TCS) et la transmission intégrale automatique .
Les équipements médicaux utilisent des systèmes embarqués pour la surveillance et diverses techniques d'imagerie médicale ( tomographie par émission de positons (TEP), tomographie d'émission monophotonique (TEMP), tomodensitométrie (TDM) et imagerie par résonance magnétique (IRM)) pour les examens internes non invasifs. Les systèmes embarqués au sein des équipements médicaux sont souvent alimentés par des ordinateurs industriels.
Les systèmes embarqués sont utilisés pour les systèmes critiques de sécurité dans les secteurs de l'aérospatiale et de la défense. À moins d'être connectés à des réseaux filaires ou sans fil via une puce 3G ou d'autres méthodes pour la surveillance et le contrôle IoT, ces systèmes peuvent être isolés du piratage et donc être plus sécurisés. Pour la sécurité incendie, les systèmes peuvent être conçus pour supporter des températures plus élevées et continuer à fonctionner. En matière de sécurité, les systèmes embarqués peuvent être autonomes et capables de gérer les coupures des systèmes électriques et de communication.« motes », sont des capteurs sans fil en réseau. La mise en réseau de ces capteurs sans fil tire parti de la miniaturisation permise par la conception avancée des circuits intégrés (CI) pour coupler des sous-systèmes sans fil complets à des capteurs sophistiqués. Ceci permet aux particuliers et aux entreprises de mesurer une multitude de phénomènes dans le monde physique et d'exploiter ces informations grâce à des systèmes de surveillance et de contrôle. Ces motes sont totalement autonomes et fonctionnent généralement sur batterie pendant des années avant que celle-ci ne nécessite un remplacement ou une recharge.
Caractéristiques
Les systèmes embarqués sont conçus pour exécuter une tâche spécifique, contrairement aux ordinateurs généralistes conçus pour de multiples tâches. Certains doivent respecter des contraintes de performance en temps réel , notamment pour des raisons de sécurité et d'ergonomie ; d'autres peuvent avoir des exigences de performance faibles, voire nulles, ce qui permet de simplifier le matériel et de réduire les coûts.
Les systèmes embarqués ne sont pas toujours des dispositifs autonomes. Nombre d'entre eux constituent une petite partie d'un dispositif plus vaste ayant une fonction plus générale. Par exemple, la guitare robot Gibson intègre un système embarqué pour l'accordage des cordes, mais sa fonction principale est de jouer de la musique. De même, un système embarqué dans une automobile remplit une fonction spécifique en tant que sous-système du véhicule.

Les instructions de programme écrites pour les systèmes embarqués sont appelées firmware et sont stockées dans une mémoire morte ou une puce de mémoire flash . Elles fonctionnent avec des ressources matérielles limitées : peu de mémoire, clavier ou écran de petite taille, voire inexistant.
interfaces utilisateur

Les systèmes embarqués présentent une grande diversité, allant de l'absence totale d'interface utilisateur , dans les systèmes dédiés à une seule tâche, aux interfaces graphiques complexes similaires aux systèmes d'exploitation des ordinateurs de bureau modernes. Les dispositifs embarqués simples utilisent des boutons , des diodes électroluminescentes (DEL), des écrans à cristaux liquides (LCD) graphiques ou à caractères avec un système de menus rudimentaire . Les dispositifs plus sophistiqués, dotés d'un écran graphique tactile ou de touches programmables en bord d'écran, offrent une grande flexibilité tout en minimisant l'encombrement : la fonction des boutons peut varier selon l'affichage, et la sélection s'effectue instinctivement en pointant du doigt l'élément souhaité.
Certains systèmes offrent une interface utilisateur à distance via une connexion série (par exemple RS-232 ) ou réseau (par exemple Ethernet ). Cette approche étend les capacités du système embarqué, évite le coût d'un écran, simplifie le BSP ( Board Support Package ) et permet aux concepteurs de créer une interface utilisateur riche sur PC. Un bon exemple est l'intégration d'un serveur HTTP embarqué fonctionnant sur un périphérique embarqué (tel qu'une caméra IP ou un routeur réseau ). L'interface utilisateur s'affiche alors dans un navigateur web sur un PC connecté au périphérique.
Processeurs dans les systèmes embarqués
Les ordinateurs embarqués se distinguent généralement des ordinateurs classiques par leur faible consommation d'énergie, leur taille réduite, leur robustesse et leur faible coût unitaire. En contrepartie, leurs ressources de traitement sont limitées.
De nombreux microcontrôleurs ont été développés pour les systèmes embarqués. Les microprocesseurs à usage général sont également utilisés dans les systèmes embarqués, mais nécessitent généralement davantage de circuits de support que les microcontrôleurs.
Cartes électroniques prêtes à l'emploi
Les normes PC/104 et PC/104+ concernent des cartes électroniques prêtes à l'emploi, destinées aux systèmes embarqués et durcis de petite taille et à faible volume de production. Ces cartes sont principalement basées sur l'architecture x86 et sont souvent plus compactes qu'un PC standard, bien que plus volumineuses que la plupart des systèmes embarqués simples (8/16 bits). Elles peuvent utiliser un système d'exploitation standard comme Linux ou NetBSD , ou un système d'exploitation temps réel embarqué (RTOS) comme MicroC/OS-II , QNX ou VxWorks .
Dans certaines applications où la compacité ou l'efficacité énergétique ne sont pas des critères primordiaux, les composants utilisés peuvent être compatibles avec ceux des ordinateurs personnels x86 classiques. Des cartes telles que la gamme VIA EPIA contribuent à combler cet écart en étant compatibles PC tout en étant hautement intégrées, physiquement plus compactes ou dotées d'autres caractéristiques qui les rendent attrayantes pour les ingénieurs en systèmes embarqués. L'avantage de cette approche réside dans la possibilité d'utiliser des composants standard à bas coût, ainsi que les mêmes outils de développement logiciel que pour le développement logiciel classique. Les systèmes ainsi conçus sont toujours considérés comme embarqués, car ils sont intégrés à des dispositifs plus vastes et remplissent une fonction unique. Les distributeurs automatiques de billets (DAB) et les bornes d'arcade , qui contiennent un code spécifique à l'application, sont des exemples de dispositifs pouvant adopter cette approche.
Cependant, la plupart des cartes de systèmes embarqués prêtes à l'emploi ne sont pas conçues pour les PC et n'utilisent pas les bus ISA ou PCI . Lorsqu'un processeur système sur puce est utilisé, l'intérêt d'un bus standardisé reliant les composants discrets est souvent limité, et l'environnement des outils matériels et logiciels peut être très différent.
Une conception courante repose sur un petit module système, de la taille d'une carte de visite par exemple, intégrant des puces BGA haute densité (comme un processeur système sur puce ARM) et ses périphériques, de la mémoire flash externe pour le stockage et de la DRAM pour la mémoire d'exécution. Le fournisseur du module propose généralement un logiciel de démarrage et une sélection de systèmes d'exploitation, incluant souvent Linux et des systèmes temps réel. Ces modules peuvent être produits en grande série par des entreprises maîtrisant les problématiques de test spécifiques et associés à des cartes mères personnalisées, fabriquées en plus petite quantité, dotées de périphériques externes dédiés à l'application. Arduino et Raspberry Pi sont des exemples emblématiques de cette approche .
Solutions SoC ASIC et FPGA
Un système sur puce (SoC) intègre un système complet, composé de plusieurs processeurs, multiplicateurs, caches, différents types de mémoire et généralement divers périphériques tels que des interfaces de communication filaire ou sans fil, le tout sur une seule puce. Ces puces contiennent souvent des unités de traitement graphique (GPU) et des processeurs de signal numérique (DSP). Les SoC peuvent être implémentés sous forme de circuit intégré spécifique à une application (ASIC) ou à l'aide d'un réseau de portes programmables (FPGA), qui est généralement reconfigurable.
Les circuits intégrés spécifiques (ASIC) sont courants pour les systèmes embarqués produits en très grande série, comme les téléphones mobiles et les smartphones . Les circuits intégrés spécifiques (ASIC) ou les FPGA peuvent être utilisés pour les systèmes embarqués produits en plus petite série et présentant des exigences particulières en matière de performances de traitement du signal, d'interfaces et de fiabilité, comme dans le domaine de l'avionique.
Périphériques

Les systèmes embarqués communiquent avec le monde extérieur via des périphériques , tels que :
- Interfaces de communication série (SCI) : RS-232 , RS-422 , RS-485 , etc.
- Interfaces série synchrones : I2C , SPI , SSC et ESSI (Enhanced Synchronous Serial Interface)
- Bus série universel (USB)
- Cartes mémoire ( cartes SD , CompactFlash , etc.)
- Contrôleur d'interface réseau : Ethernet , WiFi , etc.
- Bus de terrain : bus CAN , bus LIN , PROFIBUS , etc.
- Minuteurs : boucles à verrouillage de phase , minuteries à intervalles programmables
- Entrées/sorties à usage général (GPIO)
- Convertisseurs analogique-numérique et numérique-analogique
- Débogage : JTAG , programmation en système , port d’interface en mode de débogage en arrière-plan , ports BITP et DB9.
Outils
Comme pour tout autre logiciel, les concepteurs de systèmes embarqués utilisent des compilateurs , des assembleurs et des débogueurs pour développer des logiciels embarqués. Ils peuvent toutefois également utiliser des outils plus spécifiques :
- Dans les débogueurs ou émulateurs de circuits (voir la section suivante ).
- Utilitaires permettant d'ajouter une somme de contrôle ou un CRC à un programme, afin que le système embarqué puisse vérifier sa validité.
- Pour les systèmes utilisant le traitement numérique du signal , les développeurs peuvent utiliser un ordinateur portable de calcul pour simuler les calculs mathématiques.
- System-level modeling and simulation tools help designers to construct simulation models of a system with hardware components such as processors, memories, DMA, interfaces, buses and software behavior flow as a state diagram or flow diagram using configurable library blocks. Simulation is conducted to select the right components by performing power vs. performance trade-offs, reliability analysis, and bottleneck analysis. Typical reports that help a designer make architecture decisions include application latency, device throughput, device utilization, power consumption of the full system, as well as device-level power consumption.
- A model-based development tool creates and simulates graphical data flow and UML state chart diagrams of components like digital filters, motor controllers, communication protocol decoding and multi-rate tasks.
- Custom compilers and linkers may be used to optimize specialized hardware.
- An embedded system may have its own special language or design tool, or add enhancements to an existing language such as Forth or Basic.
- Another alternative is to add a RTOS or embedded operating system
- Modeling and code generating tools often based on state machines
Software tools can come from several sources:
- Software companies that specialize in the embedded market
- Ported from the GNU software development tools
- Sometimes, development tools for a personal computer can be used if the embedded processor is a close relative of a common PC processor
Embedded software often requires a variety of development tools, including programming languages such as C++, Rust, or Python, and frameworks like Qt for graphical interfaces. These tools enable developers to create efficient, scalable, and feature-rich applications tailored to the specific requirements of embedded systems. The choice of tools is driven by factors such as real-time performance, integration with hardware, or energy efficiency.
As the complexity of embedded systems grows, higher-level tools and operating systems are migrating into machinery where it makes sense. For example, cellphones, personal digital assistants and other consumer computers often need significant software that is purchased or provided by a person other than the manufacturer of the electronics. In these systems, an open programming environment such as Linux, NetBSD, FreeBSD, OSGi or Embedded Java is required so that the third-party software provider can sell to a large market.
Debugging
Le débogage embarqué peut être effectué à différents niveaux, selon les ressources disponibles. Il convient notamment de prendre en compte : son impact sur le fonctionnement de l’application principale ; la proximité du système ou de l’application débogué(e) avec le système ou l’application réel(le) ; la précision des déclencheurs de débogage (par exemple, l’inspection de la mémoire lors de l’atteinte d’une valeur particulière du compteur de programme ) ; et les éléments inspectables lors du débogage (mémoire uniquement, ou mémoire et registres, etc.).
Des plus simples aux plus sophistiquées, les techniques et systèmes de débogage sont regroupés en grandes catégories :
- Débogage interactif en interne, utilisant l'interpréteur de commandes simple fourni par le système d'exploitation embarqué (par exemple, Forth et Basic).
- Les débogueurs logiciels ont l’avantage de ne nécessiter aucune modification matérielle, mais doivent contrôler soigneusement ce qu’ils enregistrent afin de gagner du temps et de l’espace de stockage.
- Débogage externe utilisant la journalisation ou la sortie du port série pour tracer le fonctionnement à l'aide d'un moniteur dans la mémoire flash ou à l'aide d'un serveur de débogage comme Remedy Debugger qui fonctionne même pour les systèmes multicœurs hétérogènes .
- Un débogueur en circuit (ICD) est un dispositif matériel qui se connecte au microprocesseur via une interface JTAG ou Nexus . Cela permet de contrôler le fonctionnement du microprocesseur à distance, mais est généralement limité à des fonctionnalités de débogage spécifiques du processeur.
- Un émulateur en circuit (ICE) remplace le microprocesseur par un équivalent simulé, offrant un contrôle total sur tous les aspects du microprocesseur.
- Un émulateur complet simule l'intégralité du matériel, permettant ainsi de le contrôler et de le modifier, et de procéder au débogage sur un PC standard. Ses inconvénients sont son coût et sa lenteur, pouvant atteindre jusqu'à 100 fois celle du système final.
- Pour les conceptions de systèmes sur puce (SoC), l'approche classique consiste à vérifier et déboguer la conception sur une carte prototype FPGA. Des outils tels que Certus permettent d'insérer des sondes dans l'implémentation FPGA, rendant ainsi les signaux disponibles pour l'observation. Ceci est utilisé pour déboguer les interactions matérielles, logicielles et micrologicielles entre plusieurs FPGA au sein d'une implémentation aux capacités similaires à celles d'un analyseur logique.
Sauf en cas de limitation au débogage externe, le programmeur peut généralement charger et exécuter un logiciel via les outils, visualiser le code s'exécutant dans le processeur et démarrer ou arrêter son fonctionnement. Le code peut s'afficher sous forme de langage de programmation de haut niveau , de code assembleur ou d'un mélange des deux.
Tracé
Les systèmes d'exploitation temps réel (RTOS) prennent souvent en charge le traçage des événements système. Une représentation graphique est présentée par un outil du poste hôte, basée sur l'enregistrement du comportement du système. Cet enregistrement peut être effectué par logiciel, par le RTOS lui-même, ou par un matériel de traçage dédié. Le traçage RTOS permet aux développeurs de comprendre les problèmes de synchronisation et de performance du système et offre une bonne compréhension de son comportement global. Dans les systèmes embarqués, l'enregistrement de traces peut être réalisé par des solutions matérielles ou logicielles. L'enregistrement logiciel ne nécessite pas de matériel de débogage spécialisé et peut être utilisé sur des appareils déployés, mais il peut impacter l'utilisation du processeur et de la mémoire vive. Un exemple de méthode de traçage logiciel utilisée dans les environnements RTOS est l'utilisation de macros vides , invoquées par le système d'exploitation à des endroits stratégiques du code et pouvant servir de points d'ancrage .
Fiabilité
Les systèmes embarqués sont souvent intégrés à des machines conçues pour fonctionner en continu pendant des années sans erreur et, dans certains cas, pour redémarrer automatiquement en cas de panne. Par conséquent, leur développement et leurs tests logiciels sont généralement plus rigoureux que pour les ordinateurs personnels, et l'utilisation de pièces mécaniques mobiles peu fiables, telles que les disques durs, les interrupteurs ou les boutons, est proscrite.
Les problèmes de fiabilité spécifiques peuvent inclure :
- Le système ne peut être arrêté en toute sécurité pour être réparé, ou bien il est trop inaccessible pour permettre sa réparation. On peut citer comme exemples les systèmes spatiaux, les câbles sous-marins, les balises de navigation, les systèmes de forage et les automobiles.
- Le système doit rester opérationnel pour des raisons de sécurité. Une fonctionnalité réduite en cas de panne serait inacceptable. Le plus souvent, les systèmes de secours sont sélectionnés par un opérateur. On peut citer comme exemples la navigation aérienne, les systèmes de contrôle des réacteurs nucléaires, les systèmes de contrôle critiques des usines chimiques et la signalisation ferroviaire.
- L'arrêt du système entraînera d'importantes pertes financières : commutateurs téléphoniques, commandes d'usine, commandes de ponts et d'ascenseurs, transferts de fonds et tenue de marché, ventes et services automatisés.
Diverses techniques sont utilisées, parfois combinées, pour corriger les erreurs, qu'il s'agisse de bogues logiciels tels que les fuites de mémoire ou d'erreurs matérielles transitoires :
- Minuteur de surveillance qui réinitialise et redémarre le système sauf si le logiciel notifie périodiquement les sous-systèmes de surveillance.
- La conception avec une architecture de base informatique de confiance (TCB) garantit un environnement système hautement sécurisé et fiable
- Un hyperviseur conçu pour les systèmes embarqués assure un encapsulage sécurisé de tout composant de sous-système, empêchant ainsi un composant logiciel compromis d'interférer avec d'autres sous-systèmes ou des logiciels système privilégiés. Cet encapsulage empêche la propagation des défauts d'un sous-système à l'autre, améliorant ainsi la fiabilité. Il permet également l'arrêt et le redémarrage automatiques d'un sous-système en cas de détection d'un défaut.
- La programmation prenant en compte l'immunité peut aider les ingénieurs à produire un code plus fiable pour les systèmes embarqués. Les recommandations et les règles de codage, telles que MISRA C/C++, visent à aider les développeurs à produire un firmware fiable et portable de différentes manières : généralement en conseillant ou en interdisant les pratiques de codage susceptibles d'entraîner des erreurs d'exécution (fuites de mémoire, utilisations invalides de pointeurs), en préconisant l'utilisation de vérifications d'exécution et la gestion des exceptions (vérifications de plage/de cohérence, vérifications de division par zéro et de validité des index de tampon, cas par défaut dans les vérifications logiques), en limitant la durée des boucles, en produisant un code lisible, bien commenté et bien structuré, et en évitant les ambiguïtés du langage pouvant entraîner des incohérences ou des effets de bord induits par le compilateur (ordre d'évaluation des expressions, récursivité, certains types de macros). Ces règles peuvent souvent être utilisées conjointement avec des vérificateurs statiques de code ou la vérification de modèles limités à des fins de vérification fonctionnelle, et contribuent également à la détermination des propriétés temporelles du code .
Volume élevé vs. volume faible
Pour les systèmes à grand volume comme les téléphones mobiles , la réduction des coûts est généralement le principal critère de conception. Les ingénieurs choisissent généralement un matériel suffisamment performant pour assurer les fonctions nécessaires.
Pour les systèmes embarqués à faible volume ou prototypes, les ordinateurs à usage général peuvent être adaptés en limitant les programmes ou en remplaçant le système d'exploitation par un RTOS.
Architectures logicielles embarquées
Il existe plusieurs types d'architectures logicielles couramment utilisés.
boucle de contrôle simple
Dans cette conception, le logiciel comporte simplement une boucle qui surveille les périphériques d'entrée. Cette boucle appelle des sous-programmes , chacun gérant une partie du matériel ou du logiciel. C'est pourquoi on parle de boucle de contrôle simple ou d'entrée-sortie programmée.
Système à commande par interruption
Some embedded systems are predominantly controlled by interrupts. This means that tasks performed by the system are triggered by different kinds of events; an interrupt could be generated, for example, by a timer at a predefined interval, or by a serial port controller receiving data.
This architecture is used if event handlers need low latency, and the event handlers are short and simple. These systems run a simple task in a main loop also, but this task is not very sensitive to unexpected delays. Sometimes the interrupt handler will add longer tasks to a queue structure. Later, after the interrupt handler has finished, these tasks are executed by the main loop. This method brings the system close to a multitasking kernel with discrete processes.
Cooperative multitasking
Cooperative multitasking is very similar to the simple control loop scheme, except that the loop is hidden in an API. The programmer defines a series of tasks, and each task gets its own environment to run in. When a task is idle, it calls an idle routine, which passes control to another task.
The advantages and disadvantages are similar to those of the control loop, except that adding new software is easier, by simply writing a new task, or adding to the queue.
Preemptive multitasking or multi-threading
In this type of system, a low-level piece of code switches between tasks or threads based on a timer that invokes an interrupt. This is the level at which the system is generally considered to have an operating system kernel. Depending on how much functionality is required, it introduces more or less of the complexities associated with managing multiple tasks running conceptually in parallel.
As any code can potentially damage the data of another task (except in systems using a memory management unit) programs must be carefully designed and tested, and access to shared data must be controlled by some synchronization strategy such as message queues, semaphores or a non-blocking synchronization scheme.
Because of these complexities, it is common for organizations to use an off-the-shelf RTOS, allowing the application programmers to concentrate on device functionality rather than operating system services. The choice to include an RTOS brings in its own issues, however, as the selection must be made prior to starting the application development process. This timing forces developers to choose the embedded operating system for their device based on current requirements and so restricts future options to a large extent.
La complexité des systèmes embarqués ne cesse de croître, car les dispositifs doivent gérer des périphériques et des tâches telles que les interfaces série, USB, TCP/IP, Bluetooth , les réseaux locaux sans fil , les liaisons radio réseau, plusieurs canaux, les données et la voix, des graphismes avancés, plusieurs états, plusieurs threads, de nombreux états d'attente, etc. Ces tendances favorisent l'adoption de logiciels intermédiaires embarqués en complément des systèmes d'exploitation temps réel (RTOS).
Micronoyaux et exokernels
Un micro-noyau alloue la mémoire et répartit le processeur entre les différents threads d'exécution. Les processus en mode utilisateur implémentent les fonctions principales telles que les systèmes de fichiers, les interfaces réseau, etc.
Les exokernels communiquent efficacement par le biais d'appels de sous-programmes classiques. Le matériel et l'ensemble des logiciels du système sont accessibles et extensibles par les développeurs d'applications.
Noyaux monolithiques
Un noyau monolithique est un noyau relativement volumineux doté de fonctionnalités sophistiquées, adapté à un environnement embarqué. Il offre aux programmeurs un environnement similaire à celui d'un système d'exploitation de bureau comme Linux ou Microsoft Windows , et se révèle donc très productif pour le développement. En revanche, il requiert des ressources matérielles considérablement plus importantes, est souvent plus coûteux et, du fait de sa complexité, peut s'avérer moins prévisible et fiable.
Des exemples courants de noyaux monolithiques embarqués sont Linux embarqué , VXWorks et Windows CE .
Malgré l'augmentation du coût du matériel, ce type de système embarqué gagne en popularité, notamment sur les appareils embarqués plus puissants tels que les routeurs sans fil et les systèmes de navigation GPS .
Composants logiciels supplémentaires
Outre le système d'exploitation principal, de nombreux systèmes embarqués intègrent des composants logiciels de couche supérieure. Parmi ces composants figurent les piles de protocoles réseau ( CAN , TCP/IP , FTP , HTTP et HTTPS) et les systèmes de gestion de stockage (FAT et mémoire flash). Si le dispositif embarqué dispose de fonctionnalités audio et vidéo, les pilotes et codecs appropriés sont présents dans le système. Dans le cas des noyaux monolithiques, plusieurs de ces couches logicielles peuvent être intégrées au noyau. Pour les systèmes d'exploitation temps réel (RTOS), la disponibilité de composants logiciels supplémentaires dépend de l'offre commerciale.
Architectures spécifiques à un domaine
Dans le secteur automobile, AUTOSAR est une architecture standard pour les logiciels embarqués.