Un système d'exploitation embarqué est un système d'exploitation pouvant être installé sur un système embarqué. Ce système d'exploitation est conçu avec des spécificités à gérer afin de répondre à des besoins spécifiques au type de système embarqué.
Un système d'exploitation est un programme qui gère le matériel. Il sert d'intermédiaire entre l'application logicielle et le matériel informatique (périphériques, capteurs, moteurs...)[1]. La diversité des systèmes d'exploitation disponibles offre des constructions et propriétés particulières qui permettent de répondre à des objectifs très variés[2]. À part pour les tâches très simples (l'ordonnancement, la commutation de tâches, entrées/sorties, ...), une application embarquée à besoin d'un système d'exploitation adapté répondant aux contraintes pour être installée sur le système embarqué (espace mémoire par exemple). Le système d'exploitation doit aussi disposer des fonctionnalités requises pour la tâche qu'il aura à exécuter[3]. Les systèmes d'exploitation pour PC sont conçus avec une interface homme-machine particulière (écran-clavier-souris). Dans le cadre d'un système d'exploitation embarqué, l'interface homme-machine pour pouvoir interagir avec peut être spécifique (clavier à digicode, écrans de smartphones...), voire inexistante (cartes de crédit, cartes sim, ...), auquel cas on utilise une machine intermédiaire (bornes, téléphones[4]). Étant la plupart du temps hors de portée humaine, un système d'exploitation embarqué doit avoir un niveau de robustesse bien au-dessus des exigences d'un système d'exploitation de bureau[5]. Les systèmes d'exploitation embarqués nécessitent une très grande fiabilité, ainsi que de bonnes performances[6].
Les systèmes embarqués sont utilisés dans des domaines très variés tels que la téléphonie mobile, l’électroménager, les équipements médicaux, l’aéronautique, l’automobile, les bornes automatiques, etc. Mise à part peut être l’horloge système, les fonctionnalités du système d’exploitation sur lesquels ils vont s'appuyer seront hétérogènes. Et avec un parc d'appareils qui est tout aussi hétérogène, ces dispositifs ne supportent pas toutes les variantes des systèmes d'exploitation existants[7]. Étant dans un système contraint, le système d'exploitation doit répondre aux besoins de l'appareil. L'adaptation se fait donc en trouvant le bon compromis entre taille et performances pour optimiser le système d'exploitation. Les systèmes d'exploitation privilégiés sont donc ceux avec seulement les pilotes de périphériques requis[8].
Des systèmes embarqués peuvent avoir des contraintes d'ordre temporel. Pour supporter ces contraintes, il existe des systèmes d'exploitation temps réel qui fournissent des services et des primitives qui peuvent garantir les délais d’exécution souhaités.
Pour qu'un OS soit un RTOS[note 1] il doit répondre à 4 exigences[9] :
Un système embarqué n'a pas systématiquement besoin d'un système de fichier. Un capteur en réseaux récupère des informations et les transmet aussitôt sur le réseau. La carte bancaire ou un badge d’accès sont des contre-exemples, car ils doivent avoir en mémoire des données utilisateur. Le système de fichiers peut être intégré au système d'exploitation, permettant aux applications de lire et d'écrire des fichiers sur un espace de mémoire non volatile du système physique[10].
Ci-dessous, une liste d’exigences typiques de sécurité que l'on retrouve sur des systèmes embarqués qu'un OS peut fournir[11] :
Pour les développeurs, il est souhaitable que l'appareil dispose d'APIs pour faciliter le développement de l'application.
La machine virtuelle Java inclut des interfaces et d'autres bibliothèques natives qui lui permettent d'être facilement intégrée à un RTOS. Écrite en C, la machine virtuelle Java est compilée avec le RTOS et interprète les bytes-codes Java pour que l'application s'exécute[12]. Grâce à cela, l’appareil peut interpréter du byte-code Java et profiter des APIs disponibles (exemple: java.net pour les fonctionnalités tcp/ip, java.io pour les entrées/sorties, ...).
Un système embarqué peut avoir à communiquer avec un ou plusieurs autres systèmes (lorsqu'il s'agit de systèmes embarqués travaillant de manière collaborative) ou périphériques. Pour ces cas là, le système d'exploitation peut fournir les primitives pour établir une communication en fonction du medium utilisé[13] :
L'atout majeur de la virtualisation est la garantie que deux applications concurrentes sur un même système n’interfèrent pas entre elles. Utiliser la virtualisation permet d'imposer dans chaque machine virtuelle des limitations d’accès aux ressources et périphériques en fonction des besoins de l'application[14].
L’intérêt de la virtualisation est aussi de faire cohabiter deux systèmes d'exploitation différents (temps-réel inclus) sur le même processeur et fournissant donc à chaque processus les spécifications requises à l’exécution de leur tâche[14].
La virtualisation permet aussi d’apporter un niveau de sécurité pour éviter des dommages inter-processus. Chaque processus étant lancé par une machine virtuelle distincte, si l'un d'entre eux rencontre un problème, il n'aura aucun impact sur les autres processus en cours sur d'autres machines virtuelles[14].
Pour des systèmes embarqués autonomes en énergie, il est judicieux de choisir un système d'exploitation permettant de limiter la consommation énergétique. Pour limiter la consommation, il y a des techniques matérielles (choix des composants, circuits reconfigurables), logicielles (optimisation du code, utilisation d'instructions spécifiques) et hybrides (mise en veille des périphériques non utilisés). Le système d'exploitation peut seulement agir sur les solutions hybrides et logicielles[15].
Les contraintes de choix et d'utilisation d'un système d'exploitation pour un système embarqué dépendent du domaine d'application dans lequel se retrouvera le système. De nos objets du quotidien (Smartphone, Électroménager...) jusqu'aux systèmes de contrôle d'un avion ou Curiosity, sans oublier les équipements médicaux, de télécommunication (Satellite, antenne relais...) et militaire (drone, système de guidage de missiles...), les domaines d'application sont larges et étendus, et leurs objectifs divers[2].
Les domaines d'application qui vont suivre vont mettre en situation les spécificités énoncées plus tôt.
Pour satisfaire de grandes contraintes temps-réel, les algorithmes de systèmes de contrôle d'avions sont exécutés sur des systèmes d'exploitation temps réel[16]. Cette nécessité vient du grand nombre de capteurs présents sur l’appareil et d'élément contrôlable.
Dans le domaine de l'automobile, les systèmes embarqués ont commencé à prendre place depuis que des équipements d'aide à la conduite sont intégrés dans nos véhicules (ABS, ESP, ...), mais aussi pour commander les éléments du véhicule (phares, essuie-glaces, vitres, verrouillage des portes, outils de navigation, ...). Pour cela, les constructeurs automobiles se tournent vers des systèmes d'exploitation temps-réel afin de centraliser la gestion de tous les éléments électroniques et pouvoir gérer la priorité des tâches (pour pouvoir privilégier le traitement des éléments de sécurité avant ceux de confort). Le système d'exploitation choisi doit aussi pouvoir communiquer avec les éléments électroniques du véhicule par bus de données[17].
Un exemple d'utilisation dans le domaine automobile, est Windows Embedded Automotive (en) sur lequel s’appuie la technologie Ford Sync (en)[18].
Des partenariats entre les constructeurs automobiles et des sociétés privées sont en cours pour que des systèmes d'exploitation plus connus du grand public soient utilisés dans les voitures. C'est le cas d'Apple avec iOS in the Car (en). Et le projet Open Automotive Alliance[19] de Google.
Des regroupements de constructeurs existent avec pour but d'avoir un RTOS commun comme AUTOSAR , OSEK/VDX.
Les contraintes liées au développement robotique sont les interactions avec les périphériques (capteurs, webcam, moteurs pas à pas...). Pour exemple, RoBIOS est un système d'exploitation destiné au développement robotique et a dans son code binaire une large bibliothèque de fonctions systèmes et des pilotes de périphériques pour contrôler et accéder à tous les types de matériel[20].
Le travail du système d'exploitation est de gérer l'allocation des ressources de manière ordonnée et contrôlée. Le programmeur peut utiliser des appels systèmes pour accéder aux services que fournit le système d'exploitation[21].
Les réseaux de capteurs ayant de plus en plus de données à collecter, traiter et transmettre, les contraintes font que le système d'exploitation doit être multi-threadé pour répondre aux besoins. En entrelaçant les tâches complexes et sensibles, le système peut atténuer le problème producteur-consommateur[22].
Système d'exploitation | Architecture | Modèle de programmation | Ordonnancement | Gestion et protection de la mémoire | Protocole de communication supporté | Partage de ressources | Supporte les applications temps-réel |
---|---|---|---|---|---|---|---|
TinyOS | Monolithique. | Programmation événementielle. | FIFO. | Gestion de la mémoire statique avec protection de la mémoire. | Active Message. | Virtualisation et achèvement des événements. | Non. |
Contiki | Modulaire. | Protothreads et événementielle. | Le code s’exécute quand l'événement associé se déclenche. Ordonnancement par priorité WRT(Worst Response Time). | Gestion et liaison dynamique de la mémoire. Pas de protection de l'espace d'adressage du processus. | uIP and Rime. | Accès aux données sérialisé. | Non. |
MANTIS | Modulaire. | Threads. | Cinq niveaux de priorités avec chacun plusieurs niveaux de priorités internes. | Gestion dynamique de la mémoire possible (mais pas encouragé). Pas de protection de la mémoire. | Active Message. | Mémoire partagée avec des sémaphores. | Dans une certaine mesure au niveau de l'ordonnancement des processus (mise en œuvre de la planification de priorités au sein de différents types de processus). |
Nano-RK | Monolithique. | Threads. | Rate-monotonic scheduling (RMS). | Gestion statique de la mémoire. Pas de protection de la mémoire. | Abstraction par socket. | Un accès sérialisé par les mutex et les sémaphores. Fournit une implémentation de l'algorithme Priority Ceiling Algorithm pour éviter les inversions de priorité. | Oui. |
LiteOS | Modulaire. | Threads et événementielle. | Priorité basée sur le modèle Round-robin. | Gestion de la mémoire dynamique et fournit une protection de la mémoire des processus. | Communication par fichiers. | Via des primitives de synchronisation. | Non. |
Les systèmes d'exploitation pour carte à puce sont dépourvus d'interface utilisateur, du moins, ces interfaces sont limitées (borne, capteur...). La principale spécificité requise sur une carte à puce est la sécurité ; une autre contrainte est le faible espace de stockage mémoire offert pour accueillir le système d'exploitation et les données qui seront y sont mémorisées[23].
Un système d'exploitation pour carte à puce est construit pour offrir un ensemble de services pour la gestion des données, le contrôle d'accès, et les services cryptographiques. Les fonctions de base d'un système d'exploitation qui sont communes à tous les types de cartes à puce sont[24] :
Les smartphones sont des appareils ayant les capacités d'un micro-ordinateur. Avec un nombre de smartphones grandissant de jour en jour, la qualité du système d'exploitation doit être de mise afin de pouvoir exécuter un même programme sur différents modèles de smartphones. Le système d'exploitation détermine les caractéristiques, la performance, la sécurité et les add-ons des applications d'un smartphone[25]. Le système d'exploitation doit gérer une interface homme-machine intuitive et réactive pour que l'utilisateur puisse exécuter ses applications[1] ; il doit aussi contribuer à minimiser la consommation d'énergie du smartphone.
: document utilisé comme source pour la rédaction de cet article.