# Système d'exploitation embarqué

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é.

## Définition

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...). 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. À 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. 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). É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. Les systèmes d'exploitation embarqués nécessitent une très grande fiabilité, ainsi que de bonnes performances.

## Spécificités

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. É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.

### Temps-réel

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 il doit répondre à 4 exigences :

#### Le comportement de synchronisation du système d'exploitation doit être prévisible.

    Le système d'exploitation doit garantir de pouvoir terminer chaque service en cours d’exécution dans un temps maximal fixé. L’ordonnancement est donc déterministe pour une gestion optimale des tâches.

#### Le système d'exploitation doit gérer l'ordonnancement des tâches.

    L'ordonnancement peut être événementiel (on parle aussi d'ordonnancement par priorité) : l'ordonnanceur ne change de tâche que lorsqu'un événement de plus haute priorité a besoin de service.
    Il peut être aussi par partage de tâches : L'ordonnanceur change de tâche aux interruptions de l'horloge, ce qui le rend plus multi-tâches dans le sens où les tâches ne s’exécutent plus une à une aux yeux de l'utilisateur.

#### Le système d'exploitation doit gérer le temps afin d'ordonnancer au mieux les tâches en fonction de leur délai.

    Cette gestion est obligatoire si le traitement interne est lié à un temps absolu dans l'environnement physique. La synchronisation d'horloge globale est effectuée (au choix) via 2 standards : UTC ou TAI. Si le système est utilisé dans un réseau, il est régulièrement synchronisé pour que tous les systèmes soient coordonnés.

#### Le système d'exploitation doit être rapide. Un système d'exploitation répondant à toutes les exigences mentionnées jusqu'ici serait inutile s'il était très lent.
### Système de fichiers

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.

### Sécurité

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 :

#### Identification de l'utilisateur

    Processus de validation de l'utilisateur avant de lui donner accès au système. Le système en question peut être physique (ouverture de porte par badge d’accès) ou informatique (compte et mot de passe avant de pouvoir interagir avec le logiciel).

#### Connexion réseau sécurisé

    Fournit une connexion réseau uniquement si l'appareil est autorisé. Permet en cas d'intrusion de limiter son impact sur le réseau et les systèmes reliés. Dans le cas des réseaux de capteurs sans-fil, cela réduit les chances qu'un faux capteur s'y introduise pour récupérer les données récoltées.

#### Communication sécurisée

    Inclut l’authentification des entités communicantes, qui assure la confidentialité et l'intégrité des données transmises et protège l'identité des entités communicantes. Deux automates qui souhaitent se synchroniser s’authentifieront mutuellement puis échangeront leurs informations en assurant la confidentialité et l'intégrité par un moyen cryptographique.

#### Stockage sécurisé

    Confidentialité et intégrité des données stockées sur le système.

#### Sécurité du contenu

    Restriction d'utilisation du contenu numérique en lecture et écriture sur le système. En sécurisant le contenu, il assure un niveau de sécurité tout au long de l'utilisation de ce système.

#### Disponibilité

    Le système doit pouvoir exécuter sa(ses) fonction(s) dans tous les cas. L'ABS d'une automobile en est un bon exemple, il doit pouvoir être disponible à chaque fois qu'on l’interroge afin d'assurer la sécurité de ses occupants.

### API/bibliothèque

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. 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, ...).

### Communication

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é :
* Réseau: utilisé pour des communications sur un réseau Ethernet(TCP, UDP, SMTP, DataSocket)
* Mémoire partagée
* Communication sans-fil IrDA: pour des échanges de données via Infrarouge
* Communication par Bus: utilise des ports destinés à des bus de communication (Série, CAN)
* Fibre optique.

### Virtualisation

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.
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.
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.

### Consommation énergétique

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.

## Domaines d'application

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.
Les domaines d'application qui vont suivre vont mettre en situation les spécificités énoncées plus tôt.

### Aéronautique et Aérospatial

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. Cette nécessité vient du grand nombre de capteurs présents sur l’appareil et d'élément contrôlable.

### Automobile

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.
Un exemple d'utilisation dans le domaine automobile, est Windows Embedded Automotive (en) sur lequel s’appuie la technologie Ford Sync (en).
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 de Google.
Des regroupements de constructeurs existent avec pour but d'avoir un RTOS commun comme AUTOSAR , OSEK/VDX.

### Robotique

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.

### Réseau de capteurs

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.
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.
Tableau comparatif des OS dédiés aux réseaux de capteurs :
| 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. |

### Cartes à puce

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.
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 :
* Gestion des échanges entre la carte et le monde extérieur, principalement en termes de protocole d'échange.
* Gestion des fichiers et des données stockées dans la mémoire.
* Contrôle d'accès à l'information et aux fonctions.
* Gestion de la sécurité de la carte et des procédures d'algorithmes cryptographiques.
* Garantie de fiabilité, notamment en termes de cohérence des données.

### Mobile

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. 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 ; il doit aussi contribuer à minimiser la consommation d'énergie du smartphone.