Aller au contenu

Les systèmes embarqués temps-réel

Introduction

Les microcontrôleurs sont aujourd’hui utilisés à des fins très diverses et leur utilisation s’étend du four à micro-ondes à la montre connectée en passant par toutes sortes de véhicules. Dans de nombreux cas, les micro-contrôleurs et leur logiciel associé doivent pouvoir répondre à des événements internes ou externes le plus rapidement possible. Dans ce cas, ces systèmes deviennent des systèmes temps-réel. Ces systèmes doivent respecter des contraintes temporelles plus ou moins strictes en fonction de l’utilisation. Par exemple, un système pilotant le mécanisme d’injection dans un moteur devra respecter des contraintes temporelles beaucoup plus strictes qu’un système pilotant le système de refroidissement d’un frigo.

Les systèmes temps-réel sont des systèmes qui doivent respecter certaines contraintes temporelles et assurer que certaines tâches soient accomplies dans les limites de temps définies. Ces systèmes sont souvent catégorisés en

  • systèmes hard real-time qui doivent garantir que les tâches critiques sont toujours exécutées dans les limites de temps imparties. Pour ces systèmes, ne pas respecter une limite de temps équivaut à une erreur qui peut avoir un effet catastrophique. On peut citer les systèmes de contrôle de moteur par exemple. Ces systèmes sont souvent réalisés à l’aide d’architecture et de processeur spécialisés, qui souvent combinent la redondance, comme par exemple les systèmes réalisant l’architecture Cortex-R.
  • systèmes soft real-time qui respectent les limites de temps la plupart du temps et au mieux des possibilités. Ces systèmes autorisent le fait qu’une limite de temps ne soit pas respectée sans pour autant produire une erreur catastrophique. Les systèmes que nous développerons dans ce cours appartiennent évidemment à cette catégorie.

Les systèmes d’exploitation temps-réel

Les systèmes d’exploitation pour les systèmes temps-réel (Real-Time Operating Systems ou RTOS) doivent donc permettre le développement d’applications:

  • qui ont un comportement déterministe et prédictible.
  • qui peuvent répondre à des événements extérieurs rapidement et de manière prédictible.
  • qui sont fiables et s’exécutent sans erreur sur de très longues périodes.
  • qui peuvent récupérer d’erreurs non fatales.

La caractéristique commune de tous ces systèmes est qu’ils doivent accomplir un certain nombre de tâches de manière plus ou moins concurrente. Ces tâches peuvent être essentiellement:

  • périodiques: dans ce cas, elles sont exécutées à intervalle régulier et sont caractérisées essentiellement par leur période ou fréquence, ainsi que le temps d’exécution de la tâche.
  • apériodiques ou événementielles: dans ce cas, le moment auquel la tâche doit être effectuée dépend d’événements extérieurs et ne peut pas être prédit.

Un exemple simple de programme mêlant les tâches périodiques et apériodiques est celui d’un programme devant faire clignoter une LED à intervalle régulier et devant dans le même temps réagir à la pression d’un bouton par l’utilisateur. Comme nous l’avons déjà constaté dans les exemples, il est bien sûr possible de vérifier à intervalle régulier si le bouton est pressé (par polling) et ainsi de réaliser toutes les tâches de manière périodique. Cette approche devient toutefois difficilement réalisable avec des systèmes plus complexes et, dans ces cas, une approche multi-tâches devient nécessaire.

Le concept multi-tâches signifie que plusieurs tâches composant un seul programme peuvent être exécutées de manière concurrente sur le même CPU. Bien sûr, un vrai parallélisme ne peut pas être réalisé sur un système ne comprenant qu’un seul cœur d’exécution (comme la cible utilisée et tous les processeurs Cortex-M). Dans ce cas, le temps de CPU doit être partagé entre les différentes tâches, ce qui nécessite de mettre en œuvre un mécanisme d’ordonnancement des tâches (task scheduling) plus ou moins complexes.

Dans ce chapitre, nous présentons les caractéristiques principales des systèmes d’exploitation temps-réel. Nous commençons tout d’abord par présenter les besoins liés à l’utilisation d’un RTOS et illustrons les avantages d’une approche de programmation haut-niveau par rapport à une approche bas-niveau. Nous introduisons après les différents algorithmes d’ordonnancement de tâches et présentons de quelle manière un programmeur peut profiter des différentes possibilités d’organisation de tâches offertes par Mbed OS.