Académique Documents
Professionnel Documents
Culture Documents
Manuscrit
Manuscrit
Cours
Maître de conférences
A.U 2020-2021
i
Plan de Cours
Objectif général
Le cours Conception des Systèmes Temps Réel CSTR vise à développer chez
l'étudiant(e) une connaissance appliquée de la conception (et du développement)
d'un STR. Conséquemment, ce cours mettra à la fois l'accent sur les connaissances
permettant de comprendre ce qu'est (et ce que n'est pas) un STR, sur les techniques
et concepts propres au développement d'un tel système, et sur le développement du
savoir-faire requis pour mettre la main à la pâte ou pour encadrer une équipe de
développement faisant face aux problèmes caractéristiques d'un STR.
Objectifs spéciques
Acquérir les bases pour la conception des systèmes embarqués qui satisfont des
contraintes matérielles et logicielles associées au traitement des évènements en
temps réel. Comprendre la structure et l'opération des microcontrôleurs utilisés
dans les systèmes embarqués. Se familiariser avec les spécicités des systèmes
d'exploitation temps réel et savoir utiliser leurs services dans le développement de
systèmes en temps réel. Acquérir les bases et les techniques de conception sécuri-
taire pour les systèmes en temps réel. Concepts de base de traitement en temps
réel, de temps de réponse et de systèmes embarqués. Études des caractéristiques
matérielles et fonctionnelles des microcontrôleurs et de leurs interactions avec le
code d'application. Notions et catégories d'événements, mécanismes de réponse aux
événements en temps réel. Analyse de temps de réponse et de facteur de charge
du système. Études des noyaux (kernel) en temps réel. Méthodes d'analyse des
systèmes en temps réel et notions de base de abilité.
Au terme du cours, l'étudiant(e) sera capable :
1. de distinguer un STR d'un système qui ne l'est pas
2. d'expliquer les caractéristiques inhérentes à un STR ;
3. de dénir la spécication de contraintes TR ;
4. de mesurer le respect de contraintes TR ;
5. de développer un module d'un STR ;
6. d'utiliser des primitives d'un système d'exploitation lors de la programmation de
STR.
Liste d'abréviations ix
1.4.2 Taxonomie . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.5.1 Taxonomie . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.7.1 MS-DOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.7.2 Unix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.7.3 Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.8 Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.9 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.9.1 Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.3 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.2.1 Exemple 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.3.1 Exemple 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.5 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
5.3 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
6.4 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
8 Méthode SA-RT 97
8.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
10 FreeRTOS 131
10.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
A FreeRTOS 165
A.1 Nucleo-FR411RE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
B TP2 173
B.1 Objectifs : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
B.2 Congurer PA5 en tant que sortie GPIO avec le label LED_GREEN 173
C TP3 187
C.1 Objectifs : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
D TP4 197
D.1 Objectifs : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
E TP5 205
E.1 Objectifs : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
E.2 Conguration de RTOS avec CubeMX . . . . . . . . . . . . . . . . . 205
E.2.1 Téléchargement de logiciel docklight . . . . . . . . . . . . . 205
E.2.2 Créer un nouveau projet STM32 . . . . . . . . . . . . . . . . 205
F TP6 217
F.1 Objectifs : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
F.1.1 Créer un nouveau projet STM32 . . . . . . . . . . . . . . . . 217
F.2 Conguration de RTOS avec CubeMX . . . . . . . . . . . . . . . . . 217
F.2.1 Verication avec logiciel docklight. . . . . . . . . . . . . . . . 221
G TP7 227
G.1 Objectifs : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
G.2 Comment utiliser FreeRTOS avec Arduino ? . . . . . . . . . . . . . . 227
G.3 Téléchargez et installez FreeRTOS dans Arduino IDE . . . . . . . . . 227
G.4 Gestion des tâches FreeRTOS . . . . . . . . . . . . . . . . . . . . . . 228
G.4.1 LED clignotante avec FreeRTOS et Arduino Uno . . . . . . . 230
G.4.2 Esquisse Arduino . . . . . . . . . . . . . . . . . . . . . . . . . 230
G.4.3 Sortie du moniteur série . . . . . . . . . . . . . . . . . . . . . 230
H TP8 235
H.1 Objectifs : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
H.2 Arduino FreeRTOS Queue Management . . . . . . . . . . . . . . . . 235
H.2.1 Introduction aux les d'attente . . . . . . . . . . . . . . . . . 235
H.2.2 Blocage sur les lectures de le d'attente . . . . . . . . . . . . 236
H.2.3 Blocage sur les écritures en le d'attente . . . . . . . . . . . . 236
H.2.4 Utiliser l'API FreeRTOS Queue . . . . . . . . . . . . . . . . . 236
H.2.5 Créer une le d'attente avec FreeRTOS . . . . . . . . . . . . 240
H.2.6 FreeRTOS Envoi de données à la le d'attente . . . . . . . . . 241
H.2.7 FreeRTOS Recevoir des données de la le d'attente . . . . . . 241
H.2.8 Exemple - données de lecture / écriture de le d'attente Ar-
duino FreeRTOS . . . . . . . . . . . . . . . . . . . . . . . . . 242
H.3 Esquisse complète Arduino . . . . . . . . . . . . . . . . . . . . . . . . 243
H.4 Exemple d'achage LCD et ADC de le d'attente Arduino FreeRTOS 246
H.4.1 Comment fonctionne le code ? . . . . . . . . . . . . . . . . . . 246
I TP9 251
I.1 Objectifs : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
I.2 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
I.2.1 Pourquoi utilisons-nous la structure des les d'attente ? . . . 251
I.2.2 Exemple de le d'attente de structure pour recevoir des don-
nées de plusieurs ressources . . . . . . . . . . . . . . . . . . . 251
I.2.3 Implémentation de la structure FreeRTOS Queue dans Arduino252
Liste d'abréviations
Ti : Tâche i
Ci : Temps d'exécution de la tâche i
Pi : Période de la tâche i
Di : Délai critique de la tâche i
Bi : Temps de blocage de la tâche i
L(t) : Laxité résiduelle
D(t) : Délai critique résiduelle
RTi : Temps de réponse
U : facteur d'utilisation. Pour toutes les politiques d'ordonnancement
RM : Rate Monotonic
DM : Deadline Monotonic
EDF : Earliest First Deadline
LLF : Least Laxity First
FPP : Fixed Priority First
NPFP : Non Preemptive Fixed Priority
HPF : Highest Priority First
ABS : (Anti-blocking Brake System).
FIFO : First In Fisrt Out
ADARTS : Ada Based Design Approach for Real-Time Systems
CODARTS : Concurrent Design Approach for Real-Time Systems
FreeRTOS : est un système d'exploitation temps réel (RTOS)
PAPS : Premier Arrivé est le Premier Servi
FCFS : First-Come First Served
SJF : Plus court d'abord (Short Job First )
RM : Rate Monotonic
CS : condition susante
DM : Deadline Monotonic
STM32 : STMicroelectronics 32bits MCU
UART : Universal Asynchronous Receiver Transmitter
RS232 : Norme standardisant un protocole de communication série asynchrone
POSIX : Portable Operating System Interface, héritage d'UNIX (norme IEEE
1003)
RTOS : Real Time Operating System
API : Application Programming Interface
SDK : Software Development Kit
ARM : société anglaise proposant des architectures CPU RISC 32bits
ASCII : American Standar Code for Information Interchange
Kernel Information and Control
osKernelGetInfo : Get RTOS Kernel Information.
x Table des matières
empty.
osMessageQueueGetCapacity : Get maximum number of messages in a Message
Queue.
osMessageQueueGetCount : Get number of queued messages in a Message
Queue.
osMessageQueueGetMsgSize : Get maximum message size in a Memory Pool.
osMessageQueueGetName : Get name of a Message Queue object.
osMessageQueueGetSpace : Get number of available slots for messages in a
Message Queue.
osMessageQueueNew : Create and Initialize a Message Queue object.
osMessageQueuePut : Put a Message into a Queue or timeout if Queue is full.
osMessageQueueReset : Reset a Message Queue to initial empty state.
Chapitre 1
Contents
1.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Analyse d'une tâche . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Avantages du multi-tâche . . . . . . . . . . . . . . . . . . . . . 3
1.4 Tâches dans un contexte temps réel . . . . . . . . . . . . . . 4
1.4.1 Cycle de vie . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.4.2 Taxonomie . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.1 Introduction
En programmation séquentielle, un programme est décomposé en sous-
programmes (procédures ou fonctions). Chaque sous-programme correspond à une
suite d'instructions, et l'exécution du programme voit ces instructions être exécutées
les unes à la suite des autres. Il est en général possible de réaliser une application en
une seule tâche, mais la scrutation de périphériques risque d'y être délicate et coû-
teuse en temps processeur. Un système temps réel est toujours décomposé en tâches,
chacune ayant des fonctionnalités, des temps d'exécution et des échéances diérentes.
Il serait parfois possible de les combiner en une seule tâche, mais cet exercice n'est
pas souhaité, notamment à cause du contrôle plus délicat sur les parties d'exécu-
tion que ceci impliquerait. Considérons un simple système composé de deux entrées
(un port série et un clavier), d'une partie de traitement, et d'une sortie. Dans un
contexte temps réel, le port série doit être scanné régulièrement an d'éviter qu'un
octet ne soit perdu. Si la tâche de traitement est conséquente, il faudrait, en milieu
de traitement, aller vérier l'état du port série, sans oublier la gestion du clavier. Il
faudrait également faire de même si la transmission vers la sortie est lente. Dans un
tel cas, la décomposition du système en tâches distinctes permet d'éviter ces incon-
vénients. Nous pouvons imaginer une tâche responsable de lire les données venant
du port série, et ce à une cadence garantissant le respect des échéances visant à ne
pas perdre d'octet. Une autre tâche serait responsable de la gestion du clavier, une
2 Chapitre 1. Spécicités des Systèmes en Temps Réel
ce fait, l'usage d'un GUI (Graphical User Interface) est plus ergonomique et convi-
vial. Prenons l'exemple d'une application visant à acher la courbe de Mandelbrot.
Pour chaque point de l'image, une grande quantité de calcul doit être eectuée.
Supposons que l'utilisateur peut cliquer sur des boutons pour zoomer. Si nous ne
disposons pas de multi-tâche, une clique sur le bouton va ensuite voir l'application
se bloquer pendant que la nouvelle image est calculée. Si par contre nous dispo-
sons de plusieurs tâches, une tâche peut s'occuper du calcul pendant que l'autre
gère l'interface graphique. Dès lors l'utilisateur a encore la possibilité d'interagir
avec l'application sans devoir sourir de l'accaparement du processeur pour le cal-
cul. Dans le cas d'un processeur multi-c÷ur, un autre avantage du multi-tâche peut
s'exploiter. En eet, chaque c÷ur peut prendre en charge un ou plusieurs tâches.
En reprenant l'exemple de Mandelbrot, si nous supposons que nous sommes en pré-
sence d'un dual-core, alors nous pouvons décomposer notre calcul en deux tâches,
chacune étant responsable de la génération de la moitié de l'image. Lorsque l'uti-
lisateur clique sur le bouton, la nouvelle image pourra donc s'acher en un temps
réduit de moitié. Il s'agit là d'un parallélisme réel, rendu possible par l'améliora-
tion des plateformes matérielles proposées sur le marché. Nous pouvons toutefois
noter que l'accélération d'un facteur n pour un n-core reste théorique, la probable
communication inter-tâche imposant une perte en performance.
les signaux périodiques qui peuvent être caractérisés par une première date
d'occurrence et une période. Ces signaux proviennent en général d'une horloge
interne HTR Horloge Temps Réel . ;
les signaux apériodiques qui se produisent de façon répétitive mais sans
période xée. Pour déterminer les caractéristiques des tâches associées à ces
signaux apériodiques, il est nécessaire de posséder des informations temporelles les
concernant, par exemple la durée minimale entre deux occurrences ;
les signaux sporadiques qui se produisent une seule fois, comme les signaux
d'alarme provenant du procédé.
La Figure 1.4 illustre les diérentes étapes de la vie d'une tâche, dans un contexte
temps réel. L'état initial d'une tâche est inexistant. Après sa création, elle passe à
l'état passive lorsque toutes les ressources à son bon fonctionnement ont été ré-
quisitionnées. Elle reste dans cet état jusqu'à être réveillée, ce qui peut n'est fait
qu'une seule fois pour une tâche apériodique, ou de manière répétée pour une tâche
périodique. Après le réveil, elle se trouve dans l'état prête, où elle se retrouve en
compétition avec les autres tâches disposées à être exécutées. L'ordonnanceur a alors
la charge de choisir les tâches à activer. De l'état prête, le système d'exploitation
peut ensuite la faire passer dans l'état élue, état dans lequel la tâche s'exécute.
Ce passage n'est pas du ressort de la tâche, mais bien de l'ordonnanceur, qui s'oc-
cupe d'allouer le processeur aux diérentes tâches concurrentes, et ce en suivant la
politique d'ordonnancement choisie. A tout instant l'ordonnanceur peut replacer la
tâche dans l'état prête, pour laisser une autre tâche s'exécuter. Il s'agit de la pré-
emption d'une tâche, qui se fait sans que la tâche préemptée n'en soit consciente.
Depuis l'état élue, la tâche peut aussi se retrouver dans l'état bloquée, lors de l'at-
6 Chapitre 1. Spécicités des Systèmes en Temps Réel
Figure 1.3 Les diérents types d'activation des tâches matérielles. Interactions
tente d'un événement ou du relâchement d'un mutex, par exemple. La tâche ressort
de cet état par son réveil suite au relâchement d'un mutex ou au fait qu'un événe-
ment sur lequel la tâche attend a été déclenché. Dans ce cas, la tâche passe à l'état
prête, prête à continuer son exécution.
Figure 1.4 Etats et transitions d'une tâche dans un contexte temps réel
1.4. Tâches dans un contexte temps réel 7
1.4.2 Taxonomie
Les tâches sont divisées en deux grandes catégories, en fonction de leur périodi-
cité.
Les tâches périodiques (ou cycliques) sont des tâches qui sont exécutées à
intervalles réguliers.
Elles sont entre autres dénies par la période avec laquelle elles sont censées
s'exécuter, ce qui est géré par l'ordonnanceur. Une tâche périodique peut par
exemple être responsable de l'observation d'un capteur à intervalles réguliers, de la
régulation de moteurs, de monitoring, etc.
d'exécution.
D : son délai critique, au-delà duquel le résultat est jugé comme étant non
pertinent
P : sa période, pour le cas d'une tâche périodique
d : pour une tâche à contraintes strictes, son échéance, calculée comme étant
d=r+D
s : date de début d'exécution de la tâche
f : date de n d'exécution de la tâche
u = C/P : son facteur d'utilisation du processeur
ch = C/D : son facteur de charge du processeur
.......
La Figure 1.5 illustre ces diérents paramètres. Dans les diagrammes temporels
utilisés, nous noterons l'occurrence d'un réveil de tâche à l'aide d'une èche pointant
vers le haut, l'échéance de la tâche étant représentée par une èche pointant vers le
bas.
La Figure 1.6 montre les paramètres d'une tâche périodique, et la Figure 1.7
illustre les caractéristiques d'une tâche périodique à échéance sur requête, où la
période est égale au délai critique.
Figure 1.7 Paramètres typiques d'une tâche périodique à échéance sur requête
Ti
1.5.1 Taxonomie
Monoprocesseur/multiprocesseur
L'architecture physique du système a une inuence sur la manière d'agencer les
tâches. Certains algorithmes ne peuvent être appliqués qu'au des systèmes mono-
processeur (ordonnancement monoprocesseur), alors que d'autres se destinent à des
systèmes multi-processeur (ordonnancement multiprocesseur). Dans le cadre de ce
cours, nous ne traiterons que les algorithmes monoprocesseur.
Préemptif/non-préemptif
La préemption consiste en le fait qu'une tâche peut être interrompue à son insu
pour céder sa place à une autre tâche. Les algorithmes préemptifs traitent donc des
systèmes où les tâches peuvent être préemptées, tandis que les algorithmes non-
préemptifs traitent de ceux dont une tâche ayant commencé son traitement doit
obligatoirement le terminer avant qu'une autre ne s'exécute.
doit faire de son mieux pour fournir un ordonnancement le plus proche possible de
l'optimal.
Dénition (1) :
Le comportement d'un système informatique est qualié de temps réel lorsqu'il
est assujetti à l'évolution d'un procédé qui lui est connecté et qu'il doit piloter ou
suivre en réagissant à tous ses changements d'états.
Dénition (2) :
Un système temps réel est déni comme un système dont le comportement dépend :
¬ De l'exactitude des traitements eectuées ¬ Du temps où les résultats sont
produits Un retard = le fait de rater une échéance = erreur du système
Latence :
Délai global de bout en bout entre le changement d'état dans un environnent et la
réaction correspondante en sortie du système
12 Chapitre 1. Spécicités des Systèmes en Temps Réel
Chapitre 2
Contents
2.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2 Types d'ordonnanceurs . . . . . . . . . . . . . . . . . . . . . . 14
2.3 Objectifs de l'ordonnanceur d'un système multi-utilisateur 15
2.4 Ordonnanceurs non préemptifs . . . . . . . . . . . . . . . . . 15
2.4.1 Premier arrivé premier servi . . . . . . . . . . . . . . . . . . . 19
2.7.2 Unix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.7.3 Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.8 Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.9 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.9.1 Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.1 Introduction
Tout le logiciel d'un ordinateur peut être vu comme un ensemble de processus
dont l'exécution est gérée par un processus particulier : l'ordonnanceur (Scheduler
en anglais). Un ordonnanceur fait face à deux problèmes principaux :
le choix du processus à exécuter, et
le temps d'allocation du processeur au processus choisi.
Un système d'exploitation multitâche est préemptif lorsque celui-ci peut arrêter
(réquisition) à tout moment n'importe quelle application pour passer la main à
la suivante. Dans les systèmes d'exploitation préemptifs on peut lancer plusieurs
14 Chapitre 2. Ordonnancement des Processus
applications à la fois et passer de l'une à l'autre, voire lancer une application pen-
dant qu'une autre eectue un travail. Il y a aussi des systèmes d'exploitation dits
multitâches, qui sont en fait des multi-tâches coopératifs . Quelle est la dié-
rence ? Un multitâche coopératif permet à plusieurs applications de fonctionner et
d'occuper des plages mémoire, laissant le soin à ces applications de gérer cette oc-
cupation, au risque de bloquer tout le système. Par contre, avec un multi-tâche
préemptif , le noyau garde toujours le contrôle (qui fait quoi, quand et comment),
et se réserve le droit de fermer les applications qui monopolisent les ressources du
système. Ainsi les blocages du système sont inexistants. Un problème d'ordonnan-
cement consiste à organiser dans le temps la réalisation de tâches, compte tenu de
contraintes temporelles (délais, contraintes d'enchaînement) et de contraintes por-
tant sur la disponibilité des ressources requises. En production (manufacturière, de
biens, de service), on peut le présenter comme un problème où il faut réaliser le
déclenchement et le contrôle de l'avancement d'un ensemble de commandes à tra-
vers les diérents centres composant le système. Un ordonnancement constitue une
solution au problème d'ordonnancement. Il est déni par le planning d'exécution des
tâches ( ordre et calendrier ) et d'allocation des ressources et vise à satisfaire
un ou plusieurs objectifs.
4a + 3b + 2c + d
< t >= (2.1)
4
On obtient un meilleur temps de séjour pour a≤b≤c≤d
16 Chapitre 2. Ordonnancement des Processus
B 6 1
C 4 4
D 2 6
E 1 7
Toutefois, l'ordonnancement du plus court d'abord est optimal que si les travaux
sont disponibles simultanément
Exemple 1
Considérons cinq travaux A, B, C, D et E, dont les temps d'exécution et leurs
arrivages respectifs sont donnés dans la Table 2.1. Faire un schéma qui illustre son
exécution et calculer le temps de séjour de chaque processus, le temps moyen de
séjour, le temps d'attente et le temps moyen d'attente en utilisant :
1. Premier arrivé premier servi (PAPS)
2. Le plus court d'abord (SJF)
Solution 1
B 9-1=8
C 13-4=9
D 15-6=9
E 16-7=9
B 8-6=2
C 9-4=5
D 9-2=7
E 9-1=8
0+2+5+7+8 22
= = 4.4 (2.3)
5 5
Il y a cinq tâches exécutées dans 16 unités de temps, alors :
16
= 3.2 unités de temps par processus. (2.4)
5
2. Le plus court d'abord. Schéma d'exécution :
3 + 8 + 2 + 6 + 12 32
< t >= = = 6.4 (2.5)
5 5
Le temps moyen d'attenter est :
18 Chapitre 2. Ordonnancement des Processus
B 9-1=8
C 10-7=3
D 12-6=6
E 16-4=12
B 8-6=2
C 3-1=2
D 6-2=4
E 12-4=8
0+2+2+4+8 16
= = 3.2 (2.6)
5 5
Il y a cinq tâches exécutées dans 16 unités de temps, alors :
16
= 3.2 unités de temps par processus. (2.7)
5
Comment appliquer cette technique aux processus interactifs ? Chaque processus
se comporte comme suit : il attend une commande, l'exécute, attend la commande
suivante, et ainsi de suite. Alors parmi les processus prêts, le processus élu est celui
dont la commande à exécuter est la plus courte en temps. Le temps d'exécution
de la prochaine commande de chaque processus est estimé en se basant sur le
comportement passé du processus : Si T0 est le temps d'exécution estimé pour la
première commande et Ti le temps d'exécution mesuré pour la iime commande, les
estimations successives sont :
T0 pour la première ;
T0 /2 + T1 /2 pour la seconde ;
T0 /4+T1 /4+ T2 /2 pour la troisième ;
T0 /8+ T1 /8+ T2 /4+T3 /2,....
Les ordonnanceurs non préemptifs ne sont pas intéressants pour les systèmes
multi-utilisateurs car les temps de réponse ne sont pas toujours acceptables. Les
algorithmes non préemptifs sont appliqués lorsque les tâches ne peuvent être pré-
emptées, c'est-à-dire où une tâche ayant commencé son exécution doit forcément la
terminer avant qu'une autre tâche ne puisse débuter.
2.4. Ordonnanceurs non préemptifs 19
T2 2 2
T3 4 4
Cet algorithme fonctionne de la manière la plus simple qui soit. Les tâches sont
stockées dans une structure de type FIFO, la première tâche est exécutée, et lors-
qu'elle termine, la suivante est lancée. Les tâches nouvellement activées sont stockées
à la n de la le d'attente. La Figure 2.3 illustre le concept de cet ordonnancement.
Nous pouvons noter que les tâches T1 et T2 doivent attendre un temps important
que la tâche T0 se termine.
An d'éviter que des tâches courtes ne doivent attendre trop longtemps sur des
tâches longues, il est possible d'appliquer un algorithme où la tâche la plus courte est
servie en premier. De ce fait, les tâches courtes sont favorisées, et le temps d'attente
moyen est minimisé. Un des problèmes de cette approche est le risque de famine
des tâches longues. Si de nouvelles tâches courtes son régulièrement réveillées, il se
peut qu'elles passent toujours devant une tâche longue, empêchant ainsi celle-ci de
s'exécuter. La Figure 2.4 illustre le fonctionnement de cet algorithme.
L'algorithme du tourniquet (round robin en anglais) vise à traiter les tâches avec
le plus d'équité possible, en allouant un quantum de temps identique à toutes les
20 Chapitre 2. Ordonnancement des Processus
T2 2 0
T3 4 0
tâches, et à les traiter dans un ordre FIFO. Les tâches sont placées dans une le
d'attente, et la première de la le est exécutée pendant un quantum de temps. A la
n de ce quantum, si la tâche n'est pas terminée, elle est replacée à la n de la le
et une nouvelle tâche est sélectionnée depuis le début de la le. Si la le est vide,
la tâche peut continuer son exécution. La Figure 2.5 illustre cet algorithme, avec un
quantum de temps égal à 2. Nous pouvons noter que la tâche T1 , la plus prioritaire,
est exécutée au départ, puis un tourniquet est eectué pour les deux autres tâches.
Cette technique de tourniquet à priorité correspond à la politique standard observée
dans les systèmes d'exploitation, car elle permet à toutes les tâches de s'exécuter
sans risque de famine.
T2 2 1
T3 4 3
2.5. Ordonnanceurs préemptifs 21
T2 6 2 0
T3 4 1 0
Problèmes :
est alloué à un autre processus (celui en tête de le). Le processus suspendu est
inséré en queue de le. Les processus qui arrivent ou qui passent de l'état bloqué à
l'état prêt sont insérés en queue de le.
Choix de la valeur du quantum
Un quantum trop petit provoque trop de commutations de processus et abaisse
l'ecacité du processeur. Un quantum trop élevé augmente le temps de réponse des
courtes commandes en mode interactif. Un quantum entre 20 et 50 ms est souvent
un compromis raisonnable
Exemple 2 :
Soient deux processus A et B prêts tels que A est arrivé en premier suivi de B, 2
unités de temps après. Les temps de UCT nécessaires pour l'exécution des processus
A et B sont respectivement 15 et 4 unités de temps. Le temps de commutation
est supposé nul. Calculer le temps de séjour de chaque processus A et B, le temps
moyen de séjour, le temps d'attente, le temps moyen d'attente, et le nombre de
changements de contexte pour :
SRT
Round robin (quantum = 10 unités de temps)
Round robin (quantum = 3 unités de temps)
Solution SRT :
B 6-2=4
B 4-4=0
19 + 4 23
< t >= = = 11.5 (2.8)
2 5
Le temps moyen d'attente est :
4+0 4
= =2 (2.9)
2 2
Il y a 3 changements de contexte
19 + 12 31
< t >= = = 15.5 (2.10)
2 2
Le temps moyen d'attente est :
4+8 12
= =6 (2.11)
2 2
Il y a 3 changements de contexte
19 + 8
< t >= = 13.5 (2.12)
2
2.5. Ordonnanceurs préemptifs 25
B 14-2=12
B 12-4=8=12
B 8-4=4
26 Chapitre 2. Ordonnancement des Processus
4+4 8
= =4 (2.13)
2 2
Il y a 5 changements de contexte Dans le trois solutions (SRT, RR Qt=10 et RR
Qt =3), il y a 2 tâches exécutées dans 19 unités de temps, alors 19/2=9.5 unités de
temps par processus.
Exemple 3 :
Les processus qui font beaucoup d'E/S (qui sont souvent en attente) doivent
acquérir le processeur dès qu'ils le demandent, an de leur permettre de lancer leur
requête suivante d'E/S. Lorsqu'un processus passe de l'état élu à l'état bloqué, sa
priorité est recalculée. Sa nouvelle valeur est le rapport : quantum/temps réellement
utilisé par le processus.
Les processus qui ont le plus grand rapport sont les plus prioritaires :
. Si le quantum = 100 ms et le temps utilisé = 2 ms, la nouvelle priorité est 50.
. Si le quantum = 100 ms et le temps utilisé = 50 ms, la nouvelle priorité est 2.
2.6. Ordonnancement à deux niveaux 27
Pour éviter qu'il y ait beaucoup de commutations pour les processus consom-
mateurs de temps UCT, il est préférable d'allouer un plus grand quantum à ces
processus. Lorsqu'un processus passe à l'état élu : Pour la première fois, le proces-
seur lui est alloué pendant un quantum. Pour la seconde fois, le processeur lui est
alloué pendant 2 quantums. Pour la nime fois, le processeur lui est alloué pendant
2n−1 quantum. Chaque processus a une priorité. Cette dernière dépend du nombre
de quantum qui lui sera alloué lors de sa prochaine activation. Les processus dont le
nombre de quantum est le plus petit sont les plus prioritaires. Les processus prêts
sont répartis selon leur priorité dans des les (FIFO). D'abord on fait l'élection du
processus le plus prioritaire qui se trouve en tête de le. Lorsque l'exécution d'un
processus est suspendue pour la n-ième fois, sa priorité est recalculée 2n puis il est
inséré à la queue de la le appropriée.
Exemple 4 :
Considérons un processus qui doit eectuer des calculs pendant 100 quantums. Ce
processus obtient successivement 1, 2, 4, 8, 16, 32 et 64 quantums. Mais il utilisera
37 des 64 derniers quantums. Le nombre de changements de contexte passe de 100
(cas du tourniquet) à 7. Le processeur passe moins de temps à commuter et a donc
un meilleur temps de réponse. Surtout dans le cas où la commutation nécessite des
transferts sur disque.
Un processus qui descend de plus en plus dans les les à priorité s'exécute de
moins en moins fréquemment et favorise ainsi les processus courts en mode interactif.
Pour ne pas défavoriser un processus qui s'était exécuté pendant assez longtemps
avant de devenir interactif, on peut lui attribuer la plus haute priorité dès qu'un
retour chariot est tapé sur le terminal associé au processus (les premières versions
d'Unix utilisaient cette solution).
Lors d'une commutation, si le processus élu n'est pas en mémoire, il faut le char-
ger en mémoire. Le temps de commutation est deux à trois fois plus élevé que celui
des processus qui se trouvent en mémoire centrale. Pour éviter ces va-et-vient entre
le disque et la mémoire lors d'une commutation, l'ordonnanceur à deux niveaux dé-
place les processus entre le disque et la mémoire (haut niveau) et choisit le processus
à exécuter parmi ceux qui sont en mémoire (bas niveau). Périodiquement, l'ordon-
nanceur de haut niveau retire de la mémoire les processus qui y sont restés assez
longtemps et les remplace par des processus qui sont restés sur le disque pendant
trop de temps. Pour élire un processus, l'ordonnanceur de bas niveau se restreint au
processus en mémoire.
28 Chapitre 2. Ordonnancement des Processus
2.7.2 Unix
2.7.3 Linux
Linux ore trois politiques d'ordonnancement. Deux d'entre elles sont des po-
litiques d'ordonnancement en temps réel "soft", c'est-à-dire qu'elles accordent aux
processus une très haute priorité par rapport aux autres processus, mais ne garan-
tissent pas une réponse dans un temps spécié. La troisième politique d'ordonnan-
cement utilise un algorithme de temps partagé basé sur des valeurs de priorité. Par
défaut, un processus est associé à la politique de temps partagé. Seul root peut as-
socier un processus à une des classes d'ordonnancement en temps réel.
En Linux, chaque processus se voit attribuer une politique d'ordonnancement. Dans
2.7. Cas d'étude 29
tous les cas, le processus possède aussi une valeur de priorité, variant de 1 à 40. Plus
la valeur est élevée, plus la priorité est haute. Par défaut, un processus utilisateur
a une valeur de priorité de 20. Il est possible, pour un processus, de modier sa
priorité, en utilisant l'appel système nice(valeur), où valeur est un nombre compris
entre -20 et 20. Si la valeur est positive, on diminue d'autant la priorité du processus.
Réciproquement, si la valeur est négative, on augmente la priorité. À noter que seul
root peut augmenter la priorité d'un processus.
Temps réel
Une première politique d'ordonnancement, dénommée SCHED_F IF O, garantit
au processus une utilisation illimitée du processeur. Il ne sera interrompu que dans
une des circonstances suivantes :
Le processus bloque sur un appel système ou se termine.
Un autre processus de la classe SCHED_F IF O de priorité plus élevée est prêt.
Dans ce cas le processus actuel est remplacé par celui-ci.
Le processus libère lui-même le processeur, en exécutant l'appel système
sched_yield().
temps réel de plus haute priorité a toujours préséance. Ainsi, si deux processus de la
classe SCHED_RR avec priorité 20 s'exécutent, ils alterneront dans le processeur.
Si entretemps apparaît un processus de la même classe, mais de priorité 25, c'est
ce dernier qui prend le contrôle du processeur et ne le redonnera que lorsqu'il se
SCHED_RR de
terminera. À moins, bien sûr, que n'apparaisse un autre processus
priorité supérieure ou égale, ou encore un processus SCHED_F IF O. Le quantum
attribué à un processus de la classe SCHED_RR est variable et établi selon les
mêmes principes que ceux appliqués aux processus à temps partagé, décrits à la
section suivante.
Temps partagé
Nous avons vu, à la section précédente, les deux politiques d'ordonnancement en
temps réel oertes par Linux. Il nous reste maintenant à voir la dernière politique
d'ordonnancement, qui regroupe tous les processus de la classe OTHER. Les
processus de cette classe se partagent le processeur de manière inégale, selon leur
priorité et leur usage du processeur. Premièrement, comme nous l'avons déjà dit,
chaque processus possède une valeur de priorité qui lui est attribuée au moment de
sa création. C'est ce que nous appellerons la priorité statique.
Initialement, on attribue à chaque processus un quantum dont la valeur utilise une
unité de temps qui correspond normalement à 10ms. La valeur initiale du quantum
est égale à la valeur de priorité. Ainsi, un processus de priorité 25 aura un quantum
de 25 unités, ce qui correspond à 250 ms. Ce quantum est le temps alloué au
processus. À chaque 10 ms, on diminue de 1 la valeur du quantum du processus en
cours d'exécution dans le processeur.
Chaque fois que l'ordonnanceur est appelé, une note est attribuée à tous les
processus. Cette note, comme nous le verrons à la section suivante, dépend à la fois
de la priorité du processus et de la valeur actuelle de son quantum. C'est cette note
qui permettra de déterminer quel processus prendra le contrôle du processeur.
Éventuellement, on peut arriver à une situation où tous les processus sont dans une
des deux situations suivantes :
. Son quantum est 0. Il a écoulé tout le temps qui lui était alloué.
. Il est bloqué. Il n'a pas nécessairement épuisé son quantum.
Dans ce cas, tous les quanta (y compris les quanta des processus en attente qui ont
encore une valeur non nulle) sont réajustés selon la formule suivante :
Quantum
Quantum ← + P riorite (2.14)
2
Ceci a pour eet de favoriser les processus qui n'ont pas utilisé tout le temps qui
leur est alloué. En eet, un processus qui n'a pas épuisé son quantum se retrouve
avec un nouveau quantum plus élevé que l'ancien.
On peut facilement vérier que la valeur maximale du quantum est deux fois la
priorité.
Comme nous le verrons dans la prochaine section, un processus qui voit son
2.7. Cas d'étude 31
quantum augmenter peut se retrouver avec une meilleure note lorsque vient le
moment de choisir un processus à exécuter.
Ceci a pour eet de favoriser les processus qui n'ont pas utilisé tout le temps qui
leur est alloué. En eet, un processus qui n'a pas épuisé son quantum se retrouve
avec un nouveau quantum plus élevé que l'ancien. On peut facilement vérier que
la valeur maximale du quantum est deux fois la priorité. Comme nous le verrons
dans la prochaine section, un processus qui voit son quantum augmenter peut se
retrouver avec une meilleure note lorsque vient le moment de choisir un processus
à exécuter.
Algorithme d'ordonnancement
Lorsque l'ordonnanceur est appelé, Linux attribue une note à chaque processus,
en utilisant la méthode suivante :
On remarquera qu'un processus membre d'une des deux classes de temps réel
aura toujours priorité sur les autres. En eet, puisque le quantum ne peut dépasser
le double de la priorité du processus, et que la valeur maximale de la priorité d'un
processus est 40, on n'aura jamais une note supérieure à 120 pour un processus
de la classe OTHER, ce qui est nettement inférieur au minimum de 1000 pour un
processus en temps réel.
On remarquera aussi qu'un processus qui a écoulé tout son quantum reste en attente
tant qu'il y a des processus qui peuvent s'exécuter. Comme nous l'avons déjà dit,
il ne se verra attribuer un nouveau quantum que lorsque tous les autres processus
auront épuisé leur quantum ou seront bloqués.
Exemple 5 :
Supposons qu'ils arrivent tous dans le système au même moment et qu'ils sont
seuls. A et B sont des processus qui s'interrompent pour faire des appels système
bloquant, alors que C ne bloque jamais. Initialement, c'est évidemment le processus
A qui a la meilleure note.
32 Chapitre 2. Ordonnancement des Processus
Processus A B C
Priorité 20 18 10
C'est donc lui qui est exécuté, ayant droit à 200 ms. Supposons maintenant qu'il
s'interrompt après 160 ms pour exécuter un appel système bloquant.
Le système doit maintenant choisir entre B et C. B est élu et s'exécute pendant 40
ms (lui aussi bloque sur un appel système). À ce moment, le processus C prend
le contrôle et utilise toute la 100 ms qui lui sont accordées. On se retrouve alors
dans la situation suivante : A et B sont toujours bloqués, et C a un quantum nul.
Le système réalisera donc un réajustement des quanta. Les processus se verront
attribuer les nouvelles valeurs suivantes (rappelons qu'il reste 40 ms à A et 140 ms
à B) :
C'est donc B qui sera choisi, malgré sa priorité statique plus basse. Il est favorisé
parce qu'il a utilisé une proportion plus petite du temps qui lui avait été alloué.
2.8 Windows
L'algorithme d'ordonnancement de Windows est semblable à celui du
VAX/VMS : il est basé sur une priorité qui peut changer au cours de l'exé-
cution des processus. Windows ordonne des threads, sans se préoccuper de savoir à
quel processus ils appartiennent. On n'utilise pas un ordonnanceur autonome :
quand un thread ne peut plus continuer à s'exécuter, il se met en mode superviseur
pour exécuter la routine d'ordonnancement. S'il signale un objet (UP sur un séma-
phore, par exemple), il vérie s'il n'a pas ainsi réveillé un thread plus prioritaire
auquel il doit céder sa place.
Si le quantum est expiré et que le thread est sélectionné à nouveau, on lui attribue
gérer les transitions entre ces états. C'est l'allocateur du processeur aux diérent
processus.
Ordonnancement préemptif :
La tâche en cours peut perdre le processeur au prot d'une autre tâche jugée plus
urgente.
2.9 Exercices
2.9.1 Questions
T2 2 2
T3 4 4
T2 3
T3 3
Les algorithmes non préemptifs sont appliqués lorsque les tâches ne peuvent
être préemptées, c'est-à- dire où une tâche ayant commencé son exécution doit
forcément la terminer avant qu'une autre tâche ne puisse débuter.
1. Premier arrivé premier servi
a- Soit une application composée de trois tâches périodiques T1 , T2 et T3 dont on
connaît les durées d'exécution C1 C2 et C3
T2 2 0
T3 4 0
T2 8 0
T3 7 0
T4 3 0
c- Soit 3 processus,
Dessinez le chronogramme et donnez le temps d'attente moyen pour la politique
plus courte d'abord.
Dans le cadre préemptif, une tâche peut être temporairement interrompue par
l'ordonnanceur an de laisser une autre tâche s'exécuter. De ce fait, une tâche très
longue n'a plus de risque de bloquer des tâches plus courtes trop longtemps.
1. Round robin/tourniquet
L'algorithme du tourniquet (round robin en anglais) vise à traiter les tâches avec
le plus d'équité possible, en allouant un quantum de temps identique à toutes les
tâches, et à les traiter dans un ordre FIFO. Les tâches sont placées dans une le
d'attente, et la première de la le est exécutée pendant un quantum de temps. A la
n de ce quantum, si la tâche n'est pas terminée, elle est replacée à la n de la le
et une nouvelle tâche est sélectionnée depuis le début de la le. Si la le est vide,
la tâche peut continuer son exécution.
P2 3
P3 2
2.9. Exercices 37
T2 2 1
T3 4 3
Ordonnancement de Tâches
Périodiques Préemptif à Priorités
Fixes
Contents
3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.2 Ordonnancements A priorité Fixe . . . . . . . . . . . . . . . 40
3.2.1 Rate-Monotonic = RM . . . . . . . . . . . . . . . . . . . . 40
3.3 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.1 Introduction
Dans la littérature, le terme tâche est souvent préféré pour signier, la pé-
riodicité ou la manière cyclique d'exécution, que ce, du processus dont l'aspect
est attaché plutôt, au sens de l'unicité de la demande d'exécution. Cependant, la
tâche obéit parfaitement, aux principes du multitâche préalablement énoncés le cas
échéant. Les tâches doivent entre autres respecter des délais critiques imposés par
les dynamiques de l'environnement à contrôler. D'un point de vue temporel, les
paramètres suivants peuvent caractériser une tâche :
La date de réveil : qui correspond à l'instant à partir duquel la tâche peut
commencer son exécution,
La durée d'exécution : égale à la borne supérieure du temps processeur nécessaire
à l'exécution de la tâche,
Le délai critique : qui est l'intervalle de temps, à partir de la date de réveil, durant
lequel la tâche doit s'exécuter. En dehors de cet intervalle, son exécution devient
inutile.
La période : est l'intervalle de temps xe qui sépare les arrivées successives
d'une tâche. Ce paramètre concerne les tâches activées par un signal périodique
provenant d'une horloge temps réel interne, c'est le cas par exemple de l'acquisition
de données. Ce type de tâches est appelé tâches périodiques
Chapitre 3. Ordonnancement de Tâches Périodiques Préemptif à
40 Priorités Fixes
3.2.1.1 RM préemptif
On peut dire que Rate Monotonic (RM) est un algorithme qui est basé sur des
priorités statiques et qui est optimal. Une tâche dispose d'une priorité xe qui est
inversement proportionnelle à la période. Nous présentons les tests de faisabilité
dans le cas préemptif et non préemptif. Dans [Liu et Layland 1973], les auteurs dé-
terminent une condition susante d'ordonnancabilite pour des systèmes de n tâches
`a échéance implicite, sporadiques et à départ simultané. Cette condition susante
est donnée par l'´equation 3.1. La preuve donnée par Liu et Layland est contestée
par Devillers et Goossens et est corrigée et complétée par ces derniers [Devillers et
Goossens 2000].
Une condition susante a été dénie par [LL 73]. L'ordonnancement Rate Mo-
notonic d'un ensemble de n tâches périodiques est faisable si le facteur d'utilisation
U vérie la relation suivante :
n
X Ci
U (τ ) = ≤ n 21/n − 1 (3.1)
Ti
i=1
Pour avoir un meilleur ordre de grandeur, il est intéressant de calculer la limite
de cette fonction pour n qui devient grand (Equation 3.1). On trouve que pourn > 5,
la valeur obtenue est déjà très proche de la limite, à savoir environ 0.7.
lim n 21/n − 1 = ln2 ≈ 0.69 (3.2)
n→∞
Enn, si les périodes des taches sont harmoniques, alors la condition susante
d'ordonnancabilité de RM devient :
n
X Ci
U (τ ) = ≤1 (3.3)
Ti
i=1
2 82.8
3 78.0
4 75.7
5 74.3
10 71.0
Caractéristiques du RM
Le Rate monotonic a été introduit par Liu and Layland en 1973.
- Basé sur les priorités
- Priorités xes
- Les tâches sont périodiques :
o pas de communication,
o temps de commutation négligeable
- L'échéance correspond à la période (Di =Pei )
- Complexité faible et implémentation facile dans un OS
- Algorithme optimal dans la classe des algorithmes à priorité xe Si la(les) condi-
tion(s) d'ordonnançabilité sont satisfaites : - On calcule la priorité de chaque tâche
comme suit :
Ci
Pri = (Inverse de la priode) (3.4)
Pei
Puis l'ordonnanceur sélectionne le processus avec la plus haute priorité.
Conditions d'ordonnançabilité - Pour qu'un ensemble de tâches soit ordonnançable
pour le Rate-Monotonic, il sut que :
n
X Ci
U= ≤ n 21/n − 1 (3.5)
Pei
i=1
- Condition nécessaire :
Chapitre 3. Ordonnancement de Tâches Périodiques Préemptif à
42 Priorités Fixes
B 4 15 1/15=0.06
C 2 20 1/20=0.05
n
X Ci
U= ≤1 (3.6)
Ti
i=1
- Condition susante :
n
X Ci
U= ≤ n 21/n − 1 (3.7)
Ti
i=1
1 4 2 1/3
U= + + = 0.666 6 3 2 − 1 = 0.779 ⇒ (0.666 ≤ 0.779) (3.8)
10 15 20
test respecté
B 8 20 1/20=0.05
C 2 30 1/30=0.033
T2 0 40 150 150 2
15 8 2 1/3
U= + + = 0.966 > 3 2 − 1 = 0.779 (3.9)
10 20 30
- Condition d'ordonnançabilité non satisfaite
- Ordonnançable néanmoins
Les priorités ont été aectées selon l'algorithme d'ordonnancement RM. Le fac-
teur d'utilisation U de cette conguration est donné par :
Chapitre 3. Ordonnancement de Tâches Périodiques Préemptif à
44 Priorités Fixes
n
X Ci 20 40 100
U= = + + ≈ 0.75 ≤ 3 21/3 − 1 ≈ 0.779 (3.10)
Ti 100 150 350
i=1
Par conséquent, nous pouvons en déduire que cette conguration de tâches est
ordonnançable. Nous pouvons construire une partie de la séquence qui aura pour
période H :
Cette séquence, représentée sur la Figure 3.3., montre en particulier les trois
préemptions de la tâche de plus faible priorité T3 alors que la tâche de plus forte
priorité T1 s'exécute dés sa demand0e (dates de réveil).
Nous pouvons noter aussi la présence de temps libres du processeur qui sur
l'ensemble de la période d'étude sont :
n
X Ci
6 n 21/n − 1 (3.13)
Di
i=1
n
X Ci
U= 61 (3.14)
Ti
i=1
- Condition susante :
n
X Ci
U= 6 n 21/n − 1 (3.15)
Di
i=1
3.3 Exercices
Exercice 1 : Rate Monotonic
Rate-Monotonic = plus petite période, plus grande la priorité
Tp2 0 1 4 4
Tp3 0 2 3 6
les plus fragiles qui doivent être arrosées pendant 10 minutes, toutes les 40 minutes,
une deuxième catégorie qui doit recevoir de l'eau pendant 20 minutes, toutes les 60
minutes.
enn, des plantes d'un troisième type qu'il faut arroser toutes les 80 minutes,
pendant 10 minutes.
L'arrosage peut se faire de façon fractionnée, c'est-à-dire s'interrompre et reprendre.
On cherche une solution pour le partage de l'eau entre ces diérentes variétés
de plantes :
Dénir la liste des tâches à accomplir,
Puis, par la stratégie RM :
Calculer l'ordonnançabilité de ces tâches,
Donner un schéma d'utilisation du système d'arrosage à partir du temps 0.
a-
b-
c-
Tp2 0 2 5 14
Tp3 0 2 15 15
Tp2 0 2 4 5
Tp3 0 2 9 10
Solution : (Exercice 6)
La fréquence étant 100Hz, et les opérations que nous allons faire pouvant être
considérées comme instantanées, le délai de la boucle sera 10 millisecondes. Passons
à la fonctionnalité.
Pour pouvoir reproduire avec une seconde de délai, il faut stocker 100 valeurs
Chapitre 3. Ordonnancement de Tâches Périodiques Préemptif à
48 Priorités Fixes
Ordonnancement de Tâches
Périodiques Préemptif à Priorités
Dynamiques
Contents
4.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.2 Earliest Deadline First (EDF) . . . . . . . . . . . . . . . . . . 51
4.2.1 Exemple 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.1 Introduction
Nous avons jusqu'à présent considéré que la priorité aectée à une tâche restait
constante pendant toute la durée de l'application. Nous allons nous intéresser à
une autre catégorie d'algorithme d'ordonnancement pour laquelle la priorité des
tâches varie au cours de l'exécution d'une tâche. Cette priorité est fonction d'une
caractéristique temporelle dynamique de la tâche.
n
X Ci
∀τi ∈ Γi , 61 (4.1)
Ti
i=1
Chapitre 4. Ordonnancement de Tâches Périodiques Préemptif à
52 Priorités Dynamiques
4.2.1 Exemple 1
4.2.2. Avantage et inconvénient Cet algorithme est optimal pour tous types de
système de tâches, cependant, il est assez dicile à mettre en ÷uvre et est donc peu
utilisé. De plus, il ne prévoit aucun compromis "satisfaisant" en cas de surcharge
du système (taux d'utilisation supérieur à 100 %) ; son implémentation est donc un
peu dangereuse dans les systèmes temps réel industriels.
- Condition de faisabilité :
Si Di = Ti :
n
X Ci
U= ≤1 (4.3)
Ti
i=1
n
X Ci
∀τi ∈ Γi , 61 (4.5)
Ti
i=1
- Propriété : LLF est optimal dans la classe des algorithmes préemptifs pour
des tâches périodiques indépendantes telles queDi 6 Ti
4.3.1 Exemple 2
- Condition de faisabilité :
Si Di = Ti :
n
X Ci
U= ≤1 (4.7)
Ti
i=1
- Intérêts :
- Simplicité de mise en ÷uvre
- Optimisation de l'usage des ressources
- Bien adapté aux tâches périodiques à courtes échéances
Inconvénients :
- Indépendance des tâches impératives pour l'utilisation des conditions de faisabilité
- Instabilité en cas de surcharge (EDF)
- Nombreux changements de contexte dans certains cas (LLF)
- Dicilement implantable dans les OS actuels
matériel, par exemple une transmission défectueuse qui fait qu'un signal ar-
rive en retard (réseau surchargé)
contention sur une ressource critique
réveil de tâches apériodiques suite à des alarmes
* Les algorithmes à priorités classiques (du type EDF ou RMA) orent des
performances souvent médiocre en cas de surcharge
* Eet "domino" dû à l'arrivée d'une tâche supplémentaire dans un ordonnancement
EDF
n
X Ci
U= (4.9)
Ti
i=1
Chapitre 4. Ordonnancement de Tâches Périodiques Préemptif à
56 Priorités Dynamiques
T2 5 2 4
T3 10 4 10
* Cas général
basée sur le fait que pour une tâche unique de capacité Ci et de délai critique
Ci
Di , la charge dans l'intervalle [ri , di ] est ρi = Di et (di = ri + Di )
Calculée au réveil des tâches (date t =ri )
P
dk ≤di Ck (t)
ρi (t) = (4.10)
(di − t)
ρ = max (ρi (t))
Exemple
J1 : (C1 = 2, r1 = 3, d1 = 6)
J2 : (C2 = 3, r2 = 1, d2 = 7)
J3 : (C3 = 1, r3 = 2, d3 = 9)
A t=3
ρ1 (3) = 2/3 , ρ2 (3) = 3/4 et ρ1 (3) = 4/6
4.5 Exercices
Exercice 1 : La conguration suivante est ordonnançable selon l'algorithme
Earliest Deadline First . Si oui, donner la séquence produite par cet algorithme.
4.5. Exercices 57
T2 6 2
T3 15 4
T2 7 2 6
T2 4 1 4
T3 20 2 20
Exercice 8 :
On considère les quatre (4) types d'ordonnancement préemptifs suivants :
- Ordonnancement à priorité xe selon la période (à taux monotone), noté RM.
- Ordonnancement à priorité xe selon le délai critique (à échéance monotone),
noté DM.
T2 8 2 8
T3 12 3 12
4.5. Exercices 59
T2 4 1 4
T3 6 2 3
T2 0 1 4 4
T3 0 2 3 6
Contents
5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.2 Principaux tests d'ordonnançabilité . . . . . . . . . . . . . . 61
5.2.1 Analyse du facteur d'utilisation . . . . . . . . . . . . . . . . 61
5.3 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.1 Introduction
La validation des systèmes temps réel impose de vérier que les tâches respectent
leurs contraintes temporelles. Des techniques analytiques spéciques aux systèmes
temps réel ont été conçues pour répondre à cet objectif. Les trois principales ap-
proches sont fondées sur l'analyse du facteur d'utilisation du processeur, l'analyse
de la demande processeur et l'analyse du temps de réponse.
U = n 21/n − 1 (5.1)
Analyse :
lim n × 21/n − 1 = ln2 ≈ 0.69 (5.2)
n→∞
n
Y
U6 (1 + ui ) (5.3)
i=1
Test d'ordonnançabilité :
Le pire temps de réponse de taui est le plus petit point xe de la suite :
Ri0 = Ci (5.4)
& (m)
'
(m+1)
X Ri
Ri = Ci + Cj (5.5)
Tj
j∈hp(i)
Où
(∗)
Si l'on note Ri la valeur du point xe, la condition nécessaire et susante
pour qu'un système soit ordonnançable par une aectation de priorité (RM ou
autre) est que :
(∗)
∀i ∈ [1, n] , Ri 6 Di (5.6)
5.2. Principaux tests d'ordonnançabilité 63
Analyse :
La suite converge si et seulement si U 61
Ce test est de complexité pseudo-polynomiale.
Conditions d'arrêt :
Exemple :
T1 =7 ; C1 =3 ; T2 =12 ; C2 =2 ; T3 =20 ; C3 =5
R10 = 3 ⇒ r1 = 3 (5.8)
R20 = 2 (5.9)
1 2
R2 = 2 + 3=5 (5.10)
7
2 5
R2 = 2 + 3 = 5 ⇒ R2 = 5 (5.11)
7
R30 = 5 (5.12)
5 5
R31
=5+ 3+ 2 = 10 (5.13)
7 12
2 10 10
R3 = 5 + 3+ 2 = 13 (5.14)
7 12
13 13
R33 = 5 + 3+ 2 = 15 (5.15)
7 12
4 15 15
R3 = 5 + 3+ 2 = 18 (5.16)
7 12
5 18 18
R3 = 5 + 3+ 2 = 18 ⇒ R3 = 18 (5.17)
7 12
64 Chapitre 5. Analyse du Temps de Réponse
Test d'ordonnançabilité :
L'idée est qu'il faut tester toutes les échéances des instances situées dans
la première période d'activité. On évalue ainsi l'activité cumulée des tâches de
priorités supérieures ou égales à τi :
(0)
Wi (k) = kCi (5.18)
(m+1)
X Wm
i
Wi (k) = kCi Cj (5.19)
Tj
j∈hp(i)
(∗)
Ri (k) = Wi (k) − (k − 1) Ti donne le temps de réponse de τi,k (i.e. k ieme
instance de τi ). On applique cette formule de la façon suivante : on commence à
k = 1(on a alors le même fonctionnement que).
(∗)
Si Ri (1) > Di , il y a violation d'échéance (on peut tout de même continuer
si l'on souhaite obtenir le pire temps de réponse).
(∗)
Si Ri (1) > Ti , la deuxième instance fait partie de la première période d'activité,
on termine donc pour k=1 , mais on sait qu'il faudra tester aussi k=2 .
(∗)
De même si Ri (2) > 2Ti , il faudra tester k = 3, etc. tant que on teste k + 1.
Le processus converge si et seulement si U 61 .
Chaque date de n d'instance τi,k est comparée à di,k .
def def
Si nous dénissons ki = min {k | Ri∗ (k) ≤ kTi } et Ri = maxk≤ki Ri∗ (k)
alors Ri∗ est le pire temps de réponse de la tâche τi . Donc, la condition nécessaire
et susante pour qu'un système soit ordonnançable par une aectation de priorité
5.3. Exercices 65
T2 20 2 20
T3 10 1 5
T4 10 3 10
(∗)
∀i ∈ [1, n] , Ri 6 Di (5.20)
Analyse :
Ce test est de complexité pseudo-polynomiale.
5.3 Exercices
Exercice 1
En utilisant l'analyse du temps de réponse, vériez si les tâches suivantes peuvent
être ordonnancées :
Prio(T1 ) < P rio(T2 ) < P rio(T3 ) < P rio(T4 )
Solution
Ordonnancement graphique :
w10 = C1 = 2 (5.21)
66 Chapitre 5. Analyse du Temps de Réponse
X w0
2
2
2
w11 = C1 + 1
Cj = 2 + 2+ 1+ 3=9 (5.22)
Pj 20 5 10
j∈hp(1)
X w0
8
8
8
w12 = C1 + 1
Cj = 2 + 2+ 1+ 3=9 (5.23)
Pj 20 5 10
j∈hp(1)
X w0
9
9
9
w13 = C1 + 1
Cj = 2 + 2+ 1+ 3=9 (5.24)
Pj 20 5 10
j∈hp(1)
R1 = 9 6 P1 = 20 (5.25)
w20 = C2 = 2 (5.26)
X w0
2
2
2
w11 = C1 + 1
Cj = 2 + 2+ 1+ 3=9 (5.27)
Pj 20 5 10
j∈hp(1)
X w0
2
2
w21 = C2 + 2
Cj = 2 + 1+ 3=6 (5.28)
Pj 5 10
j∈hp(2)
X w1
6
6
w22 = C2 + 2
Cj = 2 + 1+ 3=7 (5.29)
Pj 5 10
j∈hp(2)
X w2
7
7
w23 = C2 + 2
Cj = 2 + 1+ 3=7 (5.30)
Pj 5 10
j∈hp(2)
R2 = 7 6 P2 = 20 (5.31)
w30 = C3 = 1 (5.32)
X w0
1
w31 = C3 + 3
Cj = 1 + 3=4 (5.33)
Pj 10
j∈hp(3)
X w0
4
w32 = C3 + 3
Cj = 1 + 3=4 (5.34)
Pj 10
j∈hp(3)
R3 = 4 ≤ P3 = 5 (5.35)
R4 = 43 ≤ P4 = 10 (5.36)
5.3. Exercices 67
T2 40 10 2 0.25
T3 20 5 3 0.25
⇒ Ordonnançable
Exercice 2
En utilisant l'analyse du temps de réponse, vériez si les tâches suivantes peuvent
être ordonnancées :
Solution
3
X
Ui = 1 > 0.78 (5.37)
i=1
R1 = 80 = P1 (5.38)
R2 = 15 6 P2 = 40 (5.39)
R3 = 5 6 P3 = 20 (5.40)
⇒ Ordonnançable
Chapitre 6
Contents
6.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
6.2 Traitement en arrière plan des tâches apériodiques à
contraintes relatives . . . . . . . . . . . . . . . . . . . . . . . . 70
6.3 Traitement par serveur périodique des tâches apériodiques
en environnement à priorité xe . . . . . . . . . . . . . . . . 71
6.3.1 Serveur à scrutation . . . . . . . . . . . . . . . . . . . . . . . 72
6.4 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
6.1 Introduction
L'ordonnancement des tâches apériodiques est traité dans le cas des tâches
périodiques à contraintes strictes et des tâches apériodiques à contraintes relatives
ou à contraintes strictes (tâches sporadiques). Nous supposons que l'ordonnance-
ment des tâches périodiques se fait suivant les algorithmes RM, DM ou EDF. Pour
répondre à la demande d'événements déclenchant des tâches apériodiques, nous
pouvons considérer trois méthodes :
Cette méthode ne permet pas de traiter les tâches apériodiques strictes car le
temps de réponse de ces tâches traitées en arrière plan n'est pas borné. Aussi, cette
6.3. Traitement par serveur périodique des tâches apériodiques en
environnement à priorité xe 71
τ2 0 2 6 6
τ3 0 1 x x
τ4 4 4 x x
τ5 13 1 x x
Nous obtenons des temps de réponse qui sont fonction de la charge processeur
due aux tâches périodiques, des dates d'arrivée des tâches apériodiques et des durées
des traitements de ces tâches apériodiques. En connaissant la charge du système
par les tâches périodiques, il est possible d'évaluer le temps de réponse d'une tâche
apériodique en supposant connues sa date d'arrivée et sa durée d'exécution. Ainsi,
par dénition les ri des tâches apériodiques n'étant pas connus, il est nécessaire
de faire cette évaluation pour toute la séquence d'exécution de la conguration
(période d'étude H). Nous pouvons donc conclure que cette méthode de prise en
compte des tâches apériodiques ne peut concerner que les tâches à contraintes non
strictes, c'est-à-dire acceptant un temps de réponse non borné.
serveur égale à la durée de la tâche apériodiqueCs = Cap . Dans le cas où nous avons
requête apériodique stricte, caractérisée par une échéanceDap et une distance mi-
nimum entre deux occurrences successives de ∆min , les caractéristiques du serveur
(Ds , Ts ) peuvent être élaborées dans le cas le plus défavorable où l'activation du
serveur a été demandée mais annulée car l'événement n'était pas présent à l'instant
de l'activation et l'occurrence eective de l'événement se produit immédiatement
après avec un décalage très faible ∆t = ε. Dans ce cas extrême pour satisfaire les
contraintes temporelles attachées à cette requête, nous devons résoudre l'inéquation
suivante :
Si nous considérons le serveur comme une tâche périodique à échéance sur requête
(Ds =Ts ), nous avons la relation simpliée de l'équation précédente :
Dap
Ts ≤ (6.2)
2
Il est important de noter que cette dénition des paramètres temporels du serveur à
scrutation permet de borner le temps de réponse du service de la tâche apériodique
quel que soit sa date d'occurrence dans la séquence d'exécution. Le temps de réponse
est donc égal à :
De même que dans le cas des tâches périodiques gérées selon l'algorithme Rate
Monotonic, il est possible d'avoir une autre condition susante d'ordonnançabilité.
Soit un ensemble de n tâches périodiques T (τ1 ,τ2 , τ3 , . . . ,τi , . . . , τn ) dénies par
les paramètres temporels (ri , Ci , Di , Ti ) et un ensemble de p serveurs périodiques
(τs1 , τs2 , τs3 , . . . , τsi , . . . , τsn ) dénies par les paramètres temporels (rsi , Csi ,
Dsi , Tsi ), la conguration est ordonnançable si
74
Chapitre 6. Ordonnancement des Tâches Indépendantes Apériodiques
Table 6.2 Schéma d'adaptation d'un serveur à scrutation pour répondre à une
requête apériodique.
T ache apriodique Serveur scrutation
ri ? → 0
Ci Cap → Cs = Dap
Di Dap & Ds
Ti ∆ap Ts + Ds ≤ Dap
n p
X Ci X Cap,j 1
Utotal = U + Us = + 6 (n + p) 2 (n+p) − 1 (6.4)
Ti Tap,j
i=1 j=1
τ2 0 8 20 20
τs 0 1 5 5
τap,1 5 1 10 x
τap,2 2 2 15 x
quelle que soit la capacité utilisée. En donnant généralement une priorité forte au
serveur (tâche de période faible), cela permet de réduire le temps de réponse
moyen. Ainsi, l'exemple de la Figure 6.5 montre le principe du serveur ajournable
(évolution de sa capacité de traitement en fonction du temps) et son application
sur l'arrivée de requête apériodique stricte. Pour un serveur de caractéristiques tem-
porelles (0,Cs = 2, Ds = 4, τs = 4), seule la dernière tâche apériodique n'est pas
traitée immédiatement. Par rapport au serveur à scrutation, le temps de réponse à
la requête apériodique est réduit à son minimum puisque le serveur peut prendre
en compte cette tâche apériodique à tout instant de l'exécution. La seule condition
requise est que la capacité du serveur soit en adéquation avec la durée d'exécution
de la tâche apériodique. Considérons l'exemple de deux tâches périodiques, indé-
pendantes, à échéance sur requête et à départ simultané (Tableau 6.4).
Une troisième tâche périodique est ajoutée à la conguration pour traiter les
arrivées de tâches apériodiques strictes. La capacité de traitement des requêtes apé-
riodiques strictes de ce serveur ajournable est : une durée d'exécution de 2 (Cs =2).
Le facteur d'utilisation de la conguration complète est U = 0, 87, valeur supérieure
à la condition d'ordonnançabilité pour l'algorithme d'ordonnancement RM. La pé-
riode d'étude étant H = 168, il est nécessaire de tester l'ordonnançabilité de la
conguration sur cette durée. Il est aisé de vérier que la conguration de ces trois
tâches périodiques est ordonnançable avec l'algorithme RM. Dans ce test d'ordon-
nançabilité, il est important de remarquer que le serveur s'exécute à chaque réveil et
dès l'instant de son réveil étant donné sa priorité supérieure aux deux autres tâches.
τ2 0 8 8 8
τs 0 2 6 6
égal aux durées de traitements des tâches apériodiques strictes. Le serveur s'exé-
cute donc à des instants non prévisibles de sa période. En conséquence, le serveur
ayant une priorité forte et conservant sa capacité d'exécution au cours de sa pé-
riode, il y a contradiction avec l'algorithme d'ordonnancement : une tâche de
priorité forte activable doit s'exécuter . Ce problème peut conduire à des dépasse-
ments d'échéance. Ainsi, considérons trois requêtes d'exécution tâches apériodiques
strictes dénies par : τap,1 (rap,1 = 1, Cap,1 = 2), τap,2 (rap,2 = 7, Cap,2 = 2) et
τap,3 (rap,3 = 12, Cap,3 = 2). La Figure 6.7 montre l'acceptation immédiate de ces
requêtes apériodiques par le serveur ajournable. Cette acceptation à n'importe quel
instant de la séquence d'exécution conduit la tâche périodique τ2 à dépasser son
échéance. De même que dans le cas des tâches périodiques gérées selon l'algorithme
Rate Monotonic, il est possible d'avoir une autre condition susante d'ordonnança-
bilité dans le cas de l'algorithme RM associé au serveur ajournable. Soit un ensemble
de n tâches périodiques (τ1 , τ2 , τ3 , . . . , τi , . . . , τn ) dénies par les paramètres tempo-
rels (ri , Ci , Di , Ti ) et un serveur périodique ts dénie par les paramètres temporels
(rs , Cs , Ds , Ts ) avec Us = C s
Ts , la conguration est ordonnançable si :
n
X Ci Us + 2
U= ≤ ln (6.5)
Ti 2Us + 1
i=1
Avec
Cs
Us = (6.6)
Ts
Donc le facteur de charge total est donné par :
n
X Ci Us + 2
Utotal =≤ U + Us = + ln (6.7)
Ti 2Us + 1
i=1
n
X Ci 2
U= ≤ ln (6.8)
Ti Us + 1
i=1
Donc, le facteur de charge total est donné par :
n
X Ci 2
Utotal =≤ U + Us = + ln (6.9)
Ti Us + 1
i=1
6.4 Exercices
Exercice 1
Exemple de serveur par scrutation (ordonnancement RM)
3
X Ci 3 2 2
= + + = 0.75 6 n 21/n − 1 (6.10)
Pi 20 5 10
i=1
6.4. Exercices 81
τ2 0 2 10 10
τs 0 2 5 5
Exercice 2
τ2 0 2 10 10
τs 0 2 5 5
τa3 4 2 x x
τa4 10 1 x x
τa5 11 2 x x
Contents
7.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
7.2 Système d'exploitation et noyau . . . . . . . . . . . . . . . . 84
7.2.1 Boucle d'interrogation . . . . . . . . . . . . . . . . . . . . . . 85
7.1 Introduction
Un système d'exploitation temps réel, en anglais RTOS pour real-time opera-
ting system (prononcé Are-toss) est un système d'exploitation multitâche destiné
aux applications temps réel. Ces applications comprennent les systèmes embarqués
(thermostats programmables, contrôleurs électroménagers, téléphones mobiles), des
robots industriels, les vaisseaux spatiaux, les systèmes de contrôle commande in-
dustriel, et le matériel de recherche scientique. Un RTOS facilite la création d'un
système temps réel, mais ne garantit pas que le résultat nal respecte les contraintes
temps réel, ce qui exige le développement correct du logiciel.
Un RTOS n'a pas nécessairement pour but d'être performant et rapide, mais un
RTOS fournit des services et des primitives qui, si elles sont utilisées correctement,
peuvent garantir les délais souhaités. Un RTOS utilise des ordonnanceurs spécialisées
an de fournir aux développeurs des systèmes temps réel les outils et les primitives
nécessaires pour produire un comportement temps réel souhaité dans le système
nal.
Un système d'exploitation temps-réel est une catégorie de sys. d'exploitation per-
mettant la programmation et l'exécution de tâches temps-réel. - Il ne dière pas
fondamentalement d'un OS standard "non" temps-réel.
- Il est généralement plus simple, plus petit (car destiné à être embarqué) et ore
moins de confort au niveau du développement. Un OS temps-réel permet de gérer
84 Chapitre 7. Noyau Temps Réel
tion commerciaux.
Pourquoi utiliser/concevoir un OS en temps réel ?
- Permet de mieux utiliser les ressources
Traitement parallèle / Programmation concurrente
- Facilite le développement Programmation par tâche (thread) / Diviser pour
régner
- Plus robuste
Gestion des accès aux ressources / Gestion des tâches
Caractéristiques :
- Noyau temps réel le plus simple.
- L'ordonnancement est codé directement et est xe (séquence de l'interrogation).
- Le répartiteur est codé directement et est xe (boucle d'interrogation → liste des
tâches, appel des tâches → sauvegarde du contexte).
- Communication inter-tâche par passage de paramètres et/ou variables globales.
Temps de réponse :
86 Chapitre 7. Noyau Temps Réel
Avantages :
- est simple à concevoir et à déverminer.
- est robuste.
- est excellente pour traiter des canaux de communication de grande vitesse.
Désavantages :
- ne permet pas de traiter les rafales d'évènements.
- n'est pas adaptés aux systèmes compliqués.
- gaspille beaucoup de temps de processeurs (facteur d'utilisation du CPU faible).
- ne permet pas la superposition d'évènements.
- lorsque plusieurs tâches à gérer, le temps de réponse devient rapidement exagéré.
Avantages :
- Simplie la conception du système en divisant le travail en une série de tâches
indépendantes ou quasi-indépendantes.
- Le nombre de tâche ne doit pas être obligatoirement connu à l'avance.
- Temps de réponse assez bon et facile à déterminer.
88 Chapitre 7. Noyau Temps Réel
Désavantages :
- Exige de diviser les tâches en phases/états, ce qui n'est pas toujours possible ou
facile à faire.
- Les tâches doivent être divisé en morceaux de taille uniforme.
- Le temps de réponse dépend directement de la phase la plus longue.
- Chaque tâche/phase/état sont de priorité égale.
Comme principal défaut par rapport aux noyaux commerciaux, précisons que
mCOS-II ne gère pas l'algorithme de Round-Robin permettant à deux tâches de
même priorité de partager l'usage du CPU. On est ici obligé de ne permettre qu'une
seule tâche par niveau de priorité.
MicroC/OS-II est une bibliothèque qui est liée avec l'application à développer
Les services de MicroC/OS-II sont appelés depuis l'application comme des
fonctions
Le code source est divisé en 2 sections :
Indépendant du processeur
Dépendant du processeur
Le chier INCLUDES.H
C'est un chier qui fait appel à tous les autres chiers bibliothèques de µC
et de BC
Voici un exemple :
90 Chapitre 7. Noyau Temps Réel
Le chier UCOS_II.H
C'est un chier qui dénit les prototypes des fonctions, les codes erreur, les
constantes, les structures de données pour les ags, les mailboxes,. . .
Voici un exemple :
Le chier UCOS_II.C
C'est un chier qui contient les include des autres chiers .c tels que
OS_TASK.C ou OS_MEM.C dans le répertoire SOFTWARE
Voici un exemple :
OS_MBOX.C,. . . .
Chacun de ces chiers concerne la gestion des ensembles de services reliés
aux tâches, à la mémoire,
Dans uC/OS :
Dans uC/OS-II :
Exemple :
Les événements sont utilisés pour signaler des tâches multiples, et sont généralement
groupés. On parle alors de groupe de event ag
Une tâche est reprise quand tous les événements (les bits du event ag) la concernant
sont satisfaits. Lorsqu'un nouvel ensemble d'événements à lieu (par exemple pendant
une opération de post), la tâche qui va être reprise sera alors choisie.
Pour minimiser les changements dans le noyau Linux, les concepteurs ont émulé
le contrôleur d'interruptions matériel. Ainsi, quand Linux masque une interruption,
celle-ci est quand même prise en compte par RTLinux et aiguillée vers une le
d'attente si elle n'est pas utile au niveau du micro-noyau. Lorsque Linux rétablit la
possibilité de traiter les interruptions, celles arrivées entre temps sont disponibles et
peuvent être traitées par la routine de gestion d'interruptions de Linux. Les codes
assembleurs des processeurs i486 cli, sti et iret sont remplacés dans le noyau Linux
7.5. Le noyau temps réel VXWorks 95
Méthode SA-RT
Contents
8.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
8.2 Spécication selon la méthode SA-RT . . . . . . . . . . . . . 98
8.3 Présentation de la syntaxe graphique de la méthode SA-RT 100
8.3.1 Syntaxe graphique pour l'aspect fonctionnel . . . . . . . . . 100
8.1 Introduction
La méthode SA-RT est une méthode d'analyse fonctionnelle et opérationnelle
des applications de contrôle-commande. Cette méthode permet de réaliser une des-
cription graphique et textuelle de l'application en termes de besoins, c'est-à-dire
de ce que l'on a à faire ou le quoi ( What ?). Cette mise en forme du
cahier des charges de l'application est formelle dans le sens où la méthodologie
(ensemble des documents à élaborer) et l'expression (syntaxe graphique) sont dé-
nies. En revanche, elle ne permet pas d'eectuer une vérication de propriétés de
l'application à partir des seules descriptions SA-RT. Des études ont été menées pour
associer à la méthode SA-RT des méthodes formelles an d'apporter des possibilités
de simulation et de vérication. Une de ces méthodes est présentée à la n du cha-
pitre. Aucune règle ocielle ou normalisation n'a été mise en place pour la méthode
SA-RT et son utilisation. Par conséquent, il existe de nombreuses mises en ÷uvre
de la méthode SA-RT avec des diérences plus ou moins importantes et aussi des
extensions spéciques de la méthode. Ceci fera l'objet du dernier point traité dans
ce chapitre.
98 Chapitre 8. Méthode SA-RT
Processus est représenté par un cercle avec une étiquette ou label explicite formé de :
Puis, nous avons le Flot de Données qui supporte ou transporte les valeurs
d'une certaine information à diérents instants. Ce concept représente le chemine-
ment des données. Le ot de données est représenté par un arc orienté avec une
étiquette ou label explicite formé de (Figure 8.4) :
Une spécication détaillée de cette donnée, véhiculée par le ot de données, est
faite dans le Dictionnaire de données (voir ci-après).
Ces ots de données peuvent se décomposer ou au contraire se regrouper lors
des liaisons entre les processus fonctionnels dans le diagramme ot de données.
SA-RT.
complètes. Si une partie de la donnée est écrite ou lue, l'arc transportant de façon
partielle la donnée doit être étiqueté avec le nom de cette donnée.
Enn, le dernier élément graphique, utilisé dans cet aspect fonctionnel, est la
Terminaison , ou encore appelée bord de modèle , qui représente une en-
tité extérieure échangeant des données avec le système modélisé. Une terminaison
peut donc être une entité logicielle (programme, base de données. . . ) ou matérielle
(capteurs, actionneurs, console opérateur. . . ).
Figure 8.10 Pilotage de l'exécution d'un processus fonctionnel : (a) piloté par
Figure 8.12 Exemple simple d'une partie contrôle liée à une partie fonctionnelle
de la méthode SA-RT
Les deux premiers événements sont utilisés ensemble E/D pour piloter un
processus fonctionnel de type boucle sans n ou périodique, c'est-à-dire que le
processus de contrôle doit lancer l'exécution de ce processus avec l'événement E
et ensuite peut l'arrêter avec l'événement D . L'événement T est utilisé pour
activer un processus fonctionnel de type début-n ou sporadique, c'est-à-dire
que le processus de contrôle doit lancer l'exécution de ce processus avec l'événement
T et ensuite le processus s'arrête à la n de son exécution sans intervention du
contrôle.
Considérons un système de freinage automobile qui est constitué d'une part d'un
ensemble classique composé d'une pédale de frein (demande de freinage) et d'un frein
(actionneur de freinage) et d'autre part d'un système ABS (Anti-blocking Brake
System).
Un capteur de glissement de roues est associé à ce système ABS. Pour simplier,
le fonctionnement de l'ABS est basé sur un arrêt du freinage dès qu'un glissement
est détecté sur les roues, et cela même si la demande du conducteur est toujours
eective.
Le conducteur a la possibilité d'activer ou non ce système ABS à l'aide d'un bouton
spécique (bouton à deux positions stables : interrupteur). Un voyant permet de lui
indiquer l'activation du système ABS. En revanche, il n'est pas possible de désactiver
le système ABS en cours de freinage, c'est-à-dire pendant l'appui sur la pédale de
frein.
La spécication fonctionnelle de cette application à l'aide de la méthode SA-RT va
s'eectuer en plusieurs étapes :
Diagramme de contexte ;
Diagramme préliminaire ;
Diagrammes de décomposition.
SA-RT.
tomobile .
pouvons aussi trouver un motif générique permettant de décrire une fonction simple
ou complexe de contrôle-commande en la divisant selon les trois éléments de base,
soit :
un processus d'acquisition ;
un processus de traitement (loi de régulation) ;
un processus de commande.
Le passage des données entre les processus fonctionnels peut être réalisé selon
les besoins avec les deux méthodes de base : ots de données direct (exemple entre
les processus 2 et 3) ou unité de stockage (cas des processus 1 et 2).
Ainsi, dans l'exemple simple d'un système de freinage automobile, le diagramme
préliminaire est constitué de cinq processus fonctionnels. Au niveau de cet exemple
simple, nous n'avons pas une décomposition fonctionnelle aussi complexe que
l'exemple générique présenté précédemment : seules les parties acquisition et
commande sont présentes dans le cas du contrôle-commande du freinage et du
bouton ABS. Nous pouvons souligner immédiatement la cohérence obligatoire entre
le diagramme de contexte et ce diagramme préliminaire au niveau des ots de
donnéesentrants et sortants.
Le passage des données entre les processus fonctionnels est eectué de façon directe.
Il est important de noter que la donnée Niveau_freinage est de type entier ou
réel alors que les données Etat_glissement et Etat_bouton_ABS sont de
type booléen. Cela va entraîner dans la suite de cette analyse une modication de
ce diagramme préliminaire.
Cette décomposition fonctionnelle en diagrammes ots de données peut se pour-
suivre en ranant de plus en plus la description des processus fonctionnels. Chaque
diagramme de décomposition, associé à un processus fonctionnel numéroté
N
du diagramme hiérarchiquement supérieur, est référencé au niveau des processus
fonctionnels par des numéros N.x . L'exemple simple système de freinage
automobile choisi pour illustrer la méthodologie n'est pas assez complexe pour
justier la décomposition d'un des processus fonctionnels. Donc tous les processus
fonctionnels du diagramme préliminaire de la Figure 8.16 sont des processus
primitifs. Lorsqu'il n'y a plus d'intérêt à décomposer un processus, celui-ci est
appelé processus primitif et doit être décrit par une spécication sous forme
textuelle, tabulaire ou graphique (voir ci-après). Nous pouvons énoncer les deux
premières règles de cohérence de cette décomposition hiérarchique :
l'ensemble des ots entrants et sortants du processus décomposé doit se retrouver
dans le diagramme de décomposition de ce processus avec les mêmes typages
(données ou événements) ;
de freinage automobile .
Chapitre 9
Contents
9.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
9.2 Conception selon la méthode DARTS . . . . . . . . . . . . . 114
9.2.1 Les besoins d'une méthode de conception . . . . . . . . . . . 114
9.1 Introduction
La méthode de conception va permettre de passer d'un modèle de spécication
aux programmes codés dans un langage exécutable. Étant donné l'analyse de type
fonctionnel et structuré qui a été réalisée avec la méthode SA-RT, nous pourrions
être tentés de traduire directement ces modules fonctionnels (processus fonctionnels
des diagrammes ots de données de SA-RT) en des entités de programmes. Cette
approche serait très néfaste pour deux raisons :
d'une part, le découpage modulaire de l'application a été fait en se préoccu-
pant essentiellement des fonctions à réaliser et non pas de la structuration
ecace en termes de réalisation et d'exécution, c'est-à-dire que le nombre
de tâches de l'application ne correspond pas obligatoirement au nombre de
processus fonctionnels des diagrammes SA-RT ;
d'autre part, les relations entre les processus fonctionnels des diagrammes
ots de données sont décrites de manière très abstraite (zone mémoire, pas-
sage de données) sans se préoccuper de leurs implémentations possibles avec
ou sans synchronisation. La question qui se pose concerne le choix de cette
méthode. En eet, il serait tout à fait envisageable, comme nous l'avons vu
dans les exemples industriels du paragraphe 1.3.4, d'associer une méthode
d'analyse de type ot de données à une méthode de conception de type
orienté objets . En revanche, le choix de l'une ou l'autre voie amène quasi
obligatoirement un choix de langage. Ainsi, la Figure 9.1 représente les choix
possibles selon les deux groupes de méthodes de conception. La méthode
DARTS (Design Approach for Real-Time Systems
114 Chapitre 9. Conception Selon La Méthode DARTS
L'architecture donnée sur la Figure 9.2, c'est-à-dire les diérentes tâches, les
relations entre les tâches et la possibilité d'accès à des ressources critiques. Ainsi,
nous pouvons donc décliner les diérentes caractéristiques à représenter avec la
méthode DARTS :
les tâches : type d'activation, paramètres ou données en entrées ou en sorties ;
les relations entre les tâches : synchronisation de type asynchrone ou
synchrone (rendez-vous),
9.2. Conception selon la méthode DARTS 115
DARTS
Le point le plus complexe est la traduction des diérentes relations entre les
tâches. En eet, cette relation traduit un lien de dépendance entre les tâches ,
c'est-à-dire qu'une ou plusieurs tâches ne commencent leur exécution uniquement
que lorsqu'une autre tâche s'est exécutée en partie ou en totalité. Cette synchro-
nisation ou communication peut être unilatérale ou asynchrone (seule la tâche en
attente est bloquée), ou bilatérale ou synchrone (les deux tâches ont un rendez-vous,
exemple du langage Ada). La Figure 9.2 montre cette diérence de relations de syn-
chronisation entre deux tâches. Dans le premier cas I de la relation asynchrone, la
tâche 1 bloque la tâche 2 qui doit attendre l'exécution d'une partie de la tâche 1
en un certain point de son code ; en revanche, dans le second cas, les deux tâches
doivent s'attendre mutuellement.
Attachée à cette synchronisation de deux ou plusieurs tâches, un transfert de don-
nées peut être associé, nous parlons alors de communication. Une communication
est caractérisée par la taille de cette zone d'échange de données (une ou plusieurs
données) et le mode de gestion de cette zone de données (FIFO First In Fisrt Out,
à priorité). Le critère principal, lié à cet échange de données, est l'aspect bloquant ou
non de l'interaction entre les tâches. Si la production et la consommation de données
sont synchronisées, c'est-à-dire que, si la zone de données est vide, la tâche consom-
matrice ne peut s'exécuter et réciproquement, si la zone de données est pleine, la
tâche productrice ne peut s'exécuter. Nous avons dans ce cas une communication
mettant en jeu une vraie synchronisation entre les tâches. Dans le cas contraire, la
116 Chapitre 9. Conception Selon La Méthode DARTS
Nous allons présenter dans cette section les diérents éléments de la bibliothèque
graphique de la méthode DARTS correspondant à la phase de conception.
En premier lieu, nous trouvons la tâche qui représente l'entité de base de l'archi-
tecture multitâche. Nous pouvons avoir un ou plusieurs ots de données en entrées
et un ou plusieurs ots de données en sortie. Les tâches sont modélisées par un
parallélogramme qui comporte une étiquette ou label explicite formé de :
SA-RT s'il y a, par exemple, une correspondance entre une tâche et un processus
fonctionnel comme nous allons l'étudier dans la suite de ce chapitre. Nous avons aussi
un signal d'activation qui a une provenance et un type diérents selon que nous mo-
délisons une tâche matérielle (activation de type événement externe au programme)
ou une tâche logicielle (activation de type événement interne au programme : syn-
chronisation ou communication). Ce signal d'activation doit obligatoirement exister
et doit être unique pour répondre au prol de conception xé.
Cette étiquette peut correspondre à celle donnée dans le cadre d'un diagramme
ots de données Nous avons aussi le module de traitement qui correspond à des
programmes spéciques appelés par les tâches pour eectuer des calculs particuliers.
Nous pouvons avoir un ou plusieurs ots de données en entrées et un ou plusieurs
9.3. Présentation de la méthode DARTS 119
ots de données en sortie (Figure 9.6). Les modules de traitement sont modélisés
par un rectangle qui comporte une étiquette ou label explicite formé de :
Ces modules ne peuvent pas émettre ou recevoir des éléments de type multitâche :
synchronisation ou communication. Ils peuvent être considérés comme réentrants,
c'est-à-dire partagés par plusieurs tâches sans mettre en ÷uvre une gestion spéciale
de l'accès. Ces modules concernent généralement des calculs de type traitement du
signal, traitement d'images, loi de régulation de l'automatique. . . Cette séparation
des unités de traitement permet de ne pas alourdir les tâches en termes de code et
d'y conserver uniquement l'aspect dynamique et comportemental.
Cette synchronisation peut relier plusieurs tâches en amont d'une tâche syn-
chronisée en considérant une opération OU entre toutes les synchronisations en
provenance des tâches en amont. Rappelons qu'il n'est pas souhaitable d'avoir deux
synchronisations à l'entrée d'une tâche ; cela correspondrait alors à deux activations
de la tâche, ce qui est contraire au prol de programmation énoncé.
Nous pouvons ainsi distinguer deux types de gestion de la zone de stockage des
données d'un point de vue dépendance (relation synchrone ou non) :
les boîtes aux lettres bloquantes qui se déclinent en trois modèles : boîtes
aux lettres bloquantes pouvant contenir n messages gérés selon une le
FIFO,
boîtes aux lettres bloquantes ne pouvant contenir qu'un seul message,
boîtes aux lettres bloquantes pouvant contenir n messages gérés selon une
le FIFO, classés par priorités correspondantes généralement à celle de la
tâche émettrice de la donnée ;
les boîtes aux lettres non bloquantes en écriture ou BAL à écrasement qui se
déclinent en deux modèles : boîtes aux lettres non bloquantes en écriture
pouvant contenir n messages gérés selon une le FIFO,
boîtes aux lettres non bloquantes en écriture ne pouvant contenir qu'un
seul message.
périodique.
Signal Interruption IT . Ce signal qui provient du procédé externe doit
toujours être considéré comme apériodique du fait de l'asynchronisme du
monde extérieur par rapport au cadencement de l'ordinateur.
Signal Chien de garde CG . Ce signal provient d'une horloge interne
utilisée comme un réveil. Son utilisation et son fonctionnement sont décrits
de façon détaillée dans la suite de cet ouvrage. En termes de signal, il est
identique à l'horloge temps réel (signal interne) ; mais il se produit de façon
apériodique.
Les activations sont donc représentées par un symbole orienté (ligne brisée) avec
une étiquette ou label explicite formé de (Figure 9.9) :
Figure 9.8 Représentations des communications entre les tâches avec entrées
multiples de type OU .
Comme nous l'avons déjà explicité, les tâches logicielles sont déclenchées par
d'autres tâches (matérielles ou logicielles) avec les mécanismes de synchronisation
122 Chapitre 9. Conception Selon La Méthode DARTS
boîtes aux lettres à écrasement ou non gérées selon une le FIFO ou FIFO à
priorité ;
boîtes aux lettres à écrasement ou non à une seule place ;
boîtes aux lettres à n places gérées selon la priorité.
Ainsi, nous pouvons noter qu'une tâche logicielle ne peut pas être activée par
un élément de synchronisation et en même temps être connectée à une autre tâche
en amont par une boîte aux lettres à écrasement, c'est-à-dire bloquante en lecture
(Figure 9.11). Ainsi, la tâche Commander vanne doit être synchronisée soit par
la tâche matérielle Attendre mesures qui est activée par une interruption, soit
par l'autre tâche matérielle Acquérir niveau , dite à scrutation, qui est périodique
et activée par l'horloge temps réel dont la période est de 350 ms.
9.3. Présentation de la méthode DARTS 123
tâches.
sieurs tâches
Pour cette méthode de conception non formelle, nous allons dénir des règles
générales permettant de passer d'un diagramme ots de données de la méthode SA-
RT à un diagramme multitâche DARTS. Pour cela, nous devons réaliser la traduction
selon les quatre phases suivantes :
Nous pouvons noter les noms des diérents éléments qui sont conservés autant
que possible. Cette tâche matérielle est donc une tâche d'acquisition de données dite
à scrutation. La transmission de la donnée Commande_moteur est traduite par
une boîte aux lettres à n places conformément à la préconisation de la règle 3.1.
Dans l'exemple de la Figure 9.15, nous avons aussi un processus fonctionnel cor-
respondant à l'acquisition de données provenant de deux capteurs (thermocouple
et capteur rotatif ). D'après la règle 2.1, ce processus fonctionnel se transforme en
une tâche matérielle d'entrée qui va être activée par une interruption (Dépasse-
ment_température) qui est issue de la mesure du capteur de température. La tâche
128 Chapitre 9. Conception Selon La Méthode DARTS
Figure 9.16 Traduction d'un ot de données direct entre deux processus fonc-
Figure 9.17 Traduction d'une unité de stockage entre deux processus fonctionnels
FreeRTOS
Contents
10.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
10.2 Tâche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
10.2.1 Tâche FreeRTOS . . . . . . . . . . . . . . . . . . . . . . . . . 134
10.1 Introduction
Le FreeRTOS est un système d'exploitation temps réel (RTOS) pour les
microcontrôleur. Développé en partenariat avec les principaux fabricants de puces
au monde sur une période de 15 ans, et maintenant téléchargé toutes les 175
secondes, FreeRTOS est un système d'exploitation en temps réel (RTOS) leader
du marché pour les microcontrôleurs et les petits microprocesseurs. Distribué
gratuitement sous la licence open source du MIT, FreeRTOS comprend un noyau et
132 Chapitre 10. FreeRTOS
un ensemble croissant de bibliothèques IoT adaptées à une utilisation dans tous les
secteurs industriels. FreeRTOS est construit en mettant l'accent sur la abilité et
la facilité d'utilisation. FreeRTOS est un système d'exploitation temps réel (RTOS)
faible empreinte, portable, préemptif et Open source pour microcontrôleur. Il a
été porté sur 33 architectures diérentes. Créé en 2003 par Richard Barry et
la FreeRTOS Team, il est aujourd'hui parmi les plus utilisés dans le marché des
systèmes d'exploitation temps réel.
FreeRTOS est disponible gratuitement sous une licence MIT depuis le 29 novembre
2017. Les versions précédentes étaient disponibles sous licence GPL modiée et
utilisable sans paiement de redevances, cette licence n'oblige pas les développeurs
à publier le code de leurs logiciels applicatifs mais impose de garder le noyau
de FreeRTOS Open Source. Une licence commerciale avec le support ad hoc
(OpenRTOS) est également proposée par la société High Integrity Systems. Le
nombre de tâches exécutées simultanément et leur priorité ne sont limités que
par le matériel. L'ordonnancement est un système de le d'attente basé sur les
Sémaphores et les Mutex. Il est basé sur le modèle Round-Robin avec gestion des
priorités. Conçu pour être très compact, il n'est composé que de quelques chiers
en langage C, et n'implémente aucun pilote matériel.
Les domaines d'applications sont assez larges, car les principaux avantages de
FreeRTOS sont l'exécution temps réel, un code source ouvert et une taille très
faible. Il est donc utilisé principalement pour les systèmes embarqués qui ont des
contraintes d'espace pour le code, mais aussi pour des systèmes de traitement vidéo
et des applications réseau qui ont des contraintes "temps réel".
FreeRTOS un système d'exploitation temps réel libre et open source3 originellement
développé par Real Time Engineers Ltd. FreeRTOS est un système d'exploitation
embarqué multitâches temps réel préemptif supporte actuellement 35 architectures.
Nous allons utiliser un RTOS conforme à la spécication RTOS de la norme
CMSIS (Cortex Microcontroller Interface Standard). Cette spécication dénit
une API RTOS standard à utiliser avec les microcontrôleurs basés sur Cortex-M.
CMSIS-RTOS est une API commune aux systèmes d'exploitation temps réel, elle
fournit toutes les fonctionnalités dont nous aurons besoin pour développer un
application temps réel.
10.2 Tâche
Dans FreeRTOS, chaque tâche est décrite par un TCB (Task Control Block)
qui contient toutes les informations nécessaires an de spécier et de représenter
une tâche. Les tâches sous FreeRTOS peuvent exister sous 5 états : "supprimé",
"suspendu", "prêt", "bloqué" ou "en exécution" Dans FreeRTOS, il n'y a au-
cune variable pour spécier explicitement l'état d'une tâche, en contrepartie FreeR-
TOS utilise des listes d'états. La présence de la tâche dans un type de listes d'états
détermine son état (prêt, bloqué ou suspendu). Les tâches changeant souvent d'état,
10.2. Tâche 133
Variables Description
pxTopOfStacks Pointeur vers le dernier élément placé en haut de la pile
xGenericListItem Élément (xListItem) de la liste utilisé pour placer la TCB dans une liste
d'états (Prêt, bloqué ou suspendu).
xEventListItem Élément (xListItem) de la liste utilisée pour placer la TCB dans une liste
d'évènements.
pcTaskName Nombre s'incrémentant à chaque fois qu'une TCB est créée (utilisé pour
le débogage)
pxTaskTag Permet d'ajouter un Tag à une tâche. Le Tag s'utilise pour réaliser des
Log via les sorties analogique ou digitales grâce à la fonction traceSWIT-
CHED _IN().
État d'une tâche Une tâche FreeRTOS peut se trouver dans l'un des états sui-
vants : Prête (Ready) : une tâche qui possède toutes les ressources nécessaires à son
exécution. Elle lui manque seulement le processeur. Active (Running) : Tâche en
cours d'exécution, elle est actuellement en possession du processeur. Attente (Blo-
cked) : Tâche en attente d'un événement (queue de messages, sémaphores, timeout
...). Une A l'arrivé de l'événement, la tâche concernée repasse alors à l'état prêt.
Suspendu (Suspend) : tâche à l'état dormant ; elle ne fait pas partie de l'ensemble
10.2. Tâche 135
10.2.4 Ordonnancement
sont dans l'état prêt , laquelle exécuter. Pour faire ce choix, l'ordonnanceur de
FreeRTOS se base uniquement sur la priorité des tâches.
Dans le cas d'un micro-contrôleur possédant un seul c÷ur, il y aura à tout mo-
ment une seule tâche en exécution. L'ordonnanceur garantira toujours que la tâche
de plus haute priorité pouvant s'exécuter sera sélectionnée pour entrer dans l'état
d'exécution. Si deux tâches partagent le même niveau de priorité et sont toutes les
deux capables de s'exécuter, alors les deux tâches s'exécuteront en alternance par
rapport aux réveils de l'ordonnanceur (round robin).
An de choisir la tâche à exécuter, l'ordonnanceur doit lui-même s'exécuter et pré-
empter la tâche en état d'exécution. An d'assurer le réveil de l'ordonnanceur,
FreeRTOS dénit une interruption périodique nommé la "tick interrupt". Cette
interruption s'exécute inniment selon une certaine fréquence qui est dénie dans le
chier FreeRTOSCong.h par la constante :
Cette constante décrit alors la période de temps allouée au minimum pour chaque
tâche ou expliqué autrement, l'intervalle séparant deux réveils de l'ordonnanceur.
Comme décrit dans cette section, FreeRTOS est donc un RTOS qui utilise un or-
donnancement préemptif pour gérer les tâches. Néanmoins il peut aussi utiliser op-
tionnellement (si la directive lui est donnée) l'ordonnancement coopératif. Dans ce
mode d'ordonnancement, un changement de contexte d'exécution a lieu uniquement
10.2. Tâche 137
10.2.5 Priorité
La priorité est un nombre donné à une tâche lorsqu'elle est créée ou modiée
manuellement à l'aide de primitive osThreadSetPriority. Le nombre maximum de
priorités est déni par CMSIS RTOS à osPriorityRealtime.
Les tâches d'égale priorité sont traitées de manière égale par l'ordonnanceur ; il
choisit à chaque quantum de temps une tâche selon l'algorithme round robin.
138 Chapitre 10. FreeRTOS
Une tâche est une fonction dont le traitement se trouve dans une boucle innie.
pthread Dénit la priorité à laquelle la tâche sera exécutée. CMSIS RTOS dénie
les priorités suivantes :
- osPriorityNormal = 0
- osPriorityAboveNormal = +1
- osPriorityHigh = +2
- osPriorityRealtime = +3
Exemple :
Obtenir l'identicateur de la tâche en cours d'exécution
Exemple :
10.2.8.1 osDelay
10.2.8.2 osDelayUntil
La fonction osDelay n'est pas précise. Si on veut bloquer une tâche à des
intervalles de temps réguliers, il vaut mieux utiliser la primitive osDelayUntil.
Cette fonction spécie le temps absolu pendant lequel la tâche va se débloquer.
10.2.8.3 osThreadSetPriority
10.2.8.4 osThreadGetPriority
10.2.9.1 osKernelStart
Paramètres :
name : nom du message
Queue_sz : nombre maximum de message à placer dans la Queue
Type : type de message : entier, structure. . .
Exemple : osMessageQDef(myQueue01, 10, uint16_t) ;
Il reste maintenant de créer le Message Queue :
myQueue01Handle = osMessageCreate(osMessageQ(myQueue01),NULL) ;
Cette fonction retourne l'identicateur du Message Queue ou NULL en cas d'erreur.
10.2.10.1 osMessagePut
Une fois le Message Queue est créé, il est possible déposer des informations
dans la le de massage :
osStatus osMessagePut (osMessageQId queue_id, uint32_t info,
uint32_t millisec)
10.3. Gestion des ressources 145
10.2.10.2 osMessageGet
binaires peuvent être vus comme des les ne pouvant contenir qu'un seul élément.
Un Sémaphore binaire ne pourra donc être pris qu'une seule fois avant qu'il ne
devienne indisponible contrairement au Sémaphore à n éléments qui pourra être pris
à plusieurs reprises ce qui permet par exemple, de dénir un nombre de ressources
disponibles ou alors de compter le nombre d'événements qui doit être encore exécuté.
Le sémaphore est la méthode la plus utilisée pour restreindre l'accès à des res-
sources partagées ou synchroniser les processus dans un environnement de program-
mation concurrente. Un sémaphore est un conteneur de jetons ; une tâche peut
acquérir un jeton à travers une primitive système ; si le sémaphore contient un ou
plusieurs jetons, les tâches continues sont exécution et le nombre de jetons se décré-
mente. S'il n'y a aucun jeton dans le sémaphore, la tâche se met à l'état d'attente
jusqu'à la libération (remise) d'un jeton par une autre tâche. À tout moment, une
tâche peut remettre (ajouter) un jeton au sémaphore, ce qui entraine l'incrémenta-
tion de son compte.
10.3.1.1 osSemaphoreCreate
10.3.1.2 osSemaphoreWait
10.3.1.3 osSemaphoreRelease
10.3.2 Mutex
partagée. Les sémaphores binaires et les mutex sont très similaires ; les Mutex
incluent un mécanisme d'héritage de prioritaire, les sémaphores binaires ne le
font pas. Cela fait des sémaphores binaires le meilleur choix pour implémenter
la synchronisation entre les tâches, et les mutex pour implémenter une simple
exclusion mutuelle.
Un Mutex est utilisé an de protéger une ressource partagée.
Figure 10.31 Schéma d'utilisation d'un Mutex pour assurer l'exclusion mutuelle
L'implémentation des Mutex dans FreeRTOS est similaire à celle des Séma-
phores binaires (sous la forme d'une le) sauf que la tâche qui prend le Mutex doit
obligatoirement le rendre. Cela peut être vu comme l'association d'un jeton à une
ressource, une tâche prend le jeton et utilise la ressource puis rend le jeton à la
n, au même moment aucun autre jeton supplémentaire ne pourra être associé à la
tâche.
Une autre diérence majeure entre les Mutex et les Sémaphores binaires dans
FreeRTOS est le système d'héritage de priorité. Quand plusieurs tâches demandent
à prendre un Mutex, la priorité du détenteur du Mutex est xée momentanément à
10.3. Gestion des ressources 149
la valeur de la plus haute priorité parmi les tâches qui attendent sa libération. Cette
technique a pour eet de prévenir les phénomènes à risques d'inversion de priorité
même si cela ne garantit pas une sécurité infaillible face à ces phénomènes.
Pour utiliser les mutex, il faut déclarer la variable mutex et l'initialiser :
10.3.2.1 osMutexCreate
Crée un mutex
10.3.2.2 osMutexWait
10.3.2.3 osMutexRelease
Soient trois tâches TaskA (haute priorité), TaskB et TaskC (Basse priorité) et
R une ressource partagée par les trois tâches. Supposons que TaskC est en possession
de la ressource R ; TaskC est préemptée par TaskA plus prioritaire, lorsque TaskA
souhaite prendre la ressource R elle sera bloquée à cause de la non disponibilité de
R (déjà pris par TaskC), dans ce cas TaskB peut être exécutée si elle est prête. Ce
phénomène est appelé inversion de priorité.
Pour pallier ce défaut, on attribue à la tâche en possession de ressource (TaskC),
la priorité de la tâche la plus prioritaire des tâches demandant la ressource (héritage
de priorité). Dans ce cas, lorsque TaskA est bloquée, c'est la TaskC qui reprend son
exécution et non pas TaskB (TaskC à la même priorité que TaskA). TaskC revient
à sa priorité ordinaire quand elle sort de la section critique (libère la ressource).
Les routines d'interruptions (ISR) sont des fonctions exécutées par le micro-
contrôleur lui-même et qui ne peuvent être gérées par FreeRTOS, ce qui peut po-
ser certains problèmes. Pour ces raisons, les routines d'interruptions ne peuvent pas
utiliser les fonctions habituelles de l'API FreeRTOS que toute autre tâche basique
peut utiliser. Néanmoins FreeRTOS dénit un groupe de fonctions spécialement
conçues pour les ISR, par exemple, une ISR utilisera la fonction xSemaphoreGi-
veFromISR() plutôt que xSemaphoreGive(), de la même manière, elle utilisera
la fonction xQueueReceiveFromISR() plutôt que xQueueReceive().
An de spécier une politique de gestion des interruptions et de gérer l'accès aux
fonctions du noyau spéciques aux ISR, FreeRTOS dénit des constantes dans le
chier de conguration FreeRTOSCong.h :
La dénition de ces deux constantes permet de spécier une politique de gestion des
ISR selon leur niveau de priorités :
La dénition des deux constantes précédentes ajoute aussi aux ISR la particula-
rité d'imbrication d'interruptions (ang. Interrupt Nesting). L'imbrication d'interrup-
tions est la possibilité qu'une deuxième interruption ait lieu au même moment que le
traitement d'une autre interruption par une ISR. Cette deuxième interruption peut
préempter la première si elle dispose d'une priorité plus élevée. Il est à noter que les
priorités des interruptions sont dénies par l'architecture du micro-contrôleur. Ce
sont des priorités matérielles qui n'ont aucune relation avec les priorités logicielles
que l'on peut attribuer aux tâches grâce à FreeRTOS.
10.3. Gestion des ressources 153
Figure 10.39 Gestion d'interruptions matérielles par FreeRTOS selon leurs ni-
veaux de priorité
Cette version ne dénit pas de méthode pour libérer de l'espace mémoire RAM.
La mémoire est divisée en un tableau de taille congTOTAL_HEAP_SIZE
(en octets) nommé "la pile FreeRtos". Lorsque le noyau a besoin d'allouer de
la mémoire, il réserve deux espaces libres pour une même tâche. Le premier est
utilisé pour la TCB alors que le second représente la le. Dans la mesure où l'espace
mémoire des tâches n'est jamais libéré, la pile se remplit jusqu'à épuisement de
l'espace disponible.
10.4 Exemples
10.4.1 Exemple 1-Communication inter-tâches (utilisation de Mas-
sage Queue)
FreeRTOS
A.1 Nucleo-FR411RE
La carte STM32 Nucleo ore aux utilisateurs un moyen abordable et exible
d'essayer de nouvelles idées et de construire des prototypes avec n'importe quelle
gamme de microcontrôleurs STM32, en choisissant parmi les diverses combinaisons
de performances, de consommation d'énergie et de fonctionnalités. La prise en charge
de la connectivité Arduino et les en-têtes ST Morpho facilitent l'extension des
fonctionnalités de la plate-forme de développement ouverte STM32 Nucleo avec un
large choix de blindages spécialisés. La carte STM32 Nucleo ne nécessite aucune
sonde séparée car elle intègre le débogueur / programmeur ST-LINK / V2-1.
Flash de 512 Ko
128 Ko de SRAM
GPIO (50) avec capacité d'interruption externe
ADC 12 bits avec 16 canaux
RTC
Minuteries (8)
I2C (3)
USART (3)
SPI (5)
USB OTG pleine vitesse
SDIO
Vous pouvez trouver plus de détails sur les broches et étiquettes disponibles
dans les chiers PeripheralPins.c et PinNames.h.
Ces chiers peuvent être trouvés dans :
Dépôt ARMmbed / mbed-os sur GitHub (version à jour, utilisée avec les
commandes CLI mbed )
https ://github.com/ARMmbed/mbed-os/blob/master/targets
/TARGET_STM/TARGET_STM32F4/ TAR-
GET_STM32F411xE/TARGET_NUCLEO_F411RE/
bibliothèque mbed-dev dans developer.mbed.org (chiers source de la
bibliothèque mbed utilisée sur l' IDE du compilateur mbed )
https ://developer.mbed.org/users/mbed_ocial/code/mbed-
dev/le/default/targets/TARGET_STM/TARGET_STM32F4/
TARGET_STM32F411xE/TARGET_NUCLEO_F411RE/
A.1.3 STM32Cube
STM32Cube est un logiciel embarqué gratuit de ST qui fournit tous les pilotes
et composants middlewares nécessaires pour être rapidement opérationnel sur les
microcontrôleurs STM32 ARM Cortex-M. STM32Cube inclut FreeRTOS.
STM32Cube est distribué par famille d'appareils. Chaque famille prise en charge
dispose d'un seul téléchargement STM32Cube qui regroupe tous les composants lo-
giciels embarqués génériques nécessaires au développement d'une application pour
cette famille. Par exemple, il existe un seul téléchargement qui fournit tout le né-
cessaire pour les pièces STM32F4, et un seul téléchargement séparé qui fournit tout
ce dont vous avez besoin pour les pièces STM32F0. La prise en charge des appareils
est activement étendue et les futures familles STM32 seront lancées avec la prise en
charge de STM32Cube. Une couche d'abstraction commune est utilisée pour assurer
une portabilité maximale entre les familles STM32.
ponibles sur leur plate-forme matérielle cible. Cela signie qu'ils utilisent plusieurs
composants et pilotes middlewares diérents dans un même projet. Les projets de
démonstration sont exécutés sous le contrôle de FreeRTOS.
- En savoir plus sur les projets de démonstration -
Des exemples, des chiers d'application et de projet de démonstration sont fournis
pour les outils de développement IAR , Atollic (qui utilise le compilateur ARM GCC
) et Keil, et ciblent une gamme de cartes STM32 d'évaluation, de découverte, de
STM32 Nucleo et dédiées.
FreeRTOS est conçu pour être simple et facile à utiliser : seuls 3 chiers source
communs à tous les ports RTOS et un chier source spécique au microcontrôleur
sont nécessaires, et son API est conçue pour être simple et intuitive.
FreeRTOS est porté sur de nombreuses architectures de microcontrôleurs diérentes
et sur de nombreux compilateurs diérents. Chaque port ociel est accompagné
d'une démo ocielle qui (au moins au moment de sa création) se compile et s'exé-
cute sur la plate-forme matérielle sur laquelle il a été développé sans aucune modi-
cation.
Les projets de démonstration sont fournis pour s'assurer que les nouveaux utili-
sateurs peuvent démarrer avec FreeRTOS le plus rapidement possible et avec le
minimum de tracas.
Chaque architecture prise en charge par FreeRTOS est utilisée dans de nombreux
microcontrôleurs diérents, ce qui signie que FreeRTOS peut être utilisé avec des
milliers de références de microcontrôleurs diérents. En multipliant ce nombre par le
nombre de compilateurs pris en charge, puis en multipliant à nouveau par le nombre
toujours croissant de kits de démarrage et de cartes d'évaluation qui sont mis sur le
170 Annexe A. FreeRTOS
marché, et il est évident que, malgré nos meilleurs eorts, nous ne pouvons fournir
qu'une démo ocielle des projets qui correspondent exactement à une inme frac-
tion des combinaisons possibles.
Il est toujours recommandé de créer un nouveau projet FreeRTOS en commençant
par, puis en adaptant, l'une des démos précongurées fournies . Cela garantit que le
nouveau projet inclut tous les chiers source et d'en-tête nécessaires et installe les
routines de service d'interruption nécessaires, sans eort de la part du créateur du
projet. Certains utilisateurs de FreeRTOS veulent également savoir comment créer
des projets FreeRTOS autrement qu'en adaptant un projet existant. La procédure
pour cela est documentée ci-dessous.
FreeRTOS est fourni sous forme de chiers source C standard qui sont construits
avec tous les autres chiers C de votre projet. Les chiers source FreeRTOS sont
distribués dans un chier zip. La page d' organisation du code source RTOS décrit
la structure des chiers dans le chier zip.
Au minimum, les chiers source suivants doivent être inclus dans votre projet :
Si vous avez besoin d' une fonction de minuterie logicielle , ajoutez FreeRTOS
/ Source / timers.c à votre projet.
Si vous avez besoin de la fonctionnalité de groupe d'événements , ajoutez
FreeRTOS / Source / event_groups.c à votre projet.
Si vous avez besoin d' une fonctionnalité de tampon de ux ou de tampon
de messages , ajoutez FreeRTOS / Source / stream_buer.c à votre projet.
Si vous avez besoin d'une fonctionnalité de co-routine, ajoutez FreeRTOS /
Source / croutine.c à votre projet (notez que les co-routines sont obsolètes et
non recommandées pour les nouvelles conceptions).
Selon le port, il peut également être nécessaire que les mêmes répertoires se
trouvent dans le chemin d'inclusion de l'assembleur.
cique à l'application, pas au RTOS, et doit être situé dans un répertoire d'appli-
cation, pas dans l'un des répertoires de code source du noyau RTOS. Si heap_1,
heap_2, heap_4 ou heap_5 est inclus dans votre projet, la dénition cong-
TOTAL_HEAP_SIZE dimensionnera le tas FreeRTOS. Votre application ne
sera pas liée si congTOTAL_HEAP_SIZE est déni trop haut. La dénition
congMINIMAL_STACK_SIZE dénit la taille de la pile utilisée par la tâche
inactive. Si congMINIMAL_STACK_SIZE est déni trop bas, la tâche inactive
générera des débordements de pile. Il est conseillé de copier le paramètre congMI-
NIMAL_STACK_SIZE à partir d'une démo ocielle FreeRTOS fournie pour
la même architecture de microcontrôleur. Les projets de démonstration FreeRTOS
sont stockés dans des sous-répertoires du répertoire FreeRTOS / Demo. Notez que
certains projets de démonstration sont anciens et ne contiennent donc pas toutes les
options de conguration disponibles.
TP2
B.1 Objectifs :
Congurer PA5 en tant que sortie GPIO avec le label LED_GREEN
Congurer le PC13 comme GPIO_EXTI13 avec le label BLUE_BUTTON
Ajouter le middleware FreeRTOS au projet avec CMSIS_OS
Ajoutez 2 tâches et un sémaphore binaire et utilisez-les pour réagir à
l'appui sur un bouton (interruption) et au contrôle des LED (ON/OFF).
TP3
C.1 Objectifs :
Conguration de RTOS avec CubeMX
Création deux tâches Blink01 et Blink02 avec CubeMX
Utilisation des priorités pour résoudre certains problèmes courants
Implémentation et vérication sur la carte NUCLEO-F411RE
Cliquez sur SYS puis sur SYS Mode and Conguration puis sélectionnez
C.4. Création deux tâches Blink01 et Blink02 avec CubeMX 191
TIM5
devriez voir le voyant LD2 clignoter, mais à un cycle de service variable qui augmente
ou diminue par étapes distinctes. C'est le résultat des deux threads avec des temps
d'attente diérents.
TP4
D.1 Objectifs :
Conguration de RTOS gratuite avec CubeMX
Bénécier de l'utilisation d'un RTOS.
Création de tâches avec ou sans CubeMX
Utilisation des priorités pour résoudre certains problèmes courants
Je choisis la version 1, car elle est prise en charge par la majorité des appareils
STM32. Ensuite, allez dans l'onglet Tâches et les d'attente et vous verrez ici
une tâche par défaut, déjà créée pour vous. Double-cliquez dessus et vous pouvez
voir les informations suivantes.
Pour l'instant, vous devez vous concentrer uniquement sur le nom de la tâche,
la priorité et la fonction d'entrée. Maintenant, nous allons créer une tâche ici, et
ci-dessous sont les propriétés de cette tâche.
Je l'appelle donc tâche 2, avec une priorité normale, et la fonction d'entrée est
Task2_init. Vous en aurez une meilleure idée une fois que nous aurons écrit le
programme.
Une autre chose importante à propos de l'utilisation de RTOS est que nous ne
pouvons pas utiliser systick comme base de temps. Alors allez sur sys et choisissez
une autre base de temps comme indiqué ci-dessous.
Nous allons basculer la broche PA0 dans la tâche par défaut et la broche PA1
dans la tâche 2. De cette façon, l'ordonnanceur planiera le temps pour ces deux
tâches, an qu'elles aient susamment de temps pour être exécutées. Vous pouvez
vérier ci-dessous la lecture de l'oscilloscope, quand le code ci-dessus a été exécuté.
osThreadId Task3Handle ;
2.) Dénissez la fonction de saisie pour la tâche. C'est la fonction principale de la
tâche. Votre programme y sera écrit. N'oubliez pas que les tâches du Free RTOS
ne sont pas conçues pour gérer une valeur de retour. Ainsi, la fonction d'entrée doit
toujours avoir une boucle innie à l'intérieur de laquelle tout votre programme doit
être écrit.
3.) Dans notre fonction principale, nous devons d'abord dénir la tâche, puis la
créer.
Désormais, les TAsk2 ont la priorité la plus élevée, que la tâche par défaut et
la tâche3 la plus basse. Lorsque le programme s'exécute, la tâche2 s'exécutera
en premier, la tâche par défaut et enn le TAsk3. Et les trois tâches enverront les
données en même temps.
Annexe E
TP5
E.1 Objectifs :
Les objectifs sont :
Conguration de RTOS avec CubeMX
Utiliser un UART et docklight.
Création des tâches avec CubeMX
Utilisation des priorités pour résoudre certains problèmes courants
https ://docklight.de/downloads/
Pour démarrer un nouveau projet, allez dans [File]> [New]> [Projet STM32]
comme indiqué dans les Figures suivantes.
Cliquez sur Finish
Cliquez sur Yes
Conguration des entrées/sorties.
Conguration RTOS
Sélectionnez FREERTOS et dans l'interface FREERTOS Mode and
Conguration choisissez CMSIS_V1
206 Annexe E. TP5
Conguration UART
Conguration SYS
TP6
F.1 Objectifs :
Les objectifs sont :
Conguration de RTOS avec CubeMX
Utiliser un UART et docklight.
Création deux tâches avec CubeMX (Tache 1 et 2)
Test et vérication
Pour démarrer un nouveau projet, allez dans [File]> [New]> [Projet STM32]
comme indiqué dans les Figures suivantes.
TP7
G.1 Objectifs :
Les objectifs sont :
Comment utiliser FreeRTOS avec Arduino ?
Téléchargez et installez FreeRTOS dans Arduino IE
s'exécuter sur le processeur à un moment donné. Par conséquent, une seule tâche
sera en état d'exécution et toutes les autres tâches seront en état non en cours
d'exécution. Cela signie que dans les applications basées sur RTOS, les tâches
peuvent être en état d'exécution ou non en cours d'exécution.
L'état d'exécution d'une tâche peut être divisé en trois sous-états tels que l'état
bloqué, l'état prêt et l'état suspendu. La gure ci-dessous montre la durée de vie
de transition d'une tâche dans un système multitâche.
Ce code montre un exemple simple où nous contrôlons trois LED avec trois
tâches diérentes. Chaque tâche s'exécute après un certain temps. Ce programme
est similaire au code Arduino typique sauf que nous incluons le chier de bibliothèque
de FreeRTOS.
Comme vous pouvez le voir sur la sortie du moniteur série, la tâche de priorité
la plus basse (tâche inactive) ne s'exécute que lorsque le processeur est libre et
qu'aucune autre tâche n'est disponible à exécuter.
TP8
H.1 Objectifs :
Les objectifs sont :
Comme les autres noyaux RTOS modernes, FreeRTOS Kernel fournit également
un processus de communication de données entre les tâches. Celles-ci sont appelées
les d'attente de messages. Ils sont la primitive sous-jacente utilisée par tous les
mécanismes de communication et de synchronisation FreeRTOS. Ils sont utilisés
pour envoyer et recevoir des messages entre les tâches.
Une le d'attente de messages est une sorte de tampon FIFO qui contient des
éléments de données de taille xe. De plus, le nombre d'éléments qu'une le d'attente
peut contenir est également xe, après son initialisation. Habituellement, les tâches
écrivent des données à la n de la mémoire tampon et lisent à partir du frontal
de la mémoire tampon. Mais il est également possible d'écrire en frontal. Plusieurs
écrivains et lecteurs peuvent écrire et lire à partir du tampon.
236 Annexe H. TP8
Mais un seul write/ read peut accéder à la mémoire tampon à la fois et les
autres tâches restent bloquées. Par conséquent, le blocage est possible à la fois sur
les lectures et les écritures dans la mémoire tampon.
Tout comme lors de la lecture à partir d'une le d'attente, une tâche peut
éventuellement spécier un temps de blocage lors de l'écriture dans une le
d'attente. Dans ce cas, la durée de blocage est la durée maximale pendant laquelle
la tâche doit être maintenue dans l'état Bloqué pour attendre que de l'espace
devienne disponible dans la le d'attente si la le d'attente est déjà pleine.
Les les d'attente peuvent avoir plusieurs rédacteurs. Il est donc possible qu'une
le d'attente pleine ait plus d'une tâche bloquée sur elle en attente de terminer une
opération d'envoi. Dans ce cas, une seule tâche sera débloquée lorsque de l'espace
dans la le d'attente deviendra disponible.
La tâche qui est débloquée sera toujours la tâche de priorité la plus élevée qui
attendait de l'espace. Si les tâches bloquées ont la même priorité, alors ce sera la
tâche qui attend depuis le plus longtemps de l'espace qui est débloquée.
Jusqu'à présent, nous avons couvert les bases du processus d'écriture et de lecture
des les d'attente. Commençons maintenant par la partie principale de ce TP. Cette
section couvre le contenu suivant de l'API de le d'attente FreeRTOS (FreeRTOS
queue API) :
H.2. Arduino FreeRTOS Queue Management 237
La fonction API xQueueCreate () est utilisée pour créer une le d'attente
avec le nombre requis d'éléments de tampon et la taille de chaque élément.
Cette fonction utilise la référence par des handles avec une variable de type de
retour QueueHandle_t. Ce gestionnaire décide si susamment de mémoire est
disponible sur Arduino pour créer une le d'attente non.
Par exemple, pour créer une le d'attente , créez une variable de type xQueue-
Handle. Ceci est utilisé pour stocker le handle de la variable de retour de le
d'attente.
xQueueHandle long_queue ;
H.2. Arduino FreeRTOS Queue Management 241
Avant de créer des tâches qui lisent et écrivent des données dans la le d'attente,
vous devez vérier la valeur de retour du gestionnaire long_queue :
L'API FreeRTOS fournit ces deux fonctions pour lire et écrire des messages dans
/ depuis la le d'attente.
Comme leur nom l'indique, ces fonctions écrivent des données à l'avant ou à
l'arrière d'un tampon. Cette fonction prend trois arguments comme entrée et renvoie
une valeur qui est le succès ou l'échec de l'écriture du message.
TickType_t xTicksToWait Dans le cas, si la le d'attente est pleine, il spécie le temps
de blocage maximal d'une tâche jusqu'à ce que l'espace de-
vienne disponible. Passer la valeur zéro forcera la tâche à
retourner sans écrire, si la le d'attente est pleine. De même,
en passant portMAX_DELAY à function, la tâche res-
tera indéniment en état de blocage
Valeur de retour Il renvoie deux valeurs telles que pdPASS (si les données
sont écrites avec succès) et errQUEUE_FUL (si les don-
nées n'ont pas pu être écrites)
Cet exemple Arduino illustre une le d'attente en cours de création , des données
envoyées à la le d'attente à partir de plusieurs tâches et des données reçues du
tampon.
La le d'attente est créée pour contenir des éléments de données de type long.
Les tâches qui envoient des données ne spécient pas d'heure de blocage,
contrairement à la tâche qui reçoit de la le d'attente.
La priorité des tâches envoyées à la le d'attente est inférieure à la priorité
de la tâche reçue de la le d'attente.
Cela signie que la le d'attente ne doit jamais contenir plus d'un élément
car dès que les données sont envoyées à la le d'attente, la tâche de réception
se débloque, anticipe la tâche d'envoi et supprime les données en laissant à
nouveau la le vide.
H.3. Esquisse complète Arduino 243
Ce code montre l'implémentation de la tâche qui écrit dans la le d'attente. Deux
instances de cette tâche sont créées, une qui écrit en continu la valeur 100 dans la le
d'attente et une autre qui écrit en continu la valeur 200 dans la même le d'attente.
Le paramètre de tâche est utilisé pour transmettre ces valeurs à chaque instance de
tâche.
Ce code contient la dénition de la fonction Arduino setup (). Cela crée sim-
plement la le d'attente et les trois tâches avant de démarrer le planicateur. La
le d'attente est créée pour contenir un maximum de 5 valeurs longues même si les
priorités des tâches sont dénies de sorte que la le d'attente ne contiendra jamais
plus d'un élément à la fois.
Comme les deux tâches envoyées à la le d'attente ont une priorité identique à
chaque fois que l'une appelle taskYIELD (), l'autre commence à s'exécuter - la
tâche qui appelle taskYIELD () passe à l'état Prêt lorsque l'autre tâche d'envoi
passe à l'état En cours d'exécution. Cela amène les deux tâches d'envoi à envoyer
des données à la le d'attente à tour de rôle. La sortie produite par l'exemple 10
est illustrée dans la gure ci-dessous :
Tout d'abord, nous incluons les chiers d'en-tête de FreeRTOS, de la le d'at-
tente et de l'écran LCD.
Déclarez une variable de type QueueHandle_t. Ceci est utilisé pour stocker
le handle dans la le d'attente à laquelle accèdent tous les AdcTask et LcdTask.v
QueueHandle_t xQueue ;
Créez une instance de AdcTask qui sera envoyée à la le d'attente (expédi-
teur). Créez également la tâche LcdTask qui lira à partir de la le d'attente. La
H.4. Exemple d'achage LCD et ADC de le d'attente Arduino
FreeRTOS 247
Figure H.21 Exemple d'achage LCD et ADC de le d'attente Arduino FreeR-
TOS
Figure H.22 Exemple d'achage LCD et ADC de le d'attente Arduino FreeR-
TOS
Figure H.23 Exemple d'achage LCD et ADC de le d'attente Arduino FreeR-
TOS
248 Annexe H. TP8
tâche est créée avec la priorité 2, donc au-dessus de la priorité de la tâche de l'expé-
diteur. Après cela, démarrez le planicateur pour que les tâches créées commencent
à s'exécuter.
Figure H.24 Exemple d'achage LCD et ADC de le d'attente Arduino FreeR-
TOS
Cette fonction dénit la tâche de l'expéditeur qui est AdcTasv. Tout d'abord,
lisez la valeur ADC et stockez-la dans la variable adc_value. Après cela, utilisez
xQueueSend () pour écrire la valeur mesurée dans la le d'attente.
Le premier paramètre est la le d'attente à laquelle les données sont envoyées.
La le d'attente a été créée avant le démarrage du planicateur, donc avant
que cette tâche ne commence à s'exécuter.
Le deuxième paramètre est l'adresse des données à envoyer, dans ce cas
l'adresse de adc_value.
Le troisième paramètre est le temps de blocage - le temps pendant lequel la
tâche doit être maintenue dans l'état Bloqué pour attendre que de l'espace
devienne disponible dans la le d'attente si la le d'attente est déjà pleine.
Dans ce cas, le temps de bloc est portMAX_DELAY qui attend un temps
indéni.
Cette tâche LCD lit la valeur de la le d'attente et ache sa valeur sur l'écran
LCD.
Dans ce TP, nous utilisons juste une résistance variable pour l'entrée du canal
analogique. Mais vous pouvez également utiliser des capteurs tels que la tempéra-
ture, le capteur de lumière.
H.4. Exemple d'achage LCD et ADC de le d'attente Arduino
FreeRTOS 249
Figure H.25 Exemple d'achage LCD et ADC de le d'attente Arduino FreeR-
TOS
Figure H.26 Exemple d'achage LCD et ADC de le d'attente Arduino FreeR-
TOS
Annexe I
TP9
I.1 Objectifs :
Les objectifs sont :
I.2 Introduction
Ce TP explique comment utiliser la le d'attente structurée FreeRTOS pour
recevoir des données de plusieurs ressources. Dans le dernier tutoriel, nous avons
appris à utiliser les les d'attente de messages avec l'API FreeRTOS et Arduino .
Mais dans cet exemple, nous avons utilisé une seule le d'attente pour recevoir et
envoyer des données à partir de tâches uniques. Mais dans les systèmes d'exploitation
en temps réel , il est également possible qu'une seule tâche reçoive des données de
plusieurs ressources en utilisant une seule le d'attente. Cependant, les tâches de
plusieurs expéditeurs peuvent écrire des données dans une seule le d'attente, mais
le problème est que la tâche de réception doit savoir d'où proviennent les données
de tâche.
Figure I.1 Exemple de le d'attente de structure pour recevoir des données de
plusieurs ressources
Tout d'abord, nous créons une le d'attente qui peut contenir la structure.
Ces éléments de structure se composent de la valeur de données et de l'éti-
quette de la ressource (comme le numéro de canal analogique)
Dans cet exemple, nous créons deux tâches d'expéditeur telles que Tempéra-
ture et LDR.
Le transmetteur de température lit la valeur du capteur LM35 à partir du
canal analogique A0 d'Arduino IDE. Après cela, il écrit la structure dans la
le d'attente qui contient la valeur ADC et le numéro de canal (A0)..
De même, une tâche de résistance dépendant de la lumière mesure l'inten-
sité lumineuse avec le canal ADC (A1) et écrit les données dans un format
structuré.
La tâche LCD (récepteur) lit également ces données de structure et traite les
données pour acher la valeur du capteur après avoir identié la source.
I.2.3.1 Schéma
Nous dénissons une structure qui se compose de deux éléments tels que la valeur
du capteur et le numéro de broche. Cette structure sera transmise à la le d'attente
pour écrire et lire les valeurs de sortie du capteur.
Cette ligne dénit le hanlder pour structQueue pour y accéder pour la référence
des tâches.
Dans la fonction de conguration, nous créons trois tâches qui utilisent struc-
ture_queue pour écrire et lire des données. Tout d'abord, TaskLCD est créé pour
lire les éléments de structure de la le d'attente et il a la priorité la plus élevée. In-
versement, les broches TaskTempReadPin0 () et TaskLightReadPin0 () sont créées
avec une priorité égale et inférieure à la tâche du récepteur. J'expliquerai la raison
plus tard.
I.2. Introduction 255
TaskLcd est une tâche réceptrice qui lit les données de structure depuis
struct_queue. La tâche de réception a la priorité la plus élevée. Par conséquent,
au début de l'exécution du programme, il s'exécutera en premier, mais il entrera
dans l'état de blocage. Parce que la le d'attente sera vide. Par conséquent, il s'exé-
cutera dès que l'un des expéditeurs écrira des données dans la le d'attente. Cette
tâche s'attend toujours à recevoir des données, par conséquent, nous spécions le
temps de blocage à la valeur maximale qui est portMAX_DELAY.
Ce sont les dénitions de deux tâches de l'expéditeur. Comme nous l'avons men-
tionné précédemment, les tâches d'écriture ont une priorité égale mais inférieure
aux tâches de réception. Par conséquent, lorsqu'une tâche à haute priorité sera dans
l'état de blocage, alors l'une des tâches à faible priorité s'exécutera en suivant un
algorithme de planication de partage de temps ou de découpage de temps. Parce
que FreeRTOS est basé sur la planication préventive prioritaire avec découpage
temporel.
256 Annexe I. TP9