Systèmes embarqués temps réel partie 1

Déf. Wikipedia

Un système embarqué est défini comme :

  • un système électronique et informatique autonome,
  • souvent temps réel,
  • spécialisé dans une tâche précise.

En Anglais : Embedded System

Ses ressources sont généralement :

  • limitées spatialement (encombrement réduit)
  • énergétiquement (consommation restreinte).

La distinction entre un système type PC et un système embarqué se fera essentiellement au niveau de la spécialisation dans une tâche précise:

  • un smartphone est plutôt considéré comme un PC, la fonction téléphone est une parmi les applications possibles
  • un automate Beckhoff, basé sur une architecture PC avec Win10 est considéré comme un système embarqué, prévu pour piloter une machine spécifique, le kernel Windows est préempté par le Runtime pour assurer les contraintes temporelles.
Embedded Systems vs Computer

Les systèmes embarqués sont omniprésents :

  • grand public : robot ménager, four, drone …
  • médical : défibrillateur, pompe à insuline, pacemaker, …
  • industriel : automate, camera industrielle, calculateur abs, …
  • IoT : capteur d’analyse de vibrations connecté Cloud, mesure d’énergie connectée Cloud, …

Le temps réel n’englobe pas la notion de vitesse mais garantit l’exécution d’une tâche à temps. La réaction du système est prévisible quel que soit sa charge processeur, les interruptions à traiter, …

Un système est qualifié de temps-réel lorsque son exactitude logique est conditionnée par :

  • L’exactitude temporelle (établissement des sorties)
  • L’exactitude des résultats (valeur des sorties)
Realtime

L’échéance (deadline) fixe le délai maximal alloué au système temps-réel pour obtenir le résultat après un événement.

Question : que se passe-t-il si le temps de réponse dépasse l’échéance ?

  • cela dépend de la classification de la contraite temps réel. cf ci-dessous

Le degré de tolérance au non respect de l’échéance caractérise le système :

  • Hard Real Time : la réponse du système dans le temps imparti est vitale. L’absence de réponse est catastrophique et entraîne la faute du système. Exemples : système de conduite de missiles, airbag d’une voiture, …
  • Firm Real Time : quelques échéances manquées sporadiquement sont tolérées. Exemple : décodage stream vidéo.
  • Soft Real Time : un degré de tolérance concernant le respect des échéances est admis. La réponse du système après les délais réduit progressivement son intérêt. Exemple : mise à jour des places disponibles sur système de réservation de train.
  • Les capteurs vont mesurer les paramètres d’environnement
  • Le système de contrôle traite les informations des capteurs et de l’IHM pour génèrer les consignes de pilotage des actionneurs
  • un bus de communication permet la supervision ou le pilotage à distance
Realtime

Faisons une analyse rapide pour un drone.

L’environnement est aérien, pouvons être soumis à des turbulences, des obstacles, des pertes de connectivités, etc. Les périphériques et l’environnement du système évoluent simultanément (en parallèle ou concurrence), la gravité agit toujours ;)

Drone dji
Capteurs Actionneurs IHM Réseau
gyroscopes moteurs brushless boutons télémétrie wifi
accélèromètre servo-moteur voyants lumineux état de marche pilotage RF
gps smartphone
magnétomètre
encodeur de position moteurs
camera
lidar

Le système se décompose en plusieurs activités (tâches) qui doivent souvent être exécutées en parallèle :

  • mesure d’orientation angulaire
  • mesure d’altitude
  • génération de signaux PWM pour les moteurs

Il faut être capable de prouver/démontrer/vérifier qu’un système temps réel va obéir au contraintes temps-réel telles que définies lors de la phase de spécification.

Eléments pris en compte :

  • Identification des échéances à temps-réel hard/soft
  • Charge du processeur
  • Temps de traitement de chaque tâche
  • Méthode d’ordonnancement des tâches
  • Méthode «Worst Case ExecutionTime (WCET) »

La maîtrise du déterminisme permet de garantir la prévisibilité du système.

Difficultés :

  • Mise en oeuvre dans un environnement non déterministe
    • Evénements asynchrones : interruptions
  • Non déterminisme lié au système
    • Mécanismes destinés à l’amélioration globale des performances de l’architecture matérielle (mémoire cache, prédiction de branchement, . . . )
    • Pannes matérielles

L’application s’exécutant sur le processeur est structurée en tâches (task)

  • Une tâche effectue un ensemble d’opérations destinées à fournir un service à l’application.
  • Une tâche constitue une unité élémentaire de traitement

La suite d’instructions composant une tâche est exécutée séquentiellement par le processeur

  • Tâche implémentée sous forme de routine

Reprenons l’exemple du drone et concentrons nous sur l’application permettant d’assurer un vol stationnaire :

Tâches associées aux E/S Tâches assurant des traitements internes
lecture des gyroscopes calcul des positions angulaire en fonction des données gyroscopes
lecture baromètre calcul de l’altitude en fonction de la valeur du baromètre
lecture boussole enregistrement de la position et des paramètres dans la carte SD
pilotage pwm des moteurs cryptage de la communication
transmission des données en Wifi

Il s’agit de la méthode classique de programmation d’un microcontrôleur. Les tâches sont exécutées les unes à la suite des autres. Certaines tâches de niveau de priorité plus importantes génèrent une interruption qui permet de préempter la tâche en cours. Quand la routine d’interruption est traitée, on sort de l’ISR pour reprendre la tâche interrompue.

Super Loop ISR
Avantages
  • Bonne prévisibilité :
    • Absence de mécanismes de synchronisation inter-tâches
    • Validation relativement aisée
  • L’ordonnancement ne consomme pas de ressources processeur
  • Surdimensionnement minimal : le WCET détermine directement la période du cycle
Inconvénients
  • Très peu flexible
  • La complexité augmente fortement avec le nombre de tâches et leurs interdépendances

-> La Super Loop est à mettre en œuvre dans des systèmes simples, gérant peu de tâches.

Un drone est un système complexe avec de nombreuses tâches qui doîvent partager les ressources matérielles, s’assurer de l’échange des mesures, respecter les contraintes temporelles pour que l’asservissement des commandes de vol reste fonctionnel etc.

Dans cette section, nous allons introduire la notion de système d’exploitation (OS) et analyser les différences entre :

  • GPOS : General Purpose OS
  • RTOS : Real Time OS
  • Bare Metal : système sans OS

Un système d’exploitation (Operating System ou OS en anglais) est un programme réalisant les fonctions élémentaires suivantes :

  • Le découpage en tâches d’une application
  • Ordonnancement (Scheduling) des tâches à exécuter et l’allocation d’un temps processeur à ces différentes tâches.
  • Protection de l’intégrité des données stockées et exécutées (en mémoire, sur les unités de stockage)
  • Gestion des ressources physiques de l’ordinateur (temps cpu, mémoire, périphériques)
  • Assurer un niveau d’abstraction du matériel pour l’utilisateur

Le Scheduler (Ordonnanceur) d’un General Purpose Operating System (GPOS) va optimiser l’exécution des tâches de manière à apporter le maximum de confort à l’utilisateur. Ce type d’ordonnancement ne permet pas de garantir l’exécution dans les délais d’une tâche parmi d’autres et ne sont pas adapté aux système embarqués temps réel.

Dans la famille des GPOS, on trouve Windows, Linux, macOS, Android, iOS.

GPOS

On retrouve fréquement Linux dans l’embarqué :

  • Raspberry Pi,
  • Jetson Nano,
  • Odroid,

Linux est compatible avec de nombreuses architectures matérielles et apporte un excellent support matériel, mais Linux reste de base un GPOS en ce qui concerne les contraintes temps réel. On peut améliorer les choses avec le patch PREEMPT_RT, ou alors, avec le co-noyau Xenomai.

Un système d’exploitation en temps réel (RTOS) est un système d’exploitation qui permet la prévisibilité / le déterminisme du temps d’exécution d’une tâche plutôt que l’optimisation globale comme pour un GPOS. Un RTOS autorise la préemption d’une tâche en cours pour exécuter une tâche de niveau de priorité plus élevé.

RTOS

Il existe de nombreux RTOS, certains sont certifiés pour des applications critiques (aviation, médical), d’autres spécialisés pour l’IoT, …

  • Open Source : FreeRTOS, Zephyr Project, …
  • Payant : Azure RTOS, VxWorks, QNX, …
Liste de RTOS

On parle de programmation Bare metal lorsqu’on programme un microcontrôleur sans OS. Les RTOS sont prévus pour fonctionner sur des microcontrôleurs avec de faibles ressources matériel (RAM, Flash), néanmoins ils restent plus à l’aise sur des architectures 32 bits que sur les microntrôleurs 8 bits comme les PIC16F. Un RTOS consomme de la ressource, et sur un processeur 8 bits qui en possède très peu, il est plus efficace de rester en programmation bare metal avec une Super Loop.

Passons en revue les avantages et inconvénients de l’utilisation d’un RTOS:

Bénefices
  • garantie les performances temps réel
  • facilite le développement et peut réduire les coûts
  • facilite l’ajout de nouvelles fonctionnalités
  • simplifie la portabilité de l’application
  • simplifie les certifications de sécurité
Coûts
  • engendre des coûts (achat de Licence, coût de formation)
  • consomme de la mémoire et des cycles processeurs
  • peut être “Overkill” pour l’application développée

En programmation Bare Metal, quand les contraintes se multiplient, il est possible de se retrouver à programmer les mécanismes d’un RTOS au risque de réinventer la roue et d’avoir des perfomances moindres. La question du passage vers un RTOS se pose alors.

Selon la dernière enquête UBM Embedded Developer, publiée en avril 2019, plus de 59 % des les projets nécessitent des capacités temps réel, plus d’un tiers utilisent une interface graphique et, par conséquent, plus de 67 % déclarent utiliser un RTOS ou scheduler de quelque sorte. Parmi les 33 % restants qui n’utilisaient pas de RTOS, la principale raison de ne pas en utiliser un (86 %) était que l’application n’en « avait pas besoin ». Parmi ceux qui ont choisi un RTOS commercial, 45 % ont cité en raison n° 1, la “capacité en temps réel”.

Les RTOS sont bien adaptés aux architectures 32 bits des microcontrôleurs STM32 (ST) ou ESP32 (Espressif) qui possèdent suffisamment de RAM pour exécuter en plus du RTOS, les tâches applicatives.

Super Loop to RTOS

Avec la migration continue vers les microprocesseurs 32 bits et les milliards de nouveaux appareils IoT qui arrivent sur le marché dans les années à venir, il existe de solides arguments en faveur de l’utilisation d’un RTOS.

Le RTOS est un logiciel système qui fournit des services et gère les ressources du processeur pour applications. Ces ressources incluent :

  • les cycles du processeur,
  • la mémoire,
  • les périphériques
  • les interruptions.

Le RTOS doit être capable d’assurer un fonctionnement en continu pendant des mois ou des années. Il expose une interface permettant le développement d’applications (API : Application Programming Interface), doit posséder une faible empreinte mémoire et favoriser la portabilité du code entre différentes architectures de processeurs.

Le but principal d’un RTOS est d’allouer le temps de traitement entre diverses tâches que le logiciel embarqué doit effectuer. Cela implique généralement une division du logiciel en morceaux, communément appelés « tasks » (tâches) ou « threads ».

Le RTOS contrôle l’exécution des threads et la gestion associée de chaque thread : le contexte. Chaque thread se voit attribuer une priorité, pour contrôler quel thread doit s’exécuter si plus d’un est prêt à fonctionner (c’est-à-dire : non bloqué). Lorsqu’un thread de priorité supérieure (par rapport au thread en cours d’exécution) doit s’exécuter, le RTOS enregistre le contexte du thread en cours d’exécution dans la mémoire et restaure le contexte du nouveau thread. Le processus d’échange de contexte de threads est appelé commutation de contexte.

RTOS

Il est important de noter qu’un RTOS doit offrir une préemption. La préemption est l’action de passer instantanément et de manière transparente à un thread de priorité supérieure, sans avoir à attendre l’achèvement du thread de priorité inférieure. En plus de l’allocation du processeur, un bon RTOS fournit une communication supplémentaire, une synchronisation, et les services d’allocation de mémoire.

Les opérations d’un RTOS sont éffectuées par le KERNEL (noyau)

D’autres services peuvent éventuellement être fournis :

  • Couches de communication (TCP/IP)
  • Graphical User Interface (GUI)
  • Pilotes de périphériques
  • Gestion de système de fichiers
RTOS

Dans les systèmes embarqués, une couche supplémentaire peut exister, le board support package(BSP) contient le micrologiciel de démarrage spécifique au matériel, les pilotes de périphérique et d’autres routines qui permettent à un système d’exploitation embarqué donné, de fonctionner dans un environnement matériel donné (carte mère):

  • Initialise la carte mère (horloges, registres processeur)
  • Initialise la RAM
  • Charge et lance l’OS depuis la flash
Ordonnanceur Objets du noyau Services
Elément principal du noyau. Implémente l’algorithme d’ordonnancement qui détermine quelle tâche obtient les ressources du processeur. On parle en anglais de Scheduler. Accessibles au programmeur pour le développement d’applications. Exemple d’objets : tâche, mutex, sémaphore (objet de synchronisation), file de messages. Opérations effectuées par le noyau; par exemple : gestion de la mémoire, traitement des interruptions, gestion du temps (cycles, délais, etc.)

Assure l’exécution d’entités ordonnançables

  • Par définition, les entités ordonnançables sont concurrentes : elles entrent en compétition pour obtenir du temps processeur.
  • Une tâche est une entité ordonnançable

La faculté, pour un noyau, de pouvoir gérer plusieurs tâches devant s’exécuter simultanément est exprimée par le terme multitâche

  • La simultanéité d’exécution (sur un système monoprocesseur) n’est qu’apparente. L’ordonnanceur donne la main à chaque tâche de façon séquentielle
  • L’ordonnanceur doit exécuter la bonne tâche au bon moment

L’ordonnanceur détermine quelle tâche doit s’arrêter afin de donner les ressources processeur à une autre tâche.

La commutation de contexte

Le contexte de la tâche arrêtée doit être sauvegardé, celui de la tâche devant s’exécuter doit être restauré.

  • Le contexte inclut généralement ces informations :
    • Le contenu des registres du processeur
    • La valeur du compteur de programme et du pointeur de pile
  • Le module de l’ordonnanceur assurant la commutation du contexte est le répartiteur (dispatcher)

La commutation de contexte, si elle se produit trop fréquemment, peut consommer une part non négligeable du temps processeur.

Il existe différentes stratégies d’ordonnancement :

  • préemptif avec priorités
  • round-robin avec priorités
Ordonnancement préemptif avec priorités

Un niveau de priorité est affecté à chaque tâche

  • Suivant le type d’ordonnanceur, la priorité peut être attribuée par le développeur (priorité statique) ou par l’ordonnanceur en cours d’exécution (priorité dynamique)

Plusieurs tâches peuvent avoir la même priorité

La tâche de plus haute priorité obtient toujours le temps processeur

  • Lorsqu’une tâche de plus haute priorité est prête à s’exécuter, la tâche en cours d’exécution est préemptée :
  • L’exécution de la tâche est interrompue puis l’ordonnanceur donne la main à une autre tâche par commutation de contexte

Une tâche ne peut pas être préemptée par une tâche de priorité identique ou inférieure

Ordonnancement round-robin avec priorités

La tâche de plus haute priorité prête à s’exécuter obtient toujours le temps processeur

  • Les tâches de même priorité sont ordonnancées suivant la méthode du tourniquet (« round-robin ») :
  • La durée d’exécution continue d’une tâche est au maximum la valeur du quantum (time quantum ou time slice)
  • Lorsque la durée du quantum est atteinte, la tâche est préemptée pour donner la main à une tâche de même priorité

Les tâches de même priorité obtiennent ainsi un temps processeur équitable

Logo Free RTOS

http://www.freertos.org

Système d’exploitation temps-réel, faible empreinte, portable et préemptif dont le code source est ouvert, sous licence MIT

  • Versions commerciales :
    • OpenRTOS™ : ajout de services (pile TCP/IP, gestion USB, …)
    • SafeRTOS™ : version certifiée pour utilisation dans des applications critiques (dans le domaine médical par ex.)

En 2017, Amazon fait l’acquisition de l’équipe et développe une version spécifique de FreeRTOS, Amazon FreeRTOS incluant les librairies facilitant l’intégration au Cloud Amazon AWS.

Il s’agit d’un système minimaliste, l’image binaire du noyau fait entre 4 Ko et 9 Ko ce qui le rend principalement destiné à être utilisé avec des microcontrôleurs ayant des performances modestes et une quantité mémoire limitée (32 – 256 Ko de Flash)

FreeRTOS implémente les composants noyau de base :

  • Ordonnanceur / répartiteur
  • Objets noyaux : tâches, objets de synchronisation et de communication
  • Services : gestion des interruptions et de la mémoire
  • API spécifique, non standardisée

FreeRTOS utilise un ordonnancement « round-robin » avec priorités

  • Les priorités sont définies de manière statique au moment de la conception
  • Le nombre de niveaux de priorités supportés est configurable
  • La valeur du quantum (Tick) est configurable
RTOS

Les ISR sont des sections de code exécutées par le micro-contrôleur et non par FreeRTOS. Ce qui amène à des comportements inattendus du noyau. Pour cette raison, il est nécessaire de réduire au maximum le temps d’exécution d’une ISR. FreeRTOS fournit des méthodes servant à la gestion des interruptions et peut également lancer des interruptions par appel à une instruction matérielle.

La structure minimale du code source de FreeRTOS est contenue dans deux fichiers C qui sont communs à l’ensemble des portages de FreeRTOS (port sur une autre architecture processeur). Ces deux fichiers sont

  • tasks.c : scheduler, traitement des tâches, …
  • list.c : liste de tâches ayant les propriétés ready, les mêmes niveau de priorité, …

En plus de ces deux fichiers, nous pouvons associer :

  • queue.c : permet les services de queues et de semaphore (quasiment toujours nécessaires)
  • timers.c : permet la fonctionnalité de timer software. A utiliser uniquement si l’utilisation de timers softwares sont nécessaires.
  • event_groups.c : procure la fonctionnalité d’évenements de groupe. A utiliser uniquement si l’utilisation des évenements de groupes sont nécessaires
  • croutine.c implémente la fonctionnalité de co-routine pour FreeRTOS. Prévu au départ pour les microcontroleurs à très faibles capacités, son utilisation n’est plus d’actualité.