0% ont trouvé ce document utile (0 vote)
5 vues323 pages

Embed RTL

Le document présente un cours sur les systèmes embarqués temps réel, abordant leur définition, caractéristiques et types. Il met en avant l'importance croissante de ces systèmes dans divers domaines, ainsi que les défis liés à leur conception et à leur intégration avec des systèmes d'exploitation comme Linux. Les objectifs incluent la compréhension des architectures, de la programmation multi-tâches et des systèmes temps réel.

Transféré par

tazi simo
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
5 vues323 pages

Embed RTL

Le document présente un cours sur les systèmes embarqués temps réel, abordant leur définition, caractéristiques et types. Il met en avant l'importance croissante de ces systèmes dans divers domaines, ainsi que les défis liés à leur conception et à leur intégration avec des systèmes d'exploitation comme Linux. Les objectifs incluent la compréhension des architectures, de la programmation multi-tâches et des systèmes temps réel.

Transféré par

tazi simo
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Systèmes embarqués temps réel

M2 Électronique, Énergie Électrique et


Automatique

Slaviša Jovanović & Hassan Rabah


[Link]@[Link]
[Link]

2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Organisation et objectifs

Sommaire

1 Introduction
Organisation et objectifs

1
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Organisation et objectifs

Objectifs et contenu du cours

Les objectifs :
 Définition des systèmes embarqués et temps réel
 Différents types de systèmes embarqués temps réel
 Systèmes embarqués intégrant un SE (OS)
 Les bases d’un système temps réel et programmation
multi-tâches (cas d’un mono-processeur)
 Architecture d’un système à base de Linux embarqué
 Conception d’un OS Linux embarqué pour une plateforme
matérielle spécifique
 Linux temps réel (RTAI et Xenomai)

1
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Organisation et objectifs

Motivations

 Systèmes embarqués sont omniprésents sous différentes


formes
▷ matérielle (CPLD, FPGA),
▷ logicielle (CPU) et
▷ mixte (HW/SW - CPU+FPGA)

 Une complexité de plus en plus importante


 Une nécessite de gérer des tâches de plus en plus complexes
et de répondre à des time-to-market de plus en plus courts
 De plus en plus de systèmes sous formes de SoC
(processeurs + FPGA + . . .)
 De plus en plus de systèmes embarqués intégrant un
système d’exploitation comme Linux

2
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Organisation et objectifs

Motivations
Xilinx Zynq

. Images Xilinx Zynq-7000 All Programmable SoC. 2014. url :


[Link]
3
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Organisation et objectifs

Informations sur le cours


 Cours/TD : 10h (5 séances)

 TP : 20h (5 séances)

 Cours et TD : Slaviša Jovanović


[Link]@[Link]
 TP : Hassan Rabah
[Link]@[Link]
Laboratoire IJL, N2EV - MAE

 Salle cours & TD : Salle ATELA CAO

 Adresse web interne : ARCHE Systèmes embarqués temps réel

 Manuels : les diapos et exercices du cours


Références

4
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Organisation et objectifs

Références

[1] AM335x Sitara Processors. 2014. url :


[Link]
[2] Marko Bertogna. The Mars Pathfinder. 2009.
[3] Christophe Blaess. Solutions temps réel sous Linux.
Eyrolles, 2012.
[4] Loïc Cuvillon. Systèmes temps réel et systèmes
embarqués. 2014.
[5] Free Electrons. Embedded Linux System Development.
2015.
[6] Pierre Ficheux et Eric Bénard. Linux embarqué, 4ème
édition. Eyrolles, 2010.

5
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Organisation et objectifs

Références

[7] Chistopher Hallinan. Embedded Linux Primer - A


Practical Real World Approach, 2nd Edition. Prentice
Hall, 2010.
[8] http ://[Link]/.
[9] Patrick Kadionik. Les Systèmes Embarqués - Linux pour
l’embarqué. 2003. url :
[Link]
[10] OpenAI. chatGPT 4.0. 2024. url : [Link].
[11] Pierre Paradinas. Les systèmes temps réel. 2005.
[12] Christian Poellabauer. Real time systems. 2007.
[13] Jean-Christophe Ponsart. Les systèmes temps réel. 2014.

6
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Organisation et objectifs

Références

[14] Dr. C.-K. Shene. CS4411 Introduction to Operating


Systems. 2010.
[15] Alex C. Snoeren. Semaphores and Monitors. 2005.
[16] Xilinx Zynq-7000 All Programmable SoC. 2014. url :
[Link]
devices/soc/[Link].

7
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Organisation et objectifs

Plateforme matérielle
Beaglebone Black

 Processor : AM335x 1GHz ARM® Cortex-A8


▷ 512MB DDR3 RAM
▷ 4GB 8-bit eMMC on-board flash storage
▷ 3D graphics accelerator
▷ NEON floating-point accelerator
▷ 2x PRU 32-bit microcontrollers
 Connectivity
▷ USB client for power & communications
▷ USB host
▷ Ethernet
▷ HDMI
▷ 2x 46 pin headers
 Software Compatibility
▷ Debian, Android, Ubuntu
8
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Organisation et objectifs

Plateforme matérielle
Beaglebone Black

9
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Définition

Sommaire

2 Systèmes embarqués
Définition
Caractéristiques
Systèmes embarqués et temps réel
Architecture d’un système embarqué à base de µP

9
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Définition

Systèmes embarqués
Définition

Système embarqué
Un système embarqué (embedded system) est un système
assurant une fonction dédiée et qui est généralement conçu pour
être utilisé avec une application logicielle spécifique

 Le système matériel et l’application sont intimement liés et


noyés dans le matériel et ne sont pas aussi facilement
discernables comme dans un environnement de travail
classique de type PC
 Synonyme : système enfoui
 Les systèmes embarqués sont en général utilisés dans un
environnement matériel contraint

10
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Définition

Systèmes embarqués
Définition
 L’évolution des systèmes embarqués a progressé au rythme
des avancées technologiques notamment des processeurs
 Passage rapide des processeurs 4 bits vers 64 bits
 Un marché très lucratif ( quelques centaines de milliards
par an)
 Un système embarqué est souvent un système mixte :
numérique avec une interface analogique
 Utilise généralement un processeur ou/et un circuit
programmable
 Exécute un logiciel dédié pour réaliser une fonctionnalité
précise.
 Ne possède pas d’entrées-sorties standard comme clavier
d’un PC ou un écran classique
11
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Définition

Systèmes embarqués
Définition

Différents types de systèmes embarqués (selon application) :


 General computing : application similaire à une
application d’un système bureau mais embarquée dans un
environnement matériel plus restreint
 Systèmes de contrôle : les applications de contrôle dans
des domaines variés (automobile, industrie, centrale
nucléaire, . . .)
 Systèmes de traitement de signal : les applications de
traitement d’une quantité importante de données
(multimédia, compression vidéo, radar, . . .)
 Systèmes de transmission : les applications de
transmission d’information et de commutation (une box
Internet)
12
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Définition

Systèmes embarqués
Exemples

Source http ://[Link]/.

13
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Définition

Systèmes embarqués
Exemples

Source Google Image

14
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Définition

Systèmes embarqués
Exemples

Source Google Image

15
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Définition

Systèmes embarqués
Exemples

Source Google Image

16
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Définition

Systèmes embarqués
Exemples

Source Google Image


17
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Caractéristiques

Sommaire

2 Systèmes embarqués
Définition
Caractéristiques
Systèmes embarqués et temps réel
Architecture d’un système embarqué à base de µP

17
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Caractéristiques

Systèmes embarqués
Caractéristiques d’un système embarqué :
 Fonctionnement en temps réel (pas obligatoire)
→ Réactivité : des opérations de calcul doivent être faites
en réponse à un événement extérieur (interruption
matérielle).
→ La validité d’un résultat (et sa pertinence) dépend du
moment où il est délivré.
→ Rater une échéance peut et cause souvent une erreur de
fonctionnement.
 Beaucoup de systèmes sont multirate et traitent les
informations à différents rythmes
 Faible taille
 Faible consommation
 Environnement imprévisible (n’évolue pas dans un
environnement contrôlé)
 Sûreté de fonctionnement et Faible coût 18
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Systèmes embarqués et temps réel

Sommaire

2 Systèmes embarqués
Définition
Caractéristiques
Systèmes embarqués et temps réel
Architecture d’un système embarqué à base de µP

18
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Systèmes embarqués et temps réel

Systèmes embarqués et temps réel

 Qu’est-ce que temps réel ?


 Beaucoup confondent temps réel avec rapidité
 Un système est dit Temps Réel lorsque l’information après
acquisition et traitement reste encore pertinente 1
 Dans le cas d’une information arrivant de façon périodique,
les temps d’acquisition et de traitement doivent rester
inférieurs à la période de rafraîchissement de cette
information
 Un système de traitement de l’information : acquisition de
données + pilotage en respectant les contraintes de temps,
de débit et de fiabilité.
 Un système fonctionne en temps réel si les contraintes de
temps existent et sont respectées.
19
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Systèmes embarqués et temps réel

Systèmes embarqués et temps réel

 Non respect de contraintes de temps → panne logicielle ou


dégradation de performances du système
 Types de temps réel :
▷ Temps Réel dur (Hard RT ) : plantage.
▷ Temps Réel mou ( Soft RT ) : dégradation non dramatique
des performances du système.

20
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Systèmes embarqués et temps réel

Systèmes embarqués et temps réel


 Utilisation de programmes dédiés à l’application sans
systèmes d’exploitation (bare-metal systems)
 Utilisation d’un système d’exploitation
 Le choix est parfois discutable
 En règle générale, dès qu’un système à base d’un processeur
nécessite d’un système de fichiers (pour stockage de
données), de connexion internet (stack TCP/IP) il faut se
pencher vers des systèmes à OS
 D’autres arguments en faveur d’un système à OS
▷ Simplifications de l’écriture de l’application embarquée
▷ Portabilité
▷ Disponibilité de libraries
▷ Evolutivité
▷ Maîtrise des coûts

21
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Systèmes embarqués et temps réel

Systèmes embarqués et temps réel

▷ ...
 Un OS qui s’est imposé ces dernières années dans le monde
des systèmes embarqués est le Linux
 Linux de base n’est pas temps réel → il y a des solutions
qui le rendent temps réel (déterministe et préemptif)

1. Source Patrick Kadionik. Les Systèmes Embarqués - Linux pour


l’embarqué. 2003. url : [Link]
22
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Architecture d’un système embarqué à base de µP

Sommaire

2 Systèmes embarqués
Définition
Caractéristiques
Systèmes embarqués et temps réel
Architecture d’un système embarqué à base de µP

22
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Architecture d’un système embarqué à base de µP

Architecture d’un système embarqué

. Source Chistopher Hallinan. Embedded Linux Primer - A Practical Real


World Approach, 2nd Edition. Prentice Hall, 2010
23
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Les bases d’un système temps réel

Sommaire

3 Systèmes temps réel


Les bases d’un système temps réel
Ordonnanceur
Gestion de mémoire
Gestion des interruptions
Commutation de tâches
Test d’ordonnançabilité

23
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Les bases d’un système temps réel

Introduction
Le multi-tâches

 exécution séquentielle
(mono µP )
 exécution parallèle
(plusieurs µP )
 exécution pseudo parallèle
(mono µP )

24
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Les bases d’un système temps réel

Introduction
Définition d’une tâche

 Le comportement concurrent des évènements et grandeurs


physiques
 Les méthodes de conception et de réalisation doivent être
adaptées à ce parallélisme → mécanisme de tâches ou
multi-tâches
 Une tâche (ou activité ou processus) est une entité
d’exécution et de structuration de l’application
 Plusieurs groupes de tâches (découpage fonctionnel) :
▷ Tâches d’entrées/sorties
▷ Tâches de traitement : le cœur de l’application
▷ Tâches de gestion de l’interface utilisateur
▷ Tâches de communication
▷ Tâches de sauvegarde
25
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Les bases d’un système temps réel

Introduction
Définition d’une tâche

 Toutes les tâches peuvent être activées de manière


périodique ou par interruption
 Les relations entre les tâches :
▷ synchronisation : relation de précédence d’exécution entre
les tâches
▷ communication : transfert de données entre plusieurs
tâches
▷ partage de ressources : mémoire, entrées/sorties, carte
réseau, etc

26
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Les bases d’un système temps réel

Introduction
Définition d’une tâche

Dans un système, nous traitons 3 types différents de tâches :


 Tâches asynchrones : déclenchées par interruption
 Tâches synchrones : déclenchées par l’horloge temps réel
du système
 Tâches "ordinaires" : opérations de fond les moins
prioritaires traitées en absence de 2 premiers types de
tâches
 Important : à ne pas confondre avec le modèle d’exécution
synchrone d’un système (perception de l’occurrence d’un
événement différée)

27
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Les bases d’un système temps réel

Introduction
Définition d’une tâche

 Une tâche, étant une partie d’un programme, est fonction


du temps
 Chaque tâche a ses propres zones de :
→ programme : instructions à exécuter, en lecture seule
→ données : les variables et constantes à traiter
→ pile : sauvegarde de contexte, préemption, informations
temporaires
 Le système doit disposer de mécanisme de gestion de
mémoire virtuelle (Memory Management Unit - MMU )

28
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Les bases d’un système temps réel

Introduction
Horloge temps réel

 Une connaissance précise du temps est nécessaire


Une analogie avec l’horloge dans un système purement
matériel
 Le besoin de dater les événements (prise en conscience des
échéances)
 Le temps nécessaire pour commander/contrôler de manière
périodique des actionneurs ou de relever les informations
des capteurs

29
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Les bases d’un système temps réel

Introduction
Système temps réel : besoins

Besoins pour un système temps réel :


 Traitement de plusieurs tâches à la fois (apporter cette
notion de parallélisme à l’application logicielle)
 Limiter les temps de réaction et d’exécution d’une tâche
 Assurer la sureté de fonctionnement pour éviter les
catastrophes dues au non respect de contraintes de temps
Solutions :
 Utiliser du parallélisme physique : plusieurs processeurs,
HW+SW
 Si un seul processeur + système d’exploitation
→ définir les priorités, les mécanismes d’interruptions, les
ressources critiques, les techniques d’ordonnancement
30
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Les bases d’un système temps réel

Gestion d’une tâche

États des tâches :


 courant (en exécution)
 en attente (bloqué)
 prêt
Action sur les tâches
(changement d’états) :
 allocation
 préemption (sauvegarde de
contexte) → de l’état En
exécution à l’état Prêt
 blocage/réveil Source Loïc Cuvillon. Systèmes temps
réel et systèmes embarqués. 2014

31
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Ordonnanceur

Sommaire

3 Systèmes temps réel


Les bases d’un système temps réel
Ordonnanceur
Gestion de mémoire
Gestion des interruptions
Commutation de tâches
Test d’ordonnançabilité

31
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Ordonnanceur

Ordonnanceur

 On appelle ordonnanceur la partie de l’OS qui prend en


charge la gestion des tâches.
 Les tâches principales d’un ordonnanceur :
→ création, initialisation, élection, destruction
→ gestion du diagramme des tâches (en-attente, courant,
prêt)
→ structure de données associées
▷ liste tâches prêtes
▷ liste tâches en attentes
 Politique d’ordonnancement

32
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Ordonnanceur

Ordonnanceur
Les politiques d’ordonnancement

Ordonnancement statique et dynamique


 statique : avant un flot d’exécution
 dynamique : pendant l’exécution d’un flot, les tâches sont
exécutées en fonction des priorités
La préemption de tâches
 la capacité d’un système à interrompre une tâche en cours
d’exécution au profit d’une autre
 pour pouvoir réorganiser les priorités des tâches dans la
liste des tâches en attente et
 possibilité d’arrêter la tâche en cours d’exécution et élire
une autre tâche plus prioritaire

33
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Ordonnanceur

Tâches

On distingue 2 types de tâches


 Taches Immédiates (TI) :
exécutées immédiatement via une demande d’interruption
 Tâches Différées (TD) :
activation demandée par une autre tâche de type TI ou TD
 Les tâches TI ont une priorité supérieure aux tâches TD.

34
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Ordonnanceur

Ordonnanceur

Les algorithmes d’ordonnancement de tâches différées :


 Priorité (préemptif)
 Premier entré premier sorti - FIFO (non préemptif)
 A temps partagé ou l’algorithme du tourniquet (round
robin)

35
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Ordonnanceur

Ordonnanceur
Priorité (préemptif)

 Il peut avoir plusieurs files de tâches à exécuter


 Toutes les files de tâches sont groupées en fonction de
priorité
 La file de tâches ayant la priorité la plus élevée sera
exécutée en premier
 Si dans une file des tâches de même priorité, il y a plusieurs
tâches
→ un ordonnancement à temps partagé pourrait être
appliqué
Tâche a b c d
Exemple d’une seule file des tâches Durée 3 4 1 6
Priorité 2 3 4 1
36
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Ordonnanceur

Ordonnanceur
Priorité (préemptif)

 Quel sera le déroulement des tâches si le quantum de temps


est de 1 ?
 L’ordre d’exécution des tâches sera le suivant :
→ddddddaaabbbbc
 Si le tableau devient ?
Tâche a b c d
Durée 3 4 1 6
Priorité 2 2 3 1
 L’ordre d’exécution des tâches sera le suivant :

→ d d d d d d?

37
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Ordonnanceur

Ordonnancement
Partage de temps

 Une seule file des tâches à exécuter


 Toutes les tâches ont la même priorité
 Toutes les tâches sont exécutées un quantum de temps
(programmé à l’avance)
 Si une tâche n’est pas terminée pendant ce quantum de
temps, elle est recyclée dans la file des tâches à exécuter
Tâche a b c d
Durée 3 4 1 6
 Quel sera le déroulement des tâches si le quantum de temps
est de 1 ?
 L’ordre d’exécution des tâches sera le suivant :
→abcdabdabdbddd
38
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Ordonnanceur

Ordonnancement
Partage de temps

Les avantages de l’ordonnancement à partage de temps


 Équité entre toutes les tâches,
 Mise en oeuvre simple.
Inconvénients :
 ne tient pas compte des besoins applicatifs,
→ notion de priorité.

39
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Ordonnanceur

Ordonnancement
Préemptif + à partage de temps

 Des combinaisons des ordonnancements précédents sont


possibles
 Préemptif + à partage de temps
Tâche a b c d
Durée 3 4 1 6
Priorité 2 2 3 1
Ordre d’arrivée 3 2 1 4
 Quel sera le déroulement des tâches si le quantum de temps
est de 1 ?
 L’ordre d’exécution des tâches sera le suivant :
→ddddddbbbbaaac
 S’il n’y avait pas d’ordre d’arrivée ?
→ddddddbabababbc
40
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Ordonnanceur

Ordonnanceur
Ordonnancement non préemptif

 Une seule file des tâches à exécuter


 Toutes les tâches ont la même priorité
 Un ordonnancement de type FIFO est utilisé pour élire la
tâche à exécuter
 Quels sont les inconvénients de ce type d’ordonnancement ?

41
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Ordonnanceur

Ordonnancement
Primitives d’ordonnancement

 besoin de suspendre une tâche en cours d’exécution →


primitive suspendre
 besoin d’informer une tâche en-attente (ou bloquée) de la
disponibilité d’une ressource : → primitive signaler
 Exemple : une tâche est mise en attente à cause de
l’indisponibilité d’une ressource d’E/S : → suspendre
 lorsque la ressource E/S devient disponible, la tâche
suspendue sera réveillée et mise en liste de tâches prêtes à
être exécutées (signaler)

42
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Ordonnanceur

Ordonnancement
Primitives d’ordonnancement

 La tâche 1 suspendue (signalé avec la primitive suspendre)


→ déplacée sur la liste des tâches bloquées (ou en attente)
 La tâche 2 en train d’être exécutée (une des tâches de la
liste des tâches prêtes à être exécutées)
 La tâche 1 reprend son exécution (signalé avec la primitive
signaler) suite à la libération de la ressource partagée (ou
indisponible)

43
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Ordonnanceur

Ordonnancement
Primitives d’ordonnancement

 Un autre exemple

Tâche 1 2 3
Durée 3 3 2
Priorité 2 1 1
 De quel type d’ordonnancement s’agit-il ?

44
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Ordonnanceur

Ordonnancement
Primitives d’ordonnancement

 Un autre exemple

Tâche 1 2 3
Durée 3 3 2
Priorité 2 1 1
 De quel type d’ordonnancement s’agit-il ?

45
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Gestion de mémoire

Sommaire

3 Systèmes temps réel


Les bases d’un système temps réel
Ordonnanceur
Gestion de mémoire
Gestion des interruptions
Commutation de tâches
Test d’ordonnançabilité

45
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Gestion de mémoire

Gestion de mémoire

 Dans les OS, les adresses mémoires sont des adresses


virtuelles
 Une adresse virtuelle n’est pas une adresse physique unique
dans la mémoire
 l’OS fait la correspondance entre des adresses virtuelles et
des adresses réelles.
 Cette correspondance s’effectue avec le module MMU -
Memory Management Unit
 Trois niveau de mémoire avec des vitesses d’accès
différentes :
▷ mémoire cache
▷ mémoire de masse
▷ mémoire disque

46
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Gestion de mémoire

Gestion de mémoire

47
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Gestion de mémoire

Gestion de mémoire

Le rôle du management de mémoire


 Faire une abstraction des ressources physiques en mémoire
 Allouer de la mémoire limitée à des processus concurrents
 Optimiser les performances d’exécution avec un coût
raisonnable
Mécanismes de gestion de mémoire :
 adressage physique et virtuel
 technique de partitionnement, de gestion par page, de
segmentation
 ménagement de page (PLB), TLB, etc

48
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Gestion de mémoire

Gestion de mémoire

Comment la mémoire était gérée au début ?


 Les programmes adressaient directement la mémoire
physique
 Le système d’exploitation exécutait, chargeait et
déchargeait les tâches
 Inadapté pour les systèmes multi-tâches

49
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Gestion de mémoire

Gestion de mémoire

Comment gérer la mémoire dans un système multi-tâche ?


 L’objectif est d’avoir plusieurs tâches dans la mémoire en
même temps
 Plusieurs mécanismes : partitionnement, par pages,
segmentation
 nécessite des mécanismes de protection pour éviter que des
processus accèdent à des blocs mémoires ne leur
appartenant pas
 Une translation rapide : virtuel → physique
 Changements rapides au niveau de la mémoire physique

50
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Gestion de mémoire

Gestion de mémoire

Mémoire virtuelle
 la mémoire d’un processus n’est pas la même que la
mémoire physique
 un processus demande d’accéder à la mémoire physique
→ l’adresse virtuelle sera décodée en adresse physique

51
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Gestion de mémoire

Gestion de mémoire

52
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Gestion de mémoire

Gestion de mémoire Mémoire physique

P1

Registre de base P2
P4
P3
Adresse virtuelle

Offset + P4

P5

Partitionnement fixe
 un registre de base
 l’adresse physique = l’adresse de base + add. virtuelle
 simple mise en œuvre
 problème de fragmentation interne
→ la mémoire non utilisée par un processus est non
accessible aux autres processus
53
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Gestion de mémoire

Gestion de mémoire
Partitionnement variable
Mémoire physique
Registre de base
P4 P1

Registre de limitation
P2
P3

Adresse virtuelle
Oui
Offset < + P3

Non

Erreur de protection
 un registre de plus → de limitation
 le calcul de l’adresse physique comme dans le PF
 pas de fragmentation interne comme dans le PF
 Problème : fragmentation externe
54
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Gestion de mémoire

Gestion de mémoire

Partitionnement par page


Mémoire physique
Mémoire virtuelle
Page 1
Page 1
Page 2
Page 2
Page 3
…..

Page 4
Page N
Page 5

55
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Gestion de mémoire

Gestion de mémoire

0xBAADF00D = 0xBAADF 0x00D


Adresse virtuelle # de page virtuelle offset

Table de
0xBAADF translation
0x900DF
# de page virtuelle # de page physique

Table de page

56
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Gestion de mémoire

Gestion de mémoire

Partitionnement par page


0xBAADF00D Mémoire physique

0x00000000
Adresse virtuelle
# de page Offset Page 1
0xBAADF 0xF00D
Adresse physique
Page 2
# de page Offset
Table de page
0x900DF 0xF00D Page 3

…..
# de page 0x900DF00D

Page N

0xFFFFFFFF

57
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Gestion de mémoire

Gestion de mémoire

Exemple de pagination de mémoire


 Adresse mémoire est sur 32 bits
 Si les pages ont une taille de 4K
 Combien de pages (virt./phys.) sont utilisées ?
 Sur combien de bits est codé le numéro de page virtuel ?
 Si le numéro de page virtuel est converti en 0x2, donner
l’adresse physique pour l’exemple 0x7345

58
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Gestion de mémoire

Gestion de mémoire

Gestion par pages


Accès mémoire et gestion des pages :
Demande d’accès mémoire
Si page disponible en mémoire alors accès
Sinon % défaut de page %
suspendre la tâche
dé-allouer une page %choix en fonction de la
politique%
charger nouvelle page
signaler
fsi

59
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Gestion de mémoire

Gestion de mémoire

Limite pour les systèmes temps réel :


 Difficile de prédire un défaut de page
 Pour l’éviter des systèmes offrent des fonctions de
réservation ou de blocage de page.
 Opération lourde et complexe.
 Opération réalisée en général par interruption.

60
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Gestion des interruptions

Sommaire

3 Systèmes temps réel


Les bases d’un système temps réel
Ordonnanceur
Gestion de mémoire
Gestion des interruptions
Commutation de tâches
Test d’ordonnançabilité

60
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Gestion des interruptions

Gestion des interruptions

Les étapes de gestion des interruptions :


 Sauvegarde du contexte d’exécution de la tâche courante
(compteur ordinal - PC, pointeur de pile - SP, registres
d’états)
 Activation du gestionnaire d’interruptions
 En fonction de la nature de l’interruption et des priorités
entre plusieurs interruptions
 Traitement de l’interruption
 Signaler fin de l’interruption
 Reprendre tâche ou élire nouvelle tâche

61
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Gestion des interruptions

Gestion des interruptions

Limites pour le temps réel :


 Pas de garantie sur les temps de latence, de traitement et
de restitution du contexte d’une tâche.
 Contribue au non déterminisme d’un système temps réel
62
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Gestion des interruptions

Gestion des interruptions

 Les systèmes TR disposent de priorités définies finement


pour gérer les interruptions et les repoussent au niveau de
l’application.

63
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Commutation de tâches

Sommaire

3 Systèmes temps réel


Les bases d’un système temps réel
Ordonnanceur
Gestion de mémoire
Gestion des interruptions
Commutation de tâches
Test d’ordonnançabilité

63
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Commutation de tâches

Commutation de tâches

 Un exécutif temps réel doit être déterministe et


indépendant de la charge du système
 Considérons le cas de l’ordonnanceur à partage de temps
 Unique file d’attente des tâches prêtes à être exécutées
 Chaque tâche est caractérisée par un certain nombre de
paramètres (zones de mémoires - PC, registres d’états et
pile - SP)
 Lorsque l’ordonnanceur commute d’une tâche à une autre,
ces paramètres doivent être accessibles par l’ordonnanceur
→ pour faciliter la commutation de tâches
 La commutation de tâches est signalée par l’horloge temps
réel du système

64
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Commutation de tâches

Commutation de tâches

 La tâche en cours d’exécution cède l’unité de calcul à la


tâche suivante (de même priorité)
 La commutation de T1 à T2 n’est pas instantanée
temps de commutation =
temps de sauvegarde du contexte de la tâche en cours T1 +
recherche de la tâche suivante T2 +
restauration du contexte de la tâche T2

65
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Test d’ordonnançabilité

Sommaire

3 Systèmes temps réel


Les bases d’un système temps réel
Ordonnanceur
Gestion de mémoire
Gestion des interruptions
Commutation de tâches
Test d’ordonnançabilité

65
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Test d’ordonnançabilité

Ordonnançabilité
Introduction

 L’objectif principal de l’ordonnanceur temps réel :


→ assurer l’ordonnancement des tâches et leurs échéances
 Le plus utilisé : ordonnanceur préemptif à priorité fixe
 Préemption : la capacité d’un système à interrompre une
tâche en cours d’exécution au profit d’une autre
 Priorité : l’ordre d’exécution d’une tâche (invariant)
 Le principe de fonctionnement : la tâche ayant la priorité la
plus haute et étant prête à être exécutée (non-bloquée) sera
exécutée au prochain appel de l’ordonnanceur
 Un exemple de l’ordonnancement préemptif est
l’ordonnancement RM (rate-monotonic)

66
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Test d’ordonnançabilité

Ordonnançabilité
Introduction

→ hypothèse : tâches périodiques et indépendantes


uniquement
→ hypothèse : la priorité P de la tâche est inverse à sa
période T (plus T ↗ plus P ↘)
 L’ordonnancement RM est un ordonnancement en ligne
(online) (l’ordonnancement n’est pas précalculé à l’avance)

67
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Test d’ordonnançabilité

Ordonnançabilité
Introduction

 Ai : moment d’activation
de la tâche i (ready)
 Ti : période d’activation de
la tâche i
 Ci : durée de la tâche i
 Pi : priorité de la tâche i

68
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Test d’ordonnançabilité

Ordonnancement RM
Exemple d’attribution de priorité

Process Période Priorité


a 25 1
25
b 60 1
60
c 42 1
42
d 105 1
105
e 75 1
75

 La tâche la plus prioritaire est la tâche a, la tâche la moins


prioritaire est la tâche d

69
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Test d’ordonnançabilité

Ordonnancement RM
Condition d’ordonnancement

 Pour N processus, l’algorithme RM garantit leur


ordonnancement si l’utilisation totale U du processeur ne
dépasse pas le seuil G
 Le seuil G est appelé la constante de Liu et Leyland et
définit comme :

1
G = N ∗ (2 N − 1) (1)

N
X Ci 1
U= < G = N ∗ (2 N − 1) (2)
Ti
i=1

70
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Test d’ordonnançabilité

Ordonnancement RM
Condition d’ordonnancement

N G
1 1
2 0.82  U : taux de charge du CPU
3 0.78  si G < U < 1 : pas de
.. .. conclusion avec ce test
∞ 0.69

 Si le test échoue, il faut essayer avec le pire des cas : on


suppose que tous les processus démarrent au moment 0
 Vérifier si chaque processus respecte ses propres deadlines
avant la première deadline du processus le plus lent (ayant
la priorité la plus faible)

71
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Test d’ordonnançabilité

Ordonnancement RM
Condition d’ordonnancement

 Si résultat n’est pas concluant, il faut réduire le U en jouant


sur Ci (optimisation du code, un CPU plus rapide,. . .)
 ou tout simplement en augmentant le Ti pour certains
processus

72
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Test d’ordonnançabilité

Ordonnancement RM
Exemples

Exemple 1 :

Process Période Ti Durée Ci Priorité Pi Utilisation Ui


a 50 12 3 0.24
b 40 10 2 0.25
c 30 10 1 0.33

 L’utilisation totale (combinée) est de 0.82 (82%)


 Pour 3 processus, le U calculé est supérieur au seuil G =
0.78 → le test échoue

73
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Test d’ordonnançabilité

Ordonnancement RM
Exemples

Source Christian Poellabauer. Real time systems. 2007

74
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Test d’ordonnançabilité

Ordonnancement RM
Exemples

Exemple 2 :

Process Période Ti Durée Ci Priorité Pi Utilisation Ui


a 80 32 3 0.400
b 40 5 2 0.125
c 16 4 1 0.250

 L’utilisation totale (combinée) est de 0.775 (77.5%)


 Pour 3 processus, le U calculé est inférieur au seuil G =
0.78 → le test est vérifié avec succès

75
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Test d’ordonnançabilité

Ordonnancement RM
Exemples

Exemple 3 :

Process Période Ti Durée Ci Priorité Pi Utilisation Ui


a 80 40 3 0.50
b 40 10 2 0.25
c 20 5 1 0.25

 L’utilisation totale (combinée) est de 1.0 (100%)


 Pour 3 processus, le U calculé est supérieur au seuil G =
0.78 → le test devrait échoué mais ce n’est pas le cas

76
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Test d’ordonnançabilité

Ordonnancement RM
Exemples

Source Christian Poellabauer. Real time systems. 2007

77
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Test d’ordonnançabilité

Ordonnancement RM
L’analyse de temps de réponse (RTA)

 Pour calculer le pire temps de réponse pour une tâche i, il


faut prendre en compte sa deadline et les interférences avec
les tâches plus prioritaires

Wi < Ti (3)

Wi = Ci + Ii (4)

 Comment déterminer les interférences des tâches plus


prioritaires ?
 Pendant l’exécution d’une tâche Wi , toutes les tâches plus
prioritaires peuvent l’interrompre
 Une tâche Wj plus prioritaire par rapport à la tâche Wi
Tj ⌉ fois
peut interrompre la tâche Wi ⌈ C i

78
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Test d’ordonnançabilité

Ordonnancement RM
L’analyse de temps de réponse (RTA)

 L’interférence totale d’une tâche j par rapport à la tâche i


moins prioritaire est donnée par :

Ci
⌈ ⌉ · Cj (5)
Tj

 Ceci nous amène à l’équation RTA :


X Wi
W i = Ci + ⌈ ⌉ · Cj (6)
Tj
j∈hp(i)

 où hp(i) est l’ensemble de tâches de priorité supérieure à la


tâche i
79
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Test d’ordonnançabilité

Ordonnancement RM
L’analyse de temps de réponse (RTA)

 Une méthode de calcul itérative est souvent utilisée


 où Wi0 = Ci
 La condition d’arrêt est la suivante :

→ soit ∃k ′ tel que Wik > Ti
′ ′
→ soit Wik = Wik +1
N
X Wik
Wik+1 = Ci + ⌈ ⌉ · Cj (7)
Tj
j∈hp(i)

80
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Test d’ordonnançabilité

Analyse de temps de réponse - RTA


Exemples

Exemple 1
Process Période Ti Durée Ci Priorité Pi
a 7 3 1
b 12 3 2
c 20 5 3

Ca = 3
Wa0 = Ca + Ia = 3 + 0 = 3
Wb0 = Cb = 3
W0
Wb1 = Cb + ⌈ Tab ⌉ · Ca = 3 + ⌈ 73 ⌉ · 3 = 6
W1
Wb2 = Cb + ⌈ Tab ⌉ · Ca = 3 + ⌈ 76 ⌉ · 3 = 6
Wc0 = Cc = 5
81
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Test d’ordonnançabilité

Analyse de temps de réponse - RTA


Exemples

0 0
Wc1 = Cc + ⌈ W Wc 5 5
Ta ⌉ · Ca + ⌈ Tb ⌉ · Cb = 5 + ⌈ 7 ⌉ · 3 + ⌈ 12 ⌉ · 3 = 11
c

1 1
Wc2 = Cc + ⌈ W Wc 11 11
Ta ⌉ · Ca + ⌈ Tb ⌉ · Cb = 5 + ⌈ 7 ⌉ · 3 + ⌈ 12 ⌉ · 3 = 14
c

2 2
Wc3 = Cc + ⌈ W Wc 14 14
Ta ⌉ · Ca + ⌈ Tb ⌉ · Cb = 5 + ⌈ 7 ⌉ · 3 + ⌈ 12 ⌉ · 3 = 17
c

3 3
Wc4 = Cc + ⌈ W Wc 17 17
Ta ⌉ · Ca + ⌈ Tb ⌉ · Cb = 5 + ⌈ 7 ⌉ · 3 + ⌈ 12 ⌉ · 3 = 20
c

4 4
Wc5 = Cc + ⌈ W Wc 20 20
Ta ⌉ · Ca + ⌈ Tb ⌉ · Cb = 5 + ⌈ 7 ⌉ · 3 + ⌈ 12 ⌉ · 3 = 20
c

82
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Test d’ordonnançabilité

Analyse de temps de réponse - RTA


Exemples

Exemple 2
Process Période Ti Durée Ci Priorité Pi
c 80 40 3
b 40 10 2
a 20 5 1

Ca = 5
Wa0 = Ca + Ia = 5 + 0 = 5
Wb0 = Cb = 10
W0 10
Wb1 = Cb + ⌈ Tab ⌉ · Ca = 10 + ⌈ 20 ⌉ · 5 = 15
W1 15
Wb2 = Cb + ⌈ Tab ⌉ · Ca = 10 + ⌈ 20 ⌉ · 5 = 15
Wc0 = Cc = 40
83
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Test d’ordonnançabilité

Analyse de temps de réponse - RTA


Exemples

0 0
Wc1 = Cc +⌈ W Wc 40 40
Ta ⌉·Ca +⌈ Tb ⌉·Cb = 40+⌈ 20 ⌉·5+⌈ 40 ⌉·10 = 60
c

1 1
Wc2 = Cc +⌈ W Wc 60 60
Ta ⌉·Ca +⌈ Tb ⌉·Cb = 40+⌈ 20 ⌉·5+⌈ 40 ⌉·10 = 75
c

2 2
Wc3 = Cc +⌈ W Wc 75 75
Ta ⌉·Ca +⌈ Tb ⌉·Cb = 40+⌈ 20 ⌉·5+⌈ 40 ⌉·10 = 80
c

3 3
Wc4 = Cc +⌈ W Wc 80 80
Ta ⌉·Ca +⌈ Tb ⌉·Cb = 40+⌈ 20 ⌉·5+⌈ 40 ⌉·10 = 80
c

 Nous remarquons qu’en utilisant l’analyse RTA la condition


d’ordonnancement est vérifiée
 En présence d’un ordonnancement préemptif et de tâches
périodiques indépendantes
→ RM permet d’utiliser des priorités fixes pour les tâches
→ RM donne un critère suffisant d’ordonnançabilité

84
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Le partage de ressources

Sommaire

4 Programmation multi-tâches
Le partage de ressources
Mutex
Sémaphores
Moniteurs
Timers & Signaux

84
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Le partage de ressources

Le partage de ressources
 Dans une application multi-tâches, certaines ressources
(logicielles ou matérielles) peuvent être partagées entre
plusieurs tâches.
 De manière générale, l’accès à une ressource commune doit
être réglementé, sous peine d’engendrer un
dysfonctionnement de l’application.
Exemple 1 :
 partage d’une ressource commune - écran
Tâche 1 : Tâche 2 :
begin begin
while true do while true do
print("Task 1!\n"); print("Ksat 2!\n");
end while; end while;
end; end;

85
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Le partage de ressources

Le partage de ressources

Hypothèse de simulation :
 ordonnanceur à partage de temps
 la durée de commutation de tâches négligée
 quantum de temps = 4ms
 affichage d’un caractère = 1ms
Que verra-t-on s’afficher à l’écran ?

86
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Le partage de ressources

Le partage de ressources

TaskKsat 1!<CR><LF>
2!<CR><LF>
TaskKsat 1!<CR><LF>
2!<CR><LF>
...

87
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Le partage de ressources

Le partage de ressources
Exemple 2 : affichage de l’heure
 partage d’une ressource commune = variable hour
 T1 : affiche l’heure
Tâche 2 :
 T2 : met à jour l’heure
begin
if secondes = 59 then
if minutes = 59 then
minutes = 0;
Tâche 1 : if hours = 23 then
hours = 0;
begin else
print(seconds) hours = hours +1;
print(minutes) end if;
print(hours) else
end; minutes = minutes +1;
end if;
secondes = 0;
else
secondes = secondes + 1;
end if;
end;
88
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Le partage de ressources

Le partage de ressources

Hypothèse de simulation :
 ordonnanceur à partage de temps
 la durée de commutation de tâches négligée
 La tâche 1 interrompue par la tâche 2 s’exécutant en entier
 Conditions initiales : time = 11:59:59
Que verra-t-on s’afficher sur l’écran ?

89
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Le partage de ressources

Le partage de ressources

T1: seconds: 59
T1: minutes: 59
T2: time= 12:00:00
T1: hour: 12

 La tâche 2 interrompue par la tâche 1 s’exécutant en entier


 Conditions initiales : time = 11:59:59
Que verra-t-on s’afficher sur l’écran ?

90
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Le partage de ressources

Le partage de ressources

T2: hours: 12
T2: minutes: 00
T1: time= 12:00:59
T2: seconds: 00

Mécanismes de partage de ressources :


 mutex
 sémaphores

91
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Mutex

Sommaire

4 Programmation multi-tâches
Le partage de ressources
Mutex
Sémaphores
Moniteurs
Timers & Signaux

91
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Mutex

Mutex
Sémaphore binaire

Source Loïc Cuvillon. Systèmes temps réel et systèmes embarqués. 2014


92
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Mutex

Mutex
Sémaphore binaire

 Pour permettre une exclusion mutuelle entre deux


processus (threads) dans le même espace d’adressage
 Initialisation et destruction s’effectuent avec :

pthread_mutex_init(pthread_mutex_t *mutex, const


pthread_mutexattr_t *mutexattr);
pthread_mutex_destroy(pthread_mutex_t *mutex);

 Pour verrouiller/déverrouiller un mutex en C :

pthread_mutex_lock(pthread_mutex_t *mutex);
pthread_mutex_unlock(pthread_mutex_t *mutex);

93
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Mutex

Mutex
Sémaphore binaire

Source Loïc Cuvillon. Systèmes temps réel et systèmes embarqués. 2014

94
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Mutex

Mutex
Sémaphore binaire

Source Loïc Cuvillon. Systèmes temps réel et systèmes embarqués. 2014

95
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Mutex

Mutex
Sémaphore binaire

Tache()
{
...
pthread_mutex_lock(mutex_ptr);
//lecture/ecriture sur la ressource : la section critique
pthread_mutex_unlock(mutex_ptr);
}

96
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Mutex

Mutex
Sémaphore binaire

#include<stdio.h>
#include<string.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>

pthread_t tid[2];
int counter;

void* doSomeThing(void *arg)


{
unsigned long i = 0;
counter += 1;
printf("\n Job %d started\n", counter);

for(i=0; i<(0xFFFFFFFF);i++);
printf("\n Job %d finished\n", counter);

return NULL;
97
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Mutex

Mutex
Sémaphore binaire

int main(void)
{
int i = 0;
int err;

while(i < 2)
{
err = pthread_create(&(tid[i]), NULL, &doSomeThing, NULL);
if (err != 0)
printf("\ncan’t create thread :[%s]", strerror(err));
i++;
}

pthread_join(tid[0], NULL);
pthread_join(tid[1], NULL);

return 0;

98
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Mutex

Mutex
Sémaphore binaire

Source [Link]

99
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Mutex

Mutex
Sémaphore binaire

#include<stdio.h>
#include<string.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>

pthread_t tid[2];
int counter;
pthread_mutex_t lock;

void* doSomeThing(void *arg)


{
pthread_mutex_lock(&lock);

unsigned long i = 0;
counter += 1;
printf("\n Job %d started\n", counter);

for(i=0; i<(0xFFFFFFFF);i++);
100
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Mutex

Mutex
Sémaphore binaire

printf("\n Job %d finished\n", counter);

pthread_mutex_unlock(&lock);

return NULL;
}

int main(void)
{
int i = 0;
int err;

if (pthread_mutex_init(&lock, NULL) != 0)
{
printf("\n mutex init failed\n");
return 1;
}

101
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Mutex

Mutex
Sémaphore binaire

while(i < 2)
{
err = pthread_create(&(tid[i]), NULL, &doSomeThing, NULL);
if (err != 0)
printf("\ncan’t create thread :[%s]", strerror(err));
i++;
}

pthread_join(tid[0], NULL);
pthread_join(tid[1], NULL);
pthread_mutex_destroy(&lock);

return 0;
}

Source [Link]

102
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Mutex

Mutex
Sémaphore binaire

 Problèmes courants avec les mutexes (et sémaphores) :


▷ famine : les tâches prioritaires monopolisent les ressources
▷ inter blocage : tâches ayant chacune une ressource voulue
par une autre tâche
▷ inversion de priorité : exécution de tâches non
prioritaires car la tâche prioritaire attend une ressource
 Solutions possibles :
▷ interblocage : détection du blocage par le RTOS et
procédure de déblocage (libération forcée)
▷ inversion de priorité : utilisation d’algorithme d’héritage de
priorité

103
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Mutex

Mutex
Sémaphore binaire

 Exemple d’interblocage (deadlock )

Source Loïc Cuvillon. Systèmes temps réel et systèmes embarqués. 2014

104
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Mutex

Mutex
Sémaphore binaire
 Exemple d’inversion de priorité

105
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Mutex

Mutex
Sémaphore binaire

Source Loïc Cuvillon. Systèmes temps réel et systèmes embarqués. 2014

106
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Mutex

Mutex
Sémaphore binaire

 Il y a des algorithmes permettant de résoudre les problèmes


d’inversion de priorité
 Ces algorithmes sont implémentés généralement dans les
RTOS
 Le principe est de libérer au plus tôt la ressource qui bloque
la tâche prioritaire
 Si une tâche TA bloque sur une ressource détenue par une
tâche TB de priorité inférieure :
▷ la priorité de la tâche TB est élevée à la priorité de la tâche
TA
▷ dès que la ressource demandée est libérée, TB retrouve sa
priorité initiale

107
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Mutex

Mutex
Sémaphore binaire

 Un exemple de bug lié à l’inversion de priorité sur le rover


Mars Pathfinder → réinitialisation de la sonde à cause du
retard engendré par l’inversion de priorité
 Architecture du système :

108
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Mutex

Mutex
Sémaphore binaire

 Le contrôleur du bus 1553 @ 8Hz


 bc_sched : le signal comprenant l’opération à faire pour le
cycle suivant (priorité la plus élevée)
 bc_dist : le signal transférant les données de bus (priorité
3)
 Le cycle précédent (bc_dist) doit être terminé avant
l’opération initiée par bc_sched

109
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Mutex

Mutex
Sémaphore binaire

 ASI/MET à l’origine du problème (données météo - priorité


basse)
 préemption de la tâche bc_dist
 retard d’exécution de la tâche bc_dist
 l’appel de la tâche bc_sched → reset du système

110
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Mutex

Mutex
Sémaphore binaire

 Solution envoyée depuis la terre

. Source Marko Bertogna. The Mars Pathfinder. 2009


111
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Sémaphores

Sommaire

4 Programmation multi-tâches
Le partage de ressources
Mutex
Sémaphores
Moniteurs
Timers & Signaux

111
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Sémaphores

Sémaphores
 Un objet partagé, assimilable à un compteur, pouvant soit
être disponible (compteur ≥ 1) ou indisponible (0)
 l’acquisition d’un sémaphore décrémente son compteur
 la libération d’un sémaphore incrémente son compteur
 la tâche bloque (en attente) si le compteur est à zéro lors
d’une tentative d’acquisition
 un sémaphore binaire est un sémaphore dont le compteur
est limité à 1 (mutex)
 Les fonctions principales d’un sémaphore en C :
▷ sem_init() créer un sémaphore
▷ sem_destroy() supprimer un sémaphore
▷ sem_wait() acquérir un sémaphore
▷ sem_post() libérer un séemaphore
 Usage des sémaphores :
112
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Sémaphores

Sémaphores

▷ pour réguler accès à une ressource


▷ synchronisation entre tâches
Exemple 1 : Accès à une ressource mutliple

Source Loïc Cuvillon. Systèmes temps réel et systèmes embarqués. 2014

113
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Sémaphores

Sémaphores
 Exemple de déclaration de sémaphores en C
...
bufferSize = 3;
bufferSize1 = 1;
pthread_mutex_t mutex;
sem_t sem1, sem2;
sem_init(&sem1,0,bufferSize1);
sem_init(&sem2,0,bufferSize);
...

void function(){
sem_wait(&sem1);
pthread_mutex_lock(&mutex);
...
pthread_mutex_unlock(&mutex);
sem_post(&sem1);
...
}

114
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Sémaphores

Sémaphores
Implémentation en C

 Inclusion des bibliothèques


// Inclusion des bibliothèques nécessaires
#include <pthread.h> // Gestion des threads POSIX
#include <semaphore.h> // Gestion des sémaphores
#include <stdio.h> // Fonctions d’entrée/sortie (printf)
#include <stdlib.h> // Allocation mémoire dynamique (malloc, free)
#include <unistd.h> // Fonctions de temporisation (sleep)

115
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Sémaphores

Sémaphores
Implémentation en C

 Constantes et déclaration de sémaphore

#define NUM_THREADS 10 // Nombre total de threads à créer


sem_t semaphore; // Déclaration d’un sémaphore global

116
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Sémaphores

Sémaphores
Implémentation en C

 Fonction exécutée par chaque thread


void *thread_function(void *arg) {
// Récupération de l’identifiant du thread
int thread_id = *(int *)arg;
printf("Thread %d: Waiting to enter critical section...\n",
thread_id);
// Décrémente le sémaphore -> attente si valeur = 0
sem_wait(&semaphore);
printf("Thread %d: Entering critical section...\n", thread_id);

sleep(1); // Simulation d’un travail dans la section critique


printf("Thread %d: Leaving critical section...\n", thread_id);
// Incrémente le sémaphore -> libère la section critique
sem_post(&semaphore);
free(arg); // Libération de la mémoire allouée dynamiquement
return NULL; // Fin de la fonction du thread
}

117
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Sémaphores

Sémaphores
Implémentation en C

 Programme principal main


int main() {
pthread_t threads[NUM_THREADS]; // Tableau de threads
// Initialisation du sémaphore à 3
// => 3 threads peuvent entrer simultanément en section critique
sem_init(&semaphore, 0, 3);

for (int i = 0; i < NUM_THREADS; i++) {


// Allocation mémoire pour l’id
int *thread_id = malloc(sizeof(int));
// Affectation de l’identifiant
*thread_id = i;
pthread_create(&threads[i], NULL, thread_function, thread_id);
}
// Attente de la terminaison de tous les threads
for (int i = 0; i < NUM_THREADS; i++) {
pthread_join(threads[i], NULL);
}

118
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Sémaphores

Sémaphores
Implémentation en C

// Libération des ressources liées au sémaphore


sem_destroy(&semaphore);
return 0; // Fin du programme
}

119
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Sémaphores

Sémaphore
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define NUM_THREADS 10

sem_t semaphore;

void *thread_function(void *arg) {


int thread_id = *(int *)arg;
printf("Thread %d: Waiting to enter critical section...\n",
thread_id);

sem_wait(&semaphore); // Decrease semaphore value and enter critical


section
printf("Thread %d: Entering critical section...\n", thread_id);

// Simulate some work in the critical section


sleep(1);
120
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Sémaphores

Sémaphore

printf("Thread %d: Leaving critical section...\n", thread_id);


sem_post(&semaphore); // Increase semaphore value and leave critical
section

free(arg);
return NULL;
}

int main() {
pthread_t threads[NUM_THREADS];

// Initialize semaphore to 3, so up to 3 threads can access the


critical
// section simultaneously
sem_init(&semaphore, 0, 3);

for (int i = 0; i < NUM_THREADS; i++) {


int *thread_id = malloc(sizeof(int));
*thread_id = i;
pthread_create(&threads[i], NULL, thread_function, thread_id);
}
121
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Sémaphores

Sémaphore

for (int i = 0; i < NUM_THREADS; i++) {


pthread_join(threads[i], NULL);
}

sem_destroy(&semaphore);
return 0;
}

Source OpenAI. chatGPT 4.0. 2024. url : [Link]

122
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Sémaphores

Sémaphore

 Exemple 2 : Synchronisation

Source Loïc Cuvillon. Systèmes temps réel et systèmes embarqués. 2014

123
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Sémaphores

Sémaphore

#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

sem_t semaphore;

void *task1(void *arg) {


printf("Task 1: Performing some operation...\n");
sleep(2); // Simulate a task that takes some time
printf("Task 1: Operation completed.\n");

// Signal Task 2 to proceed


sem_post(&semaphore);

return NULL;
}

124
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Sémaphores

Sémaphore
void *task2(void *arg) {
// Wait for Task 1 to signal
sem_wait(&semaphore);

printf("Task 2: Starting operation after Task 1.\n");

return NULL;
}

int main() {
pthread_t thread1, thread2;

// Initialize semaphore with 0, meaning Task 2 will initially wait


sem_init(&semaphore, 0, 0);

// Create threads for Task 1 and Task 2


pthread_create(&thread1, NULL, task1, NULL);
pthread_create(&thread2, NULL, task2, NULL);

// Wait for both threads to finish


pthread_join(thread1, NULL);
125
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Sémaphores

Sémaphore

pthread_join(thread2, NULL);

// Destroy the semaphore


sem_destroy(&semaphore);

return 0;
}

Source OpenAI. chatGPT 4.0. 2024. url : [Link]

126
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Moniteurs

Sommaire

4 Programmation multi-tâches
Le partage de ressources
Mutex
Sémaphores
Moniteurs
Timers & Signaux

126
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Moniteurs

Moniteurs

 L’inconvénient principal des sémaphores : le risque d’oubli


de verrouiller ou déverrouiller une ressource partagée
 Nécessité de prendre et/libérer une ressource
 Une solution : → le moniteur de Hoare proposé en 1973
 Le principe est d’encapsuler une ressource
 Utilisation de la ressource uniquement à travers des
primitives définies au sein du moniteur
 Toutes les procédures sont protégées contre la réentrance
 Un moniteur possède des variables accessibles uniquement
via des primitives non réentrantes

127
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Moniteurs

Moniteurs

Un moniteur encapsule :
 les structures de données partagées
 les procédures opérant sur ces structures de données
 les mécanismes de synchronisation entre plusieurs appels
concurrents de procédures
Propriétés :
 Un moniteur protège ses données des accès illégitimes
 Il permet aux processus d’accéder à ces données de manière
définie à l’avance
 Un moniteur garantit une exclusion mutuelle
 Un seul processus peut exécuter une procédure d’un
moniteur à la fois

128
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Moniteurs

Moniteurs
Si un autre processus souhaite exécuter une procédure en
train d’être exécutée par un autre processus, il bloque le
processus appelant
 Un moniteur a une "file d’attente"
 Si un processus utilisant des procédures d’un moniteur
passe en état d’attente, un autre processus peut solliciter
les procédures du même moniteur
Exemple :
withdraw(amount)
Monitor account { balance=balance-amount; // en cours
double balance; d’exécution
withdraw(amount); // en attente
double withdraw(amount){ withdraw(amount); // en attente
balance=balance-amount; return balance;
return balance; balance=balance-amount;
} return balance;
} balance=balance-amount;
return balance;
129
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Moniteurs

Moniteurs

 Un moniteur utilise des variables conditionnelles


 3 types d’opérations supportées par les variables
conditionnelles :
▷ wait : l’opération d’attente
▷ signal : signal de réveil de processus en attente
▷ broadcast : signal de réveil de tous les processus en attente

 Les variables conditionnelles ne sont pas de simples


variables booléennes

130
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Moniteurs

Moniteurs

Exemple :
Monitor bounded_buffer {
Resource buffer[N]; Resource get_resource() {
// Variables for indexing buffer while (buffer array is empty)
Condition not_full, not_empty; wait(not_empty);
// Get resource R from buffer
void put_resource (Resource R) { array;
while (buffer array is full) signal(not_full);
wait(not_full); return R;
// Add R to buffer array; }
signal(not_empty); } // end monitor
}

131
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Moniteurs

Moniteurs
 Les processus peuvent être à différents niveaux d’un
moniteur
attendre de rentrer, attendre une variable conditionnelle,
être en train de l’exécuter, ...
 Les variables conditionnelles sont différentes des sémaphores
 Même si certains noms sont similaires
 On peut utiliser un mécanisme pour implémenter l’autre
(sémaphores pour moniteurs ou vice versa)
 Les différences au niveau de la procédure wait
▷ moniteur : le processus doit être à l’intérieur du moniteur
pour appeler wait
▷ sémaphore : le processus est uniquement bloqué dans la file
d’attente des processus
 Les différences au niveau de signal
132
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Moniteurs

Moniteurs

▷ moniteur : si il n’y a pas de procédure en attente, le signal


est perdu
▷ sémaphore : le compteur est soit incrémenté ou décrémenté

133
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Moniteurs

Moniteurs

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

// Buffer and synchronization primitives


#define BUFFER_SIZE 5
int buffer[BUFFER_SIZE];
int count = 0;

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;


pthread_cond_t not_empty = PTHREAD_COND_INITIALIZER;
pthread_cond_t not_full = PTHREAD_COND_INITIALIZER;

void *producer(void *arg) {


for (int i = 0; i < 10; i++) {
pthread_mutex_lock(&mutex);

// Wait if buffer is full


while (count == BUFFER_SIZE) {
printf("Producer waiting: buffer full!\n");

134
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Moniteurs

Moniteurs
pthread_cond_wait(&not_full, &mutex);
}

// Produce an item
buffer[count] = i;
printf("Produced: %d\n", i);
count++;

// Signal the consumer


pthread_cond_signal(&not_empty);

pthread_mutex_unlock(&mutex);
}
return NULL;
}

void *consumer(void *arg) {


for (int i = 0; i < 10; i++) {
pthread_mutex_lock(&mutex);

// Wait if buffer is empty


135
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Moniteurs

Moniteurs
while (count == 0) {
printf("Consumer waiting: buffer empty!\n");
pthread_cond_wait(&not_empty, &mutex);
}

// Consume an item
int item = buffer[--count];
printf("Consumed: %d\n", item);

// Signal the producer


pthread_cond_signal(&not_full);

pthread_mutex_unlock(&mutex);
}
return NULL;
}

int main() {
pthread_t prod_thread, cons_thread;

// Create producer and consumer threads


136
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Moniteurs

Moniteurs

pthread_create(&prod_thread, NULL, producer, NULL);


pthread_create(&cons_thread, NULL, consumer, NULL);

// Wait for both threads to finish


pthread_join(prod_thread, NULL);
pthread_join(cons_thread, NULL);

// Clean up
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&not_empty);
pthread_cond_destroy(&not_full);

return 0;
}

Source OpenAI. chatGPT 4.0. 2024. url : [Link]

137
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Timers & Signaux

Sommaire

4 Programmation multi-tâches
Le partage de ressources
Mutex
Sémaphores
Moniteurs
Timers & Signaux

137
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Timers & Signaux

Timers
 Création d’un timer

timer_create(clockid_t clockid, struct sigevent *evp,


timer_t *timerid);

 clockid - est souvent le paramètre CLOCK_MONOTHONIC


 sigevent - définit le comportement du timer une fois la
durée écoulée (envoyer un signal ou démarrer une fonction
dans un nouveau thread)
 timerid - est l’identifiant du timer
 Pour configurer un timer

timer_settime(timer_t timerid, int flags, struct


itimerspec *newvalue, struct itimerspec *oldvalue);
138
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Timers & Signaux

Timers
 Pour supprimer un timer

timer_delete(timer_t timerid);

 Pour retrouver la résolution du timer utilisée


clock_getres, . . .
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>
#include <unistd.h>

void handler_signal_1(int inutilise) { fprintf(stderr, "t1 "); }

void handler_signal_2(int inutilise) { fprintf(stderr, "t2 "); }

int main(int argc, char *argv[]) {


139
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Timers & Signaux

Timers
timer_t timer_1, timer_2;
struct sigevent event_1, event_2;
struct itimerspec spec_1, spec_2;

// Installer les handlers


signal(SIGRTMIN + 1, handler_signal_1);
signal(SIGRTMIN + 2, handler_signal_2);

// Indiquer la notification desiree


event_1.sigev_notify = SIGEV_SIGNAL;
event_1.sigev_signo = SIGRTMIN + 1;

// Configurer la periode du timer


spec_1.it_interval.tv_sec = 2;
spec_1.it_interval.tv_nsec = 0;
spec_1.it_value = spec_1.it_interval;

// Allouer le timer
if (timer_create(CLOCK_REALTIME, &event_1, &timer_1) != 0) {
perror("timer_create");
exit(EXIT_FAILURE);
140
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Timers & Signaux

Timers
}

// Memes operations pour le second timer


event_2.sigev_notify = SIGEV_SIGNAL;
event_2.sigev_signo = SIGRTMIN + 2;
/*spec_2.it_interval.tv_sec = 1;*/
spec_2.it_interval.tv_sec = 0;
/*spec_2.it_interval.tv_nsec = 0; // 0,25 sec.*/
spec_2.it_interval.tv_nsec = 125000000; // 0,25 sec.
spec_2.it_value = spec_2.it_interval;
if (timer_create(CLOCK_REALTIME, &event_2, &timer_2) != 0) {
perror("timer_create");
exit(EXIT_FAILURE);
}

// Programmer les timers


if ((timer_settime(timer_1, 0, &spec_1, NULL) != 0) ||
(timer_settime(timer_2, 0, &spec_2, NULL) != 0)) {
perror("timer_settime");
exit(EXIT_FAILURE);
}
141
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Timers & Signaux

Timers

while (1)
pause();
return EXIT_SUCCESS;
}

Christophe Blaess. Solutions temps réel sous Linux. Eyrolles, 2012

142
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Timers & Signaux

Signaux

 Un mécanisme de notification asynchrone


 Le comportement de signaux peut être configuré avec
sigaction()
 Le masque utilisé pour les signaux bloqués peut être changé
avec pthread_sigmask()
 Tous les signaux se trouvent entre SIGRTMIN et SIGRTMAX,
au total 32 signaux

143
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Introduction Références Systèmes embarqués Systèmes temps réel
Timers & Signaux

Communication inter process

Plusieurs types de communication :


 sémaphores (semaphores)
 file de message (message queues)
 mémoire partagée (shared memory)

144
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Introduction

Sommaire

5 Linux embarqué
Introduction
Les composantes logicielles
Chaîne de compilation
Bootloader
Le noyau Linux
Système de fichiers
Busybox

144
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Introduction

Historique

 1983, Richard Stallman, projet GNU et le concept du


logiciel libre (gcc, gdb, glibc, . . .)
 1991, Linus Torvalds, le noyau Linux et Unix-like système
d’exploitation → un OS libre et gratuit GNU/Linux
 1995, Linux est de plus en plus utilisé dans les serveurs
 2000, Linux est de plus en plus populaire dans les systèmes
embarqués
 2008, Linux est de plus en plus utilisé dans les systèmes
nomades
 2010, Linux est de plus en plus utilisé dans les mobiles

145
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Introduction

Historique
L’e-mail de Linus

From: mailto: torvalds@[Link]


(Linus Benedict Torvalds)

To: Newsgroups: [Link]


Subject: What would you like to see most in minix?
Summary: small poll for my new operating system
Message-ID: <mailto: 1991Aug25.205708.9541@[Link]

Hello everybody out there using minix — I’m doing a (free)


operating system (just a hobby, won’t be big and professional
like gnu) for 386 (486) AT clones. This has been brewing
since april, and is starting to get ready. I’d like any
feedback on things people like/dislike in minix, as my OS
resembles it somewhat (same physical layout of the
file-system (due to practical reasons) among other things).
146
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Introduction

Historique
L’e-mail de Linus

I’ve currently ported bash (1.08) and gcc (1.40), and things
seem to work. This implies that I’ll get something practical
within a few months, and I’d like to know what features most
people would want. Any suggestions are welcome, but I won’t
promise I’ll implement them :-).

Linus (mailto: torvalds@[Link])

PS. Yes — it’s free of any minix code, and it has a


multi-threaded fs. It is NOT protable (uses 386 task switching
etc), and it probably never will support anything other than
AT-harddisks, as that’s all I have :-(.

147
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Introduction

Logiciel libre
Un logiciel est considéré libre si sa licence permet aux
utilisateurs des libertés suivantes :
 d’utiliser le logiciel à des fins diverses et variées
 d’analyser et modifier le logiciel,
 de distribuer les copies du logiciel original et
 de ses versions modifiées
 Liberté d’utiliser ces logiciels à des fins commerciales et non
commerciales
 Le code source du logiciel doit être mis à disposition
 Adapté pour les systèmes embarqués
 Qu’est-ce que c’est Linux embarqué ?
 C’est l’utilisation du noyau Linux et de ses composantes
différentes dans les systèmes embarqués
148
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Introduction

Linux embarqué
Avantages

 La possibilité de réutilisation du logiciel ou d’une ou


plusieurs de ses parties
 Un grand support de matériel, protocoles, de libraries . . .
 Dès qu’un protocole ou matériel rencontre un succès, la
probabilité d’avoir une implémentation open source est plus
importante
 Permet de concevoir des produits de qualité basés sur des
composantes existantes
 Réutilisation, réutilisation, réutilisation des logiciels
développés (on ne réinvente pas la roue !)
 L’attention doit être sur la valeur ajoutée de votre produit,
pas sur ses fonctionnalités ou services de base (dont tous les
systèmes disposent)
149
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Introduction

Linux embarqué
Avantages

 Un coût très faible, voire inexistant


 Tout peut être gratuit y compris les outils de
développement
 Duplication du logiciel développé sur n’importe quel
nombre de dispositifs finaux
 Le coût réduit voire zéro sur les licences peut être réinvesti
dans le matériel plus performant
 Un contrôle total de votre système : tout le code de tous les
composants est disponible permettant de changer, modifier,
optimiser n’importe quelle partie de votre système
 Open source ne veut pas dire de mauvaise qualité. Au
contraire, une utilisation de plus en plus massive rend les
outils open source de meilleure qualité
150
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Introduction

Linux embarqué
Avantages

 Une meilleure exploration des solutions finales : la


disponibilité des logiciels open source nous permet de
choisir la solution la mieux adaptée à notre système
 Un support communautaire très important : un bug détecté
est souvent rapidement corrigé par la communauté

151
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Introduction

Processeurs
Architectures supportées

 Un grand nombre d’architecture de processeurs supportées


(32 et 64 bits) :
 Intel x86 et x86-64 (PC et embarqué)
 ARM (multimédia, industrie)
 PowerPC (temps réel, industrie)
 MIPS (processeurs de réseau)
 Blackfin (architecture DSP)
 Microblaze (soft-core de Xilinx FPGA)
 NIOS (soft-core de Altera FPGA)
 ...
 sans ou avec MMU (Memory Management Unit)
 Linux n’est pas adapté pour les petits microcontrôleurs
152
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Introduction

Processeurs
Architectures supportées

 A part la chaine de compilation, le bootloader et le noyau,


toutes les autres composantes sont indépendantes de
l’architecture choisie

153
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Introduction

RAM et stockage

 RAM : un système de base peut fonctionner uniquement


avec 8Mo de RAM (dépend de l’application)
 En général, au moins 32Mo est utilisé pour un
fonctionnement correct
 Flash (NAND ou NOR) et les supports de stockage de type
SD/MMC/eMMC sont supportés
 Pas de restriction au niveau de la quantité de RAM
(comme sous certains OS)

154
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Introduction

Communication

Un support pour une variété de protocoles de communication :


 I 2C
 SPI
 CAN
 1-wire
 SDIO (Secure Digital Input/Output)
 USB
et les protocoles réseaux :
 Ethernet, Wifi, Bluetooth, CAN, etc.
 IPv4, IPv6, TCP, UDP, SCTP, DCCP, etc.
 pare-feu, multicast . . .

155
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Introduction

Architecture globale

. Source Free Electrons. Embedded Linux System Development. 2015


156
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Les composantes logicielles

Sommaire

5 Linux embarqué
Introduction
Les composantes logicielles
Chaîne de compilation
Bootloader
Le noyau Linux
Système de fichiers
Busybox

156
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Les composantes logicielles

Les composantes logicielles de base

 Chaîne de compilation croisée (sur la station de travail)


▷ compilateur tournant sur la machine de développement
mais générant du code pour la cible embarquée
 Bootloader
▷ démarré par le HW et responsable de l’initialisation basique
et le démarrage du noyau
 Noyau Linux
▷ Gestion de processus et de mémoire, du réseau, des pilotes
pour différents matériels et assure la communication avec
les applications utilisateur
 Library C
▷ L’interface entre le noyau et les applications utilisateur
 Libraries et applications utilisateur

157
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Les composantes logicielles

Linux embarqué

 Versions commerciales
▷ MontaVista, Wind River ou TimeSys
▷ Outils de développement fournis (un mixte des outils open
source et propriétaires)
 Version libre est la solution qui est généralement la plus
utilisée
 Notre choix se porte également sur cette solution

158
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Les composantes logicielles

L’OS pour le Linux embarqué

 Le choix naturel est une plateforme Linux


 Tous les outils utilisés tournent déjà sous Linux
 Les connaissances d’un système Linux classique peuvent
facilement et sont souvent transposées sur le système Linux
embarqué
 Notre choix se porte sur Centos ou Fedora (machine
virtuelle tournant sous Windows)
 La façon dont les packages sont gérés est dépendante de la
distribution utilisée
 Les packages Centos/Fedora sont .rpm
 Tous les packages se trouvent dans les dépots accessibles
via le réseau internet

159
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Les composantes logicielles

L’OS pour le Linux embarqué


 Installation d’un package sous Cenots/Fedora se fait via
l’utilisation de la commande :
sudo yum install package_name (dnf au lieu de yum sur
nouvelles Fedora)
sudo indique que vous devez avoir les droits administrateur
sur le système pour pouvoir installer un package
sudo vous demande votre mot de passe utilisateur
 Si le package n’est pas disponible dans un dépôt, on peut le
télécharger manuellement et l’installer vie
rpm -ivh package_name.rpm
 Pour vérifier si un package est installé, on utilise
rpm -qa|grep package_name

160
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Les composantes logicielles

Hôte vs cible
 Hôte (Host) - la station de développement
 Cible (Target) - le système embarqué
 Les deux systèmes sont souvent connectés par au moins un
moyen de communication : liaison série, ethernet, JTAG . . .

. Source Chistopher Hallinan. Embedded Linux Primer - A Practical Real


World Approach, 2nd Edition. Prentice Hall, 2010
161
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Les composantes logicielles

Communication série
 un moyen de communication indispensable avec une
plateforme embarquée
 Plusieurs outils de communication disponibles dépendant
du SE choisi pour le développement (HyperTerminal,
putty sous Windows)
 Sous Linux : minicom, picocom, gtkterm, putty, . . .
 Nous utiliserons minicom
▷ Installation : sudo yum install minicom
▷ Utilisation : sudo minicom -s
▷ Un menu permettant de le configurer et de choisir surtout le
port et la vitesse de communication
 Les ports série sous Linux :
▷ ttyUSBx pour les port série via USB (x est le numéro du
port)
162
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Les composantes logicielles

Communication série

▷ ttySx pour les véritables ports séries (x est le numéro du


port)
▷ Pour savoir quel port a été affecté à une liaison série,
utiliser dmesg

163
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Chaîne de compilation

Sommaire

5 Linux embarqué
Introduction
Les composantes logicielles
Chaîne de compilation
Bootloader
Le noyau Linux
Système de fichiers
Busybox

163
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Chaîne de compilation

Chaîne de compilation croisée


Cross-compiling toolchains

 La chaîne de développement classique est la chaîne native


(native toolchain)
 Cette chaîne de compilation tourne sur la station de travail
et génère le code pour elle (architecture x86 ou x86_64 en
général)
 Pour les systèmes embarqués, la chaîne native de
compilation d’une station de travail n’est souvent pas
adaptée
▷ L’architecture de processeur est rarement identique à celle
d’un système embarqué
▷ Le système embarqué dispose de moins de ressources en
mémoire RAM et de stockage
▷ Le système embarqué est moins rapide en comparaison à la
station de travail
164
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Chaîne de compilation

Chaîne de compilation croisée


Cross-compiling toolchains

▷ Au final, le système embarqué n’a pas souvent besoin de


tous les outils de la chaîne de compilation croisée
 Une solution est d’utiliser une chaîne de compilation
croisée
→ Une chaine de compilation qui tourne sur une station de
travail mais générant le code fonctionnel pour un système
embarqué

165
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Chaîne de compilation

Chaîne de compilation croisée


Cross-compiling toolchains

Source Free Electrons. Embedded Linux System Development. 2015

166
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Chaîne de compilation

Chaîne de compilation croisée


Cross-compiling toolchains

 Nous distinguons un certain nombre de machines :


▷ build machine : la machine sur laquelle la chaine de
compilation est générée
▷ host machine : la machine sur laquelle la chaine de
compilation est utilisée
▷ target machine : la machine sur laquelle les fichiers
binaires compilés seront exécutés
 Plusieurs types de configurations existent :

167
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Chaîne de compilation

Chaîne de compilation croisée


Cross-compiling toolchains

Source Free Electrons. Embedded Linux System Development. 2015

168
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Chaîne de compilation

Chaîne de compilation croisée


Cross-compiling toolchains

 Les composantes principales d’une chaine de compilation


croisée :

Source Free Electrons. Embedded Linux System Development. 2015


169
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Chaîne de compilation

Chaîne de compilation croisée


Cross-compiling toolchains

 Binutils est un ensemble d’outils utilisés pour générer et


manipuler les binaires pour l’architecture donnée
▷ as : l’assembleur permettant de générer le code binaire
depuis un code assembleur
▷ ld : un linker
▷ ar, ranlib : pour générer les archives .a utilisées pour les
libraries
▷ objdump, readlef, size, nm, strings : pour inspecter
et vérifier le code binaire généré
▷ strip : pour optimiser les binaires générés
▷ La licence GPL

170
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Chaîne de compilation

Chaîne de compilation croisée


Cross-compiling toolchains
Kernel headers
 La library C et programmes  Dans le cas contraire, il peut avoir
utilisateur doivent communiquer de soucis si les nouvelles options ne
avec le noyau sont pas sollicitées dans le
programme
 La library C nécessite les fichiers
d’en-têtes de noyau ainsi que les  Utilisation de fichiers d’en-têtes les
applications utilisateur plus récents n’est pas nécessaire
sauf si besoin pour les
 Si les binaires sont générés avec
fonctionnalités les plus récentes
une chaine de compilation croisée
utilisant des kernel headers moins
récents que le noyau tournant sur
le système, il y aura aucun souci
de fonctionnement, sauf que les
appels ou structures définis dans le
nouveau kernel ne seront pas Source Free Electrons. Embedded
accessibles Linux System Development. 2015
171
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Chaîne de compilation

Chaîne de compilation croisée


Cross-compiling toolchains

Compilateur GCC
 GNU Compiler Collection
 Peut compiler du code C, C++, Ada, Fortran, Java,
Objective-C, Objective-C++ et générer du code pour une
large gamme d’architectures de processeurs (ARM, AVR,
Blackfin, MIPS, PowerPC, . . .)
 [Link]
 La licence GPL

172
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Chaîne de compilation

Chaîne de compilation croisée


Cross-compiling toolchains

La librarie C
 Une composante essentielle d’un système Linux
▷ permet d’établir l’interface entre les applications utilisateur
et le noyau Linux (system calls)
▷ fournit l’interface C API pour faciliter le développement
d’application
 Plusieurs libraries C sont disponibles :
glibc, uClibc, eglibc, dietlibc, newlib,...
 Le choix de la library C est effectué au moment de la
génération de la chaîne de compilation croisée (gcc est lié à
la library C choisie)
Exemples :
 Un programme "Hello World !" :
173
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Chaîne de compilation

Chaîne de compilation croisée


Cross-compiling toolchains

Source Free Electrons. Embedded Linux System Development. 2015


Thumb-2 est un jeu d’instruction optimisé (16 bit) pouvant être exécuté sur des
processeurs 32 bit → gain en vitesse et en ressources utilisées (empreinte mémoire)

174
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Chaîne de compilation

Générer une chaine de compilation

 Générer une chaine de compilation manuellement est très


difficile et nécessite beaucoup de temps
 Plein de paramètres à configurer
 Une solution plus simple sont les chaines de compilation
pré-compilées
▷ Avantages : plus simple
▷ Inconvénient : une chaîne moins optimisée
 Un certain nombre de choix à faire : CPU, endianism, la
library C, ABI, . . .
 Differents chaines pré-compilées : Sourcery CodeBench,
Linaro toolchain, ELDK
 Une autre solution est d’utiliser un processus automatique
de génération d’une chaine de compilation croisée
175
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Chaîne de compilation

Générer une chaine de compilation

Les mêmes avantages que les chaines de compilation


précompilées avec une possibilité d’ajuster un certain
nombre de paramètres selon vos besoins
 Un exemple est l’outil crosstool-ng
▷ supporte une large gamme d’architectures de processeurs
▷ toutes les libraries C citées précédemment
▷ activement maintenu
▷ [Link]

176
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Chaîne de compilation

Crosstool-NG
Installation et utilisation
 Installation locale :
./configure enable-local
make
make install
 Une liste de configurations existantes pour une variété
d’architecture de processeurs
./ct-ng list-samples
 Pour charger une configuration simple
./ct-ng nom
 Pour paramétrer une configuration :
./ct-ng menuconfig
 Pour générer une configuration paramétrée :
./ct-ng build
177
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Chaîne de compilation

Crosstool-NG
Exercice d’installation

git clone git://[Link]/crosstool-ng


cd crosstool-ng/
git checkout crosstool-ng-1.20.0
// installer les dépendances nécessaires pour le ct-ng
sudo yum install dh-autoreconf gperf bison flex patch automake
libtool texinfo python-devel ncurses-devel
sudo yum groupinstall "Development tools"
sudo yum install gcc-c++ autoreconf
./configure --enable-local
// si il y a des dépendances manquantes, les intaller avec yum
make
make install
./ct-ng help
// lister toutes les configurations possibles
./ct-ng list-samples
// lister toutes les configurations à base de processeurs ARM
./ct-ng list-samples | grep arm
// Choisir la configuration arm-unknown-linux-gnueabi
./ct-ng arm-unknown-linux-gnueabi

178
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Chaîne de compilation

Crosstool-NG
Exercice d’installation

// Ouvrir le menu de configuration


./ct-ng menuconfig

// Faites un tour des menus et des options disponibles

// Options à choisir

Path and misc options


-> Maximum log level to see -> DEBUG

Toolchain options
-> Tuple’s alias -> arm-linux-

C compiler
-> Décocher link libstdc++ statically into the gcc binary
Debug facilities
-> Décocher dmalloc, duma, ltrace et strace
-> Cocher gdb enabled

179
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Chaîne de compilation

Crosstool-NG
Exercice d’installation

Sortir de l’inteface en sauvegardant (Exit and yes)

//Lancer la compilation
./ct-ng build

//Ceci peut prendre des heures ...

//Arreter la compilation en cours avec Ctrl+C

//Télécharger la chaine de compilation croisée disponible sur


ARCHE et l’exemple hello.c

//Décompresser l’archive
unzip [Link]

//Déplacer le répertoire généré dans /home/student


//Supprimer d’abord le répértoire x-tools généré par ct-ng
cd ~
rm -rf x-tools
cd ~/Download
180
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Chaîne de compilation

Crosstool-NG
Exercice d’installation

mv x-tools/ /home/student/

//Tester la chaine de compilation croisée


/home/student/x-tools/arm-unknown-linux-gnueabi/bin/arm-gcc -o
hello hello.c

//Exécuter le fichier généré


./hello //Que se passe-t-il à l’exécution?

//Vérifier le type du fichier


file hello // Donne un descriptif du fichier généré

//Générer un fichier exécutable statique


/home/student/x-tools/arm-unknown-linux-gnueabi/bin/arm-gcc -o
hello-static hello.c -static

//Comparer la taille des fichiers générés


du -sh hello
du -sh hello-static

181
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Chaîne de compilation

Crosstool-NG
Exercice d’installation

//Vérifier si la VM est connectée au réseau [Link]


ifconfig // donne l’adresse du réseau

//Se connecter à la plate-forme BeagleBone Black depuis un


terminal
ssh root@[Link]

//Depuis un autre terminal, envoyer les fichiers compilés vers la


plateforme
scp hello hello-static root@[Link]:/var/tmp

//Revenir vers le terminal de départ (connexion ssh)


cd /var/tmp
./hello
./hello-static
//Commentaires?

//Télécharger et compiler (sur la machine virtuelle) les fichiers


exemple-timer-create-02.c, calculer-statistiques.c et

182
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Chaîne de compilation

Crosstool-NG
Exercice d’installation

exemple-perturbateur.c se trouvant sur ARCHE avec les flags


suivants

arm-unknown-linux-gnueabi-gcc -Wall -g -pthread -pthread


exemple-timer-create-02.c -lrt -lm -o exemple-timer-create-02

//Envoyer les exécutables sur la BBB

//Exécuter les exécutables de la manière suivante:


./exemple-timer-create-02 1000 > [Link]
./calculer-statistiques < [Link]
//Commenter les résultats obtenus

//Dans un autre terminal sur la BBB, lancer


./exemple-perturbateur

//et en même temps refaire les mesures précédentes


//Commentaires?

183
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Bootloader

Sommaire

5 Linux embarqué
Introduction
Les composantes logicielles
Chaîne de compilation
Bootloader
Le noyau Linux
Système de fichiers
Busybox

183
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Bootloader

Bootloader

 Quelle est la différence entre un bootloader et BIOS ?


 BIOS = Basic Input Output System
 Bootloader = utilisé pour démarrer un OS embarqué, une
fois l’OS démarré le bootloader disparait (on ne peut plus y
accéder)
▷ initialisation du matériel
▷ démarrage d’une application binaire (par exemple un OS)
depuis un support physique, le réseau ou autre
▷ possibilité de décompresser les binaires à la volée
▷ un bootloader dispose souvent d’une interface de commande
permettant la configuration au démarrage par l’utilisateur

184
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Bootloader

Bootloader
Exemple : ARM TI OMAP3

 ROM code : un bout de code démarré par le processeur au


démarrage qui cherche un bootloader primaire sur un des supports
physiques valides (eMMC, SD, série, USB, . . .). Le bootloader
primaire est chargé dans la SRAM (mémoire on-chip). La taille
limitée et pas d’interactions avec utilisateur
 X-Loader ou U-Boot : le code chargé dans la SRAM dont le rôle
principal est d’initialiser les mémoires off-chip (DRAM, NAND et
MMC) et de charger le bootloader secondaire dans la RAM. Pas
d’interaction possible avec l’utilisateur. Fichier nommé MLO
 U-Boot : le bootloader secondaire qui démarre depuis la RAM.
Initialise le reste du matériel et charge le noyau d’un support
physique ou depuis le réseau dans la RAM et le démarre. Dispose
d’une interface utilisateur. Fichiers : [Link] et [Link]
 Le noyau Linux : démarre depuis la RAM. Prend la main sur le
système (bootloader n’existe plus)

185
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Bootloader

Bootloader
Exemple : architecture du SoC Sitara

Source AM335x Sitara Processors. 2014. url :


[Link]
186
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Bootloader

Bootloader secondaire
U-Boot

 Le bootloader secondaire chargeant le noyau est le


bootloader principal
 Dispose généralement d’une interface utilisateur
 Plusieurs types de bootloaders génériques :
▷ U-Boot de la société Denx est le bootloader le plus
souvent utilisé
[Link]
▷ Barebox independant de l’architecture est caractérisé par
un meilleur design, un code optimisé mais d’un support
matériel plus faible par rapport à U-Boot
 Nous nous intéressons uniquement à U-Boot
 U-Boot doit être configuré avant sa compilation
▷ make NOMdePLATEFORME_config
187
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Bootloader

Bootloader secondaire
U-Boot

où le NOMdePLATEFORME est le nom de la plateforme pour


laquelle le U-Boot va être généré
 Avant de compiler, il faut s’assurer que la chaine de
compilation croisée soit dans le PATH
export PATH=chemin_vers_repertoire_bin:$PATH
 Compilation : make
CROSS_COMPILE=arm-unknown-linux-gnueabi-
 Le résultat de cette opération est le fichier [Link]
représentant l’image du bootloader secondaire. En fonction
de la plateforme choisie avant la compilation, un certain
nombre de fichiers peut être généré (*.img, *.kwb, MLO,
...

188
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Bootloader

Bootloader secondaire
U-Boot

 Une fois compilé, U-Boot doit être installé sur un support


amovible (une carte MMC ou autre) puisque les supports
amovibles sont scrutés en premier par le processeur lors du
démarrage
 U-Boot installé permet d’effectuer un certain nombre
d’opérations de base via son shell
 Pour vérifier toutes les commandes disponibles, utiliser la
commande help
 Nous allons utiliser un nombre restreint de commandes :
▷ Pour afficher ou visualiser les variables d’environnement :
printenv, print, setenv,
▷ Pour charger un fichier distant de la machine hôte
tftpboot file,

189
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Bootloader

Bootloader secondaire
U-Boot

▷ Pour configurer le serveur tftp : setenv ipaddr ADDR et


setenv serverip ADDR
▷ Pour modifier les paramètres de démarrage du noyau
bootargs,
▷ Pour booter un noyau bootm,
▷ Pour vérifier le contenu de la mémoire à l’adresse ADDR md
ADDR . . .
 U-Boot est initialement utilisé pour charger et booter un
noyau linux mais peut également être utilisé pour charger
un système de fichier principal (rootfs) dans la mémoire
 La communication entre U-Boot et la machine hôte (de
développement) peut s’effectuer de plusieurs façons
différentes :

190
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Bootloader

Bootloader secondaire
U-Boot

▷ via Ethernet - notre cas et le cas préféré nécessitant des


pilotes pour le réseau ethernet dans le U-Boot et une
connexion ethernet de la plateforme hôte,
▷ une clé USB nécessitant des pilotes USB ou
▷ port série

 Le transfert de fichiers via le réseau s’effectue en utilisant le


TFTP (Trivial File Transfer Protocol ) - un protocole
similaire au protocole FTP sans authentification et utilisant
UDP
 Pour pouvoir utiliser TFTP du côté U-Boot il faut que le
TFTP soit installé du côté machine de développement
sudo yum install tftp-server

191
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Bootloader

Bootloader secondaire
U-Boot

 Pour pouvoir échanger les fichiers entre la plateforme de


développement et la plateforme embarquée (U-Boot), tous
les fichiers doivent être stockés dans /var/lib/tftpboot
 Du côté U-Boot, il n’y a rien à installer puisque un
tfpt-client est déjà intégré par défaut

192
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Bootloader

Qemu
Emulateur de matériel

 Matériel de développement est parfois indisponible pour


plusieurs raisons (rareté, coûteux, . . .)
 Une solution pour répondre à cette indisponibilité de
matériel de développement est l’utilisation d’émulateurs de
matériel
 Emulation par logiciel d’une plateforme matérielle
 Site officiel : [Link]
 Pour l’installer sous Fedora :
sudo yum install qemu-system-arm
 Pour vérifier les plateformes supportées :
qemu-system-arm -M ?
 Pour le tester :
193
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Bootloader

Qemu
Emulateur de matériel

wget [Link]
qemu/demos/arm/directfb/1.0/vmlinuz-qemu-arm-2.6.20
 Démarrer l’image téléchargée avec la commande suivante :
qemu-system-arm -M versatilepb -m 16 -kernel ←-
vmlinuz-qemu-arm-2.6.20 -append "clocksource= ←-
pit quiet rw"
 L’option -M correspond au type de carte émulée
 L’option -m indique l’espace mémoire vive alloué à
l’émulation
 L’option -append permet de passer des paramètres au
noyau
 Lancer la démo disponible sur la plateforme utilisant un
framebuffer :
194
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Bootloader

Qemu
Emulateur de matériel

run_demo
 Pour quitter la démo Ctrl+Q

195
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Bootloader

Bootloader
U-Boot : configuration et installation

//Télécharger le U-Boot
wget [Link]

//Décompresser l’archive
tar xjf [Link].bz2
cd u-boot-2015.01

//Configurer les variables d’environnement


export ARCH=arm
export CROSS_COMPILE=arm-uknown-linux-gnueabi-
export PATH=/home/student/x-tools/
arm-unkown-linux-gnueabi/bin:$PATH

//Choisir une configuration de base pour U-Boot


make versatilepb_config
make all

//Vérifier les fichiers générés [Link] et u-boot

196
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Bootloader

Bootloader
U-Boot : configuration et installation

//Install qemu-system-arm
sudo yum install qemu-system-arm

//Démarrer le U-Boot
qemu-system-arm -M versatilepb -nographic -kernel u-boot
//Faire un tour des options proposées par U-Boot
printenv
print <nom_de_variable>
setenv <nom_de_variable> <valeur>
editenv <nom_de_variable>
saveenv

//Installer le tftp-server et rpcbind


sudo yum install tftp-server rpcbind

//Démarrer les services tftp et rpcbind


sudo systemctl start rpcbind
sudo systemctl start [Link]
sudo systemctl start tftp

197
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Bootloader

Bootloader
U-Boot : configuration et installation

//Créer un fichier dans /var/lib/tftpboot


sudo chown [Link] /var/lib/tftpboot
cd /var/lib/tftpboot
touch [Link]
echo "Hello world" > [Link]

// Télécharger les fichiers qemu-ifup et qemu-ifdown


// Ces fichiers servent uniquement pour initialiser le réseau
entre la plateforme virtuelle et la machine hôte
// Remplacer em1 par enp0s3 dans les deux fichiers
chmod +x qemu-ifup
chmod +x qemu-ifdown
sudo cp qemu-ifup qemu-ifdown /etc

//Démarrer le bootloader avec le serveur tftp


sudo modprobe tun
sudo qemu-system-arm -M versatilepb -net nic -net tap,ifname=tap0
-kernel u-boot

198
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Bootloader

Bootloader
U-Boot : configuration et installation

//Configurer les variables ipaddr et serverip


setenv ipaddr [Link]
setenv serverip [Link]
ping [Link] //On doit avoir un signe du serveur
tftpboot [Link]
//Si le téléchargement réussi
md 0x7fc0

199
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Le noyau Linux

Sommaire

5 Linux embarqué
Introduction
Les composantes logicielles
Chaîne de compilation
Bootloader
Le noyau Linux
Système de fichiers
Busybox

199
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Le noyau Linux

Le noyau Linux

 Le noyau linux est la composante principale d’un système


embarqué linux
 open source, une grande communauté travaillant
quotidiennement sur son développement
 Une grande portabilité sur une large gamme d’architectures
de processeurs
 Scalable : peut être exécuté sur un support très restreint de
quelques MB jusqu’à . . .
 Un support réseau très développé
 Sécurité : tous les défauts sont facilement détectables et
corrigeables rapidement
 Stabilité et fiabilité

200
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Le noyau Linux

Le noyau Linux

Source Free Electrons. Embedded Linux System Development. 2015

201
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Le noyau Linux

Le noyau Linux
Les rôles principaux du noyau Linux :
 manager les ressources matérielles
 fournir des API (Application Programming Interface) pour
les applications utilisateur
 manager les accès concurrents aux ressources matérielles
depuis des applications différentes
→ Un exemple typique est l’interface réseau qui est partagé
entre plusieurs applications utilisateur par le noyau
 Nous distinguons deux espaces programmes différents :
▷ l’espace utilisateur et
▷ l’espace noyau
 Les échanges de données entre ces deux espaces s’effectuent
via les appels dits systèmes
202
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Le noyau Linux

Le noyau Linux

 Un appèl système passe par la library C : une application


utilisateur ne fait jamais directement d’appels système vers
le noyau sans passer par la library C
 Les informations du noyau sont mises à disposition de
l’utilisateur via les systèmes de fichiers pseudo souvent
appelés systèmes de fichiers virtuels
 Deux systèmes de fichiers principaux :
▷ proc monté sur /proc pour toutes les informations relatives
à l’OS
▷ sysfs monté sur /sys donnant des informations sur
l’ensemble de dispositifs et bus existants

203
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Le noyau Linux

Le noyau Linux

Source Free Electrons. Embedded Linux System Development. 2015

204
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Le noyau Linux

Le noyau Linux

 Le site officiel : [Link]


 Une archive d’un noyau Linux est très gourmande en
ressources : ≈ 600Mo
 La raison de cette grande taille sont des milliers de pilotes,
de protocoles réseau, architectures de processeurs, . . .
 Le noyau linux est très petit

205
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Le noyau Linux

Le noyau Linux

Exemple du noyau 3.10 :


 drivers/: 49.4 %
 arch/: 21.9 %  tools/: 0.9 %
 fs/: 6.0 %  scripts/: 0.5 %
 include/: 4.7 %  mm/: 0.5 %
 sound/: 4.4 %  crypto/: 0.4 %
 Documentation/: 4.0 %  security/: 0.4 %
 net/: 3.9 %  lib/: 0.4 %
 firmware/: 1.0 %  block/: 0.2 %
 kernel/: 1.0 %
Source Free Electrons. Embedded Linux System Development. 2015

206
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Le noyau Linux

Le noyau Linux
 Avant de compiler un noyau Linux, il faut le configurer
pour une plateforme matérielle
 La configuration pour une plateforme matérielle choisie est
stockée dans .config dans le dossier racine
 Il s’agit d’un fichier text sous forme key=value
 Pour configurer un noyau linux, il y a plusieurs solutions :
▷ make menuconfig - textuel
▷ make xconfig - graphique
 Le résultat d’une compilation de noyau réussie est un fichier
image dans le dossier boot/
 Lors du processus de configuration d’un noyau linux, il y a
plusieurs choix : Y, N ou M
▷ Y - oui
▷ N - non
207
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Le noyau Linux

Le noyau Linux
▷ M - module
 Un module est une partie compilée ne se chargeant pas au
démarrage avec le noyau. Il peut être chargé ultérieurement
▷ L’utilité des modules est dans le développement de pilotes
pour du matériel
▷ Sous linux, on peut charger un pilote sans redémarrer le
système
▷ L’intérêt principal des modules est d’alléger au maximum le
noyau Linux qui sera chargé au démarrage
▷ Les périphériques qui ne seront pas utilisés au démarrage
peuvent être démarrés ultérieurement
▷ Les modules sont uniquement chargés/déchargés en mode
root pour éviter les erreurs graves
▷ Une fois un système linux démarré, on peut vérifier à tout
moment les états des modules chargés
Pour ce faire, il suffit d’utiliser la commande dmesg
208
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Le noyau Linux

Le noyau Linux

▷ Pour insérer un module : sudo insmod <nom_du_module>


▷ Pour insérer un module avec ses dépendances : sudo
modprobe <nom_du_module>
▷ Pour supprimer un module chargé : rmmod
<nom_du_module>
▷ Pour lister les modules chargés : lsmod

 Pour compiler un noyau de manière générale


make
 Pour compiler un noyau avec une chaine de compilation
croisée
make ARCH=arm
CROSS_COMPILE=arm-unknown-linux-gnueabi-
il faut s’assurer que tous les binaires soient dans le PATH

209
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Le noyau Linux

Le noyau Linux
 Pour une compilation croisée, une large variété de
configuration existent dans arch/<arch>/configs/
où <arch> est l’architecture choisie (par exemple arm)
 Une fois le noyau compilé, un certain nombre de paramètres
peut être transmis via la ligne de commande du noyau
▷ root= précise le système de fichiers utilisé
▷ console= précise sur quel support les messages de
démarrage du noyau seront affichés
 Cette ligne de commande est soit passée par le bootloader
secondaire soit directement intégrée dans le noyau avec
l’option CONFIG_CMDLINE
 A la fin, on peut installer les modules avec
make ARCH=arm modules_install

210
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Le noyau Linux

Le noyau Linux

 Cette option est rarement utilisée pour les systèmes


embarqués
 Elle est utilisée une fois le système de fichier créé
 Dans ce cas, le répertoire d’installation doit être précisé
make ARCH=arm INSTALL_MOD_PATH=<dir>
modules_install

211
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Le noyau Linux

Le noyau Linux
Configuration et compilation

// Télécharger le noyau 3.15.4


[Link]
[Link]

// Décompresser l’archive téléchargée


tar xfv [Link]

// Exporter le chemin vers le compilateur croisé


export PATH=/home/student/x-tools/←-
arm-uknown-linux-gnueabi/bin:$PATH

// Choisir la configuration correspondant à la plateforme


matérielle
make ARCH=arm versatile_defconfig

// Installer les dépendances pour xconfig


sudo yum install qt-devel qt-config

// Lancer xconfig pour configurer le noyau téléchargé


make ARCH=arm xconfig
212
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Le noyau Linux

Le noyau Linux
Configuration et compilation

// Faire un tour des options disponibles

// Configurer le noyau de la facon suivante

// Pour configurer l’option de compilation croisée CROSS-COMPILE

General setup -> Cross-compiler tool prefix: // mettre la valeur


arm-unknown-linux-gnueabi-

// Vérifier si l’option suivante est sélectionnée


Kernel Features -> Use the ARM EABI to compile the kernel

// Vérifier si le support NFS est activé


File Systems -> Network File systems (NFS)

// Compiler le noyau pour l’architecture ARM


make ARCH=arm

213
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Le noyau Linux

Le noyau Linux
Configuration et compilation

// Créer l’image uImage pouvant être chargée par U-Boot


make ARCH=arm uImage

// Copier l’image générée dans le répertoire de travail de tftp


cp arch/arm/boot/uImage /var/lib/tftpboot/

// Charger le noyau compilé via U-Boot


// Configurer l’adresse IP
setenv ipaddr [Link]

// Configurer l’adresse IP du serveur


setenv serverip [Link]

// Télécharger le noyau via tftp


tftpboot uImage

// Passer des arguments au noyau

214
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Le noyau Linux

Le noyau Linux
Configuration et compilation

setenv bootargs console=ttyAMA0,115200n8 root=/dev/nfs←-


nfsroot=[Link]:/home/student/Desktop/rootfs,vers=3 rw ←-
ip=[Link]:::::: rootwait

// Booter le noyau
bootm

// Commenter les messages du noyau

// Y a-t-il un problème au démarrage?

// Le noyau linux "panique-t-il"?

// Pour quelle raison?

215
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Système de fichiers

Sommaire

5 Linux embarqué
Introduction
Les composantes logicielles
Chaîne de compilation
Bootloader
Le noyau Linux
Système de fichiers
Busybox

215
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Système de fichiers

Système de fichiers
Introduction

 Le système de fichiers est utilisé pour organiser les données


en répertoires et fichiers
 Le système de fichiers permet une organisation hiérarchique
 On peut monter (mount) et démonter (unmount) un
système de fichiers
 Une fois monté dans un répertoire (mount point), le
contenu du répertoire reflète le contenu du support de
stockage associé
 Une fois démonté, le contenu du répertoire choisi
initialement pour le point de montage est vide
 Le système de fichiers permet aux applications utilisateur
d’accéder facilement aux contenus exigés sans savoir où ils
sont montés physiquement
216
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Système de fichiers

Système de fichiers
Introduction

 Pour monter un support de stockage dans un point de


montage
mkdir /mnt/usb
mount -t vfat /dev/sda1 /mnt/usb
 Pour accéder au contenu de la clé usb :
ls /mnt/usb
 Le système de fichier principal est appelé root et souvent
identifié par /
 Le système de fichier principal est monté en premier par le
noyau au démarrage du système
 Si le noyau ne trouve pas de système de fichier, il "panique"

217
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Système de fichiers

Système de fichiers
Introduction

Kernel panic - not syncing: VFS: Unable to mount


root fs ...
 Le système de fichier principal peut être monté depuis
plusieurs supports physiques
▷ un disque dur (root=/dev/sdXY),
▷ une clé USB (root=/dev/sdXY),
▷ une carte SD(root=/dev/mmcblkXpY ),
▷ un réseau ethernet en utilisant le protocole NFS
(root=/dev/nfs),
▷ une mémoire via le bootloader,
▷ ...
 C’est au concepteur du système de décider le support
physique pour le système de fichier principal root

218
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Système de fichiers

Système de fichiers
Introduction

 Nous allons nous intéresser au montage du système de


fichiers principal via le réseau ethernet
▷ très facile à mettre à jour les fichiers du système de fichiers
principal
▷ permet d’explorer très facilement toutes les possibilités
(même celles n’étant pas permises par les ressources
physiques de la plateforme matérielle)

Source Free Electrons. Embedded Linux System Development. 2015


 Pour pouvoir utiliser un système de fichiers en NFS :
219
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Système de fichiers

Système de fichiers
Introduction

▷ il faut qu’un serveur de type NFS soit installé sur la


machine de développement :
sudo yum install nfs-utils
▷ il faut qu’un répertoire sur la machine de développement
soit choisi
mkdir /home/student/rootfs
▷ il faut que le serveur NFS soit configuré proprement
La configuration est décrite dans le fichier /etc/exports
Il faut rajouter une ligne supplémentaire du type
/home/student/rootfs
[Link](rw,no_root_squash,no_subtree_check)
Il faut démarrer (ou redémarrer) le serveur NFS
sudo exportfs -a
sudo systemctl start nfs
▷ Du côté de la plateforme embarquée, il faut que le noyau
soit compilé avec l’option NFS
220
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Système de fichiers

Système de fichiers
Introduction

▷ Ceci peut être vérifié en regardant le fichier .config du


noyau compilé
cat .config|grep -i nfs
▷ Au démarrage du noyau, un certain nombre de paramètres
concernant le serveur NFS doit être passé
root=/dev/nfs indiquant que le système de fichier principal
sera bien monté via le réseau
ip=[Link] indiquant l’adresse IP du serveur NFS
nfsroot=[Link]:/home/student/rootfs indiquant
le point de montage

221
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Système de fichiers

Système de fichiers
NFS - configuration et utilisation

// Vérifier la présence du serveur nfs


sudo yum install nfs-serveur

// Ouvrir le fichier de configuration du serveur NFS


sudo gedit /etc/exports

// Rajouter la ligne suivante


/home/student/Desktop/rootfs
[Link](rw,no_root_squash,no_subtree_check)

// Exporter le système de fichier nfs via la commande:


sudo exportfs -a

// Démarrer le service nfs


sudo systemctl start nfs

// Redémarrer le noyau avec les bootargs précédents


// Commenter les messages affichés par le noyau

222
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Système de fichiers

Système de fichiers
NFS - configuration et utilisation

// Y a-t-il un problème au démarrage?

// Le noyau linux "panique-t-il"?

// Pour quelle raison cette fois?

// Compiler le petit programme coucou.c affichant un petit message


#include <stdio.h>
#include <stdlib.h>
main (int ac, char **av)
{
while(1){
printf("Coucou\n");
sleep(1); // attente d’une seconde
}
}

//Compilation

223
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Système de fichiers

Système de fichiers
NFS - configuration et utilisation

arm-unknown-linux-gnueabi-gcc -o init coucou.c

// Déplacer le dans le dossier rootfs/sbin/ et le renommer init


mkdir rootfs/sbin
mv init /home/student/Desktop/rootfs/sbin

// Recharger le noyau depuis U-Boot avec les bootargs précédents


setenv bootargs console=ttyAMA0,115200n8 root=/dev/nfs ←-
nfsroot=[Link]:/home/student/Desktop/rootfs,vers=3 rw ←-
ip=[Link]:::::: rootwait

// Commenter les messages affichés par le noyau

// Y a-t-il des problèmes au démarrage?

224
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Système de fichiers

Système de fichier
initramfs

 Il est également possible d’avoir le système de fichier root


directement intégré dans l’image noyau
 Ce mécanisme est appelé initramfs
 Le système de fichier créé est compréssé et intégré dans
l’image noyau
 Une autre possibilité est de charger de manière séparée le
système de fichiers dans la RAM
 L’intérêt de cette option → rapidité du boot
 Cette solution est rarement choisie pour les systèmes
non-embarqués pour garder la taille de l’image noyau
raisonnable

225
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Système de fichiers

Système de fichier
initramfs

Source Free Electrons. Embedded Linux System Development. 2015


 Pour pouvoir démarrer avec un initramfs, le noyau doit
être compilé avec les options l’autorisant
CONFIG_INITRAMFS_SOURCE

226
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Système de fichiers

Système de fichier
initramfs

 Pour plus d’information, se référer à la source (dans les


sources noyau)

Documentation/filesystems/[Link]

227
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Système de fichiers

Système de fichiers
Organisation

 /bin Les programmes de base


 /boot l’image noyau
 /dev Les devices
 /etc Les fichiers de configuration système
 /home Le répertoire pour les fichiers utilisateur
 /lib Les libraries de base
 /media Les points de montages pour les dispositifs
amovibles
 /mnt Les points de montage pour les partitions statiques
 /proc Le point de montage pour le système de fichier
virtuel (communication avec le noyau)
 /root Le répertoire de base de root (compte admin)
228
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Système de fichiers

Système de fichiers
Organisation

 /sbin Les programmes système de base


 /sys Le point de montage pour le système de fichier virtuel
sysfs
 /tmp Les fichiers temporaires
 /usr
▷ /usr/bin Les programmes utilisateur non-basiques
▷ /usr/lib Les libraries secondaires (non-basiques)
▷ /usr/sbin Les programmes systèmes secondaires
(non-basiques)
 /var Les fichiers temporaires (log, . . .)

229
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Système de fichiers

Devices
Introduction

 Un des principaux rôles du noyau est d’autoriser l’accès au


matériel aux applications utilisateur
 Dans le noyau Linux, le matériel est présenté sous deux
formes :
▷ Character - le type de dispositif matériel permettant une
lecture/écriture en flux (streaming)
▷ Exemples : un port série, terminaux de communication,
carte son, cartes d’acquisition vidéo, . . .
▷ Block - le type de dispositif matériel composé de bloc de
taille fixe permettant la lecture et l’écriture de données
Exemples : disque dur, clé USB, cartes SD, . . .
 Chaque device sous Linux est représenté par le triplet :
▷ type : character ou block
▷ major : donne typiquement la catégorie de matériel
230
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Système de fichiers

Devices
Introduction

▷ minor : donne typiquement l’identifiant de matériel


 Sous Linux, tout matériel est représenté comme un fichier
(Everything is a file)
 Cette décision permet de manipuler tout le matériel comme
des fichiers normaux (open, read, write, close, . . .)
 Tous les devices, quel que soit leur type, sont listés dans le
répertoire /dev
 Pour vérifier la liste des devices disponibles, faire un
simple ls -l /dev/
 Exemple d’ouverture et d’écriture sur un port série :

231
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Système de fichiers

Devices
Introduction

int fd;
fd = open("/dev/ttyS0", O_RDWR);
write(fd, "Hello", 5);
close(fd);

 La création d’un device s’effectue de la façon suivante :


mknod /dev/<device> [c|b] major minor (privilèges
root)

232
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Busybox

Sommaire

5 Linux embarqué
Introduction
Les composantes logicielles
Chaîne de compilation
Bootloader
Le noyau Linux
Système de fichiers
Busybox

232
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Busybox

Système Linux de base


Introduction

 Un système Linux de base nécessite un certain nombre


d’applications pour pouvoir fonctionner correctement
 L’application qui démarre en premier est l’application init
 Le noyau au démarrage essaye de démarrer les applications
se trouvant aux emplacements /sbin/init, /bin/init,
/etc/init et /bin/sh
 Dans le cas d’un système de fichier initramfs, la première
application à démarrer va être cherchée dans la racine du
système de fichier (/init)
 Si aucun fichier init n’est trouvé, le noyau
« panique » (Kernel panic) et le processus de démarrage
s’arrête
233
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Busybox

Système Linux de base


Introduction

 L’application init se charge de démarrer toutes les autres


applications utilisateur (entre autres le shell pour pouvoir
interagir avec le système)
 Pour avoir un système Linux de base, tous programmes de
base doivent être installés dans le système de fichier
 Pour un système embarqué, la réponse est simple : Busybox

234
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Busybox

Système Linux de base


Introduction

235
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Busybox

Système Linux de base


Introduction

236
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Busybox

Busybox
Introduction
 Les programmes de base d’un systèmes Linux de base :
▷ init
▷ une interface shell
▷ un certain nombre de programmes pour la manipulation des
fichiers
 Dans un système Linux, ces programmes sont fournis par
différents packages
 Dans un système embarqué, busybox est une alternative
fournissant tous les programmes dans un seul package
 Tous les programmes exécutables sont compilés dans un
seul exécutable nommé /bin/busybox
 La taille du programme compilé en statique avoisine 1Mo
(avec la library glibc)
 [Link]
237
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Busybox

Busybox
Configuration et installation

// Télécharger le busybox 1.23.2


[Link]

// Décompresser l’archive
tar xjfv [Link].bz2

// Configurer busybox
make gconfig

// Si il y a des dépendances manquantes, installer les

sudo yum install libglade2-devel

// Préciser le répertoire de l’installation:


/home/student/Desktop/rootfs

Install Options -> BusyBox installation prefix

// Préciser le compilateur croisé à utiliser

238
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Busybox

Busybox
Configuration et installation

BusyBox Settings -> Build Options -> Cross Compiler prefix

// à mettre

arm-unknown-linux-gnueabi-

// Rajouter le compilateur croisé dans le PATH

export PATH=/home/student/x-tools/arm-unknown-linux-gnueabi/bin:$PATH

// Compiler le busybox
make ARCH=arm CROSS_COMPILE=arm-unknown-linux-

// Installer le busybox dans le répertoire utilisé pour le système de


fichiers (rootfs)

239
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Busybox

Busybox
Configuration et installation

make install

// Vérifier s’il y a des changements dans le répertoire utilisé pour


rootfs
ls /home/student/Desktop/rootfs

240
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Busybox

Programmes de base
serveur et client ssh

 un serveur/client ssh est indispensable pour un échange de


données entre la machine de développement et la
plateforme embarquée
 Sur des systèmes Linux de type desktop, la solution la plus
souvent utilisée est OpenSSH
 Pour des systèmes embarqués, une alternative allégée est
dropbear
 [Link]

241
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Busybox

Linux embarqué
La suite

 Développement d’un système linux de base monté en NFS


 Le système de fichier peut facilement être copié sur un
support physique (flash, MMC ou autre)
 Pour ce faire, il suffit de créer une image dans un format
adapté au support physique
 Utilisation des commandes mkfs.ext2, mkfs.ext3, . . .pour
des systèmes de fichiers vierges
 Pour créer un système de fichier à partir d’un répertoire, il
faut utiliser la commande genexts2fs
genext2fs -d rootfs/ [Link]
 Pour des supports physiques de type Flash, MMC ou autre,
les commandes de génération d’une image sont légèrement
différentes
242
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Busybox

Linux embarqué
La suite

 De manière générale, le noyau est chargé dans un système


de fichier permettant une très bonne décompression à la
volée et une vitesse de lecture rapide (squashfs)
 Pour les données utilisateur, un système de fichier de type
journalier est utilisé (prévention de corruption de données
ext3, ext4, reiserfs, . . .)
 Pour les fichiers temporaires, un système de fichier en flux
est le plus adapté
 Il existe un certain nombre de solutions permettant de
générer une ou plusieurs composantes d’un linux embarqué
 Les solutions les plus utilisées sont : Buildroot,
OpenEmbedded/Yocto Project . . .

243
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Sommaire

6 Linux temps réel


Systèmes temps réel

243
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Linux temps réel


Introduction

 Un système Linux classique n’est pas temps réel


 Il est en temps partagé
 Une granularité bonne (de l’ordre de la milliseconde), mais
une précision incertaine
 Linux et logiciel open source sont de plus en plus utilisés
dans les applications embarquées
 Certaines applications nécessitent de respecter les
contraintes temps réel
 L’objectif est d’avoir les deux :
▷ tous les avantages de Linux : un large support matériel,
faible coût, . . .
▷ de respecter au mieux les contraintes temps réel

 Linux n’est pas temps réel par défaut


244
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Linux temps réel


Introduction

 Il existe deux approches principales pour rendre un système


Linux temps réel :
1 Modifier le noyau linux en lui rajoutant l’option temps réel
permettant d’avoir des latences limitées → projet
PREEMPT_RT
2 Rajouter une couche supplémentaire au noyau Linux
permettant de gérer toutes les contraintes temps réel →
RTLinux, RTAI, Xenomai
 Une autre solution est d’utiliser une couche matérielle
supplémentaire pour réaliser les tâches temps réel
▷ Un processeur supplémentaire dédié uniquement aux tâches
RT
▷ Utiliser un FPGA pour les tâches temps réel
▷ Utiliser un microcontrôleur dédié pour les tâches RT.

245
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Linux temps réel


Introduction

A titre d’exemple, le processeur TI AM335x utilisé dans la


BBB est équipe d’un PRU-ICSS dédié aux tâches temps réel

246
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Linux RT

 2 modèles de préemption
▷ CONFIG_PREEMPT_VOLUNTARY
→ Une rapidité de réponse améliorée
▷ CONFIG_PREEMPT
→ Toute section du code noyau peut être préemptée
→ A l’exception, les sections du code noyau délimitées par
spinlocks
 La résolution des timers utilisée peut également être
améliorée
▷ 100Hz ou 250Hz sont les valeurs habituelles
247
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Linux RT
▷ Cela donne une résolution de l’ordre de la ms
 Utilisation des timers de haute résolution
▷ Basé sur l’utilisation de timers matériels
▷ Un seul timer matériel peut être multiplexé pour gérer
plusieurs timers logiciels dérivés
▷ Facilité d’utilisation via les API fournis

 Un patch nommé CONFIG_PREEMPT_RT permet de rajouter


un nouveau niveau de préemptabilité
les spinlocks sont remplacés par les mutex
 Pour pouvoir utiliser le patch, il faut utiliser un noyau linux
ayant un numéro pair (3.0, 3.2, . . ., 3.14, . . .)
 L’utilisation du patch est simple
 Une fois le noyau adapté téléchargé et patché, avant de le
compiler il faut choisir l’option CONFIG_PREEMPT_RT
248
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Linux RT

 Compilation s’effectue de la même façon expliqué


précédemment

249
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Utilisation de Linux RT
 Pas de libraries spécifiques à utiliser
 L’API temps réel respectant le standard POSIX fait déjà
partie de la library standard C
 Utiliation des libraries glibc ou eglibc est recommandée
→ un certain nombre d’options temps réel n’est pas fourni
avec la library uClibc
 Pour compiler un programme
arm-unknown-linux-gnueabi-gcc -o prog prog.c -lrt
 Pour obtenir la documentation détaillée sur l’API POSIX
▷ il faut installer le package sudo yum install man-pages
▷ Pour trouvers des informations supplémentaires sur une
fonction donnée function_name
man function_name

250
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Process
Exemple

 création d’un processus avec fork()


 l’appel de la fonction fork() réussi → création de deux
espaces d’adressage identiques

251
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Process
Exemple

 Les deux processus exécutent la première instruction après


la fonction fork()
 Les variables initialisées et existantes dans les 2 espaces
d’adressage ont les mêmes valeurs avant l’appel de la
fonction fork()
 Après l’appel de la fonction fork(), les variables évoluent
de manière indépendante
 Le pid (process identifier ) du processus fils est égal à 0, le
pid du processus appelant la fonction fork() est different
de 0

252
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Process
Exemple

Source Dr. C.-K. Shene. CS4411 Introduction to Operating Systems. 2010

253
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Process
Exemple

Source Dr. C.-K. Shene. CS4411 Introduction to Operating Systems. 2010

254
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Process
Exemple

Source Dr. C.-K. Shene. CS4411 Introduction to Operating Systems. 2010

255
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Process
Exemple

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#define MAX_COUNT 100
#define BUF_SIZE 100

void main(void)
{
pid_t pid;
int i;
char buf[BUF_SIZE];
fork(); // création d’un processus fils
pid = getpid();
for (i = 1; i <= MAX_COUNT; i++) {
sprintf(buf, "Cette ligne est générée par le pid %d, et
valeur = %d\n", pid, i);
write(1, buf, strlen(buf));
}
}
256
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Process
Exemple

 Après la compilation et l’exécution du programme


présenté :
Cette ligne est générée par le pid 15456, et valeur = 1
Cette ligne est générée par le pid 15456, et valeur = 2
Cette ligne est générée par le pid 15456, et valeur = 3
Cette ligne est générée par le pid 15456, et valeur = 4
Cette ligne est générée par le pid 15456, et valeur = 5
Cette ligne est générée par le pid 15456, et valeur = 6
Cette ligne est générée par le pid 15456, et valeur = 7
Cette ligne est générée par le pid 15456, et valeur = 8
Cette ligne est générée par le pid 15456, et valeur = 9
Cette ligne est générée par le pid 15456, et valeur = 10
Cette ligne est générée par le pid 15456, et valeur = 11
Cette ligne est générée par le pid 15456, et valeur = 12
Cette ligne est générée par le pid 15456, et valeur = 13
Cette ligne est générée par le pid 15456, et valeur = 14
257
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Process
Exemple

Cette ligne est générée par le pid 15456, et valeur = 15


Cette ligne est générée par le pid 15456, et valeur = 16
Cette ligne est générée par le pid 15456, et valeur = 17
Cette ligne est générée par le pid 15456, et valeur = 18
Cette ligne est générée par le pid 15457, et valeur = 1
Cette ligne est générée par le pid 15456, et valeur = 19
Cette ligne est générée par le pid 15457, et valeur = 2
Cette ligne est générée par le pid 15456, et valeur = 20
Cette ligne est générée par le pid 15457, et valeur = 3
Cette ligne est générée par le pid 15456, et valeur = 21
Cette ligne est générée par le pid 15457, et valeur = 4
Cette ligne est générée par le pid 15456, et valeur = 22
Cette ligne est générée par le pid 15457, et valeur = 5
Cette ligne est générée par le pid 15456, et valeur = 23
Cette ligne est générée par le pid 15457, et valeur = 6
Cette ligne est générée par le pid 15456, et valeur = 24

258
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Process vs Thread
Définitions et différences

 Il y a souvent une confusion entre un process et un thread


 Dans un système Linux (Unix), un process est créé en
utilisant la fonction fork() et est composé de :
▷ un espace d’adressage contenant le code programme,
données, la pile (stack), les libraries partagées, . . .
▷ Lors de la création d’un process, un thread est également
créé
 Plusieurs threads peuvent être rajoutés à un process en
utilisant la fonction pthread_create()
▷ Les threads associés à un process ont le même espace
d’adressage que le thread initial créé avec le process
▷ Un thread, une fois élu par le CPU, exécute le process passé
en argument lors de sa création
 Un thread est exécuté par un CPU, pas un process
259
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Process vs Thread
Définitions et différences

→ Plus y a de threads associées à un process, plus le


processeur sera monopolisé par le process en question
→ Un thread = une tranche de temps sur le CPU ou un fil
d’exécution
 Chaque thread est caractérisé par :
▷ un état des registres
▷ un compteur ordinal (PC)
 Les variables globales sont partagées entre les threads
 Du point de vue d’ordonnancement, il n’y a pas de
différences entre le thread initial et tous ceux créés à la
volée à l’aide de la fonction pthread_create()

260
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Process vs Thread
Définitions et différences

261
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Thread
Création

Création d’un thread


pthread_create(pthread_t *thread, pthread_attr_t
*attr, void *(*routine)(void*), void *arg);

Fin d’un thread


 pthread_exit(void *value_ptr);
 pthread_cancel(pthread_t thread); - pour annuler un
thread

Attente de la fin d’un thread


 pthread_join(pthread_t *thread, void **value_ptr);

262
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Thread
Exemple

// Fonctions
void* func1( void *ptr )
{
printf("Hello world");
return NULL; }

void* func2( void *ptr )


{
printf("Hello M1 students");
return NULL; }

...

int main( void )


{
pthread_t thread1, thread2; //thread descriptor

// Création des threads


pthread_create( &thread1, NULL, func1, (void*) NULL );

263
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Thread
Exemple

pthread_create( &thread2, NULL, func2, (void*) NULL );

// Attente de la fin des 2 threads


pthread_join( thread1, NULL);
pthread_join( thread2, NULL);

return 0; }

264
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Thread
Exemple 1

 La fonction factorielle
void * factorielle(void * arg)
{
int i;
int n = (int) arg;
int resultat = 1;
for (i = 2; i <= n; i ++) {
resultat = resultat * i;
fprintf(stderr, "%d! : en calcul...\n", n);
sleep(1);
}
return (void *) resultat;
}

 Le programme principal avec 2 threads

265
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Thread
Exemple 1

int main(int argc, char * argv[])


{
pthread_t * threads = NULL;
void * retour;
int i;
int n;
threads = calloc(argc-1, sizeof(pthread_t));
fprintf(stderr, "main(): lancement des threads\n");
for (i = 1; i < argc; i ++) {
// Lancement du thread
if (pthread_create(& (threads[i-1]), NULL, factorielle, (void *)
n) != 0) {
fprintf(stderr, "Impossible de demarrer le thread %d\n", i);
exit(EXIT_FAILURE);
}
}
fprintf(stderr, "main(): tous threads lances\n");
for (i = 1; i < argc; i ++) {
// Attente du thread
266
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Thread
Exemple 1

pthread_join (threads[i-1], & retour);


fprintf (stderr, "main(): %s! = %d\n", argv[i], (int) retour);
}
fprintf(stderr, "main(): tous threads termines\n");
free(threads);
return EXIT_SUCCESS;
}

 Le programme complet sur ARCHE exemple-threads.c


 Le tracé d’exécution du programme avec les paramètres 3
et 5 :

267
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Thread
Exemple 1

main(): lancement des threads


3! : en calcul...
5! : en calcul...
main(): tous threads lances
5! : en calcul...
3! : en calcul...
5! : en calcul...
main(): 3! = 6
5! : en calcul...
main(): 5! = 120
main(): tous threads termines

268
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Affinité d’une tâche


 affinité d’une tâche concerne le processeur sur lequel la
tâche est en train d’être exécutée
 une fonction spécifique permettant de vérifier l’affinité
 int sched_getcpu(void)
 Un exemple d’utilisation :
int main(void)
{
int n;
int precedent = -1;
time_t heure;
struct tm * tm_heure;

while (1) {
n=sched_getcpu();
if (precedent == -1)
precedent = n;
if (n != precedent) {
269
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Affinité d’une tâche

heure = time(NULL);
tm_heure = localtime(& heure);
fprintf(stdout, "%02d:%02d:%02d migration %d -> %d\n",
tm_heure->tm_hour, tm_heure->tm_min, tm_heure->tm_sec,
precedent, n);
precedent = n;
}
}
return EXIT_SUCCESS;
}

 Le programme complet sur ARCHE


exemple-sched-getcpu.c
 Le tracé d’exécution du programme :

270
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Affinité d’une tâche

22:49:18 migration 3 -> 2


22:49:28 migration 2 -> 3
22:50:07 migration 3 -> 0
22:50:07 migration 0 -> 1
22:50:07 migration 1 -> 2

 on peut explicitement préciser le processeur sur lequel la


tâche sera exécutée
 taskset -c 1 ./task
 ou avec la fonction sched_setaffinity

271
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Tâches périodiques
Timer Unix classique - exemple

void handler_signal(int inutilise)


{
fprintf(stderr, "*");
}

int main(int argc, char * argv[])


{
struct itimerval timer;
// Installer le handler du signal SIGALRM
signal(SIGALRM, handler_signal);
// Preparer la structure itimerval
timer.it_interval.tv_sec = 1;
timer.it_interval.tv_usec = 0;
timer.it_value = timer.it_interval;
// Programmer le timer
setitimer(ITIMER_REAL, & timer, NULL);
while (1)
pause();
return EXIT_SUCCESS;

272
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Tâches périodiques
Timer Unix classique - exemple

 Le programme complet sur ARCHE exemple-setitimer.c


 Le tracé d’exécution du programme sera * affiché toutes les
secondes

273
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Tâches périodiques
Timers Posix - exemple

void handler_signal_1(int inutilise) { fprintf(stderr, "t1 "); }

void handler_signal_2(int inutilise) { fprintf(stderr, "t2 "); }

int main(int argc, char *argv[]) {


timer_t timer_1, timer_2;
struct sigevent event_1, event_2;
struct itimerspec spec_1, spec_2;

signal(SIGRTMIN + 2, handler_signal_2);

// Indiquer la notification desiree


event_1.sigev_notify = SIGEV_SIGNAL;
event_1.sigev_signo = SIGRTMIN + 1;

// Configurer la periode du timer


spec_1.it_interval.tv_sec = 2;
spec_1.it_interval.tv_nsec = 0;

274
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Tâches périodiques
Timers Posix - exemple

spec_1.it_value = spec_1.it_interval;

// Allouer le timer
if (timer_create(CLOCK_REALTIME, &event_1, &timer_1) != 0) {
perror("timer_create");
exit(EXIT_FAILURE);
}

// Memes operations pour le second timer


event_2.sigev_notify = SIGEV_SIGNAL;
event_2.sigev_signo = SIGRTMIN + 2;
/*spec_2.it_interval.tv_sec = 1;*/
spec_2.it_interval.tv_sec = 0;
/*spec_2.it_interval.tv_nsec = 0; // 0,25 sec.*/
spec_2.it_interval.tv_nsec = 125000000; // 0,25 sec.
spec_2.it_value = spec_2.it_interval;
if (timer_create(CLOCK_REALTIME, &event_2, &timer_2) != 0) {
perror("timer_create");
exit(EXIT_FAILURE);

275
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Tâches périodiques
Timers Posix - exemple

// Programmer les timers


if ((timer_settime(timer_1, 0, &spec_1, NULL) != 0) ||
(timer_settime(timer_2, 0, &spec_2, NULL) != 0)) {
perror("timer_settime");
exit(EXIT_FAILURE);
}
while (1)
pause();
return EXIT_SUCCESS;
}

 Le programme complet sur ARCHE


exemple-timer-create-01.c
 Le tracé d’exécution du programme sera
2 2 2 2 1 2 2 2 2 1 2 2 2 2 1 2 2 2 2 1 2 ...
276
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Tâches périodiques
Précision - exemple

static timer_t timer = (timer_t) 0;


static long int * mesure = NULL;
static int nb_mesures = 0;
static int nb_total_mesures = 0;

void handler_signal(int inutilise)


{
struct timespec heure;
static struct timespec precedente = { 0, 0} ;

clock_gettime (CLOCK_REALTIME, & heure);


if (precedente.tv_sec > 0) {
mesure[nb_mesures] = heure.tv_sec - precedente.tv_sec;
mesure[nb_mesures] *= 1000000000;
mesure[nb_mesures] += heure.tv_nsec - precedente.tv_nsec;
nb_mesures ++;
}
precedente = heure;
if (nb_mesures == nb_total_mesures)

277
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Tâches périodiques
Précision - exemple

timer_delete(timer);
}

int main(int argc, char * argv[])


{
long int periode;
struct sigevent event;
struct itimerspec spec;

if ((argc != 2) || (sscanf(argv[1], "%ld", & periode) != 1)){


fprintf(stderr, "usage: %s periode_en_microsec\n", argv[0]);
exit(EXIT_FAILURE);
}

// Allouer le tableau de mesures


nb_total_mesures = 5000000 / periode; // 5 secondes
if ((mesure = calloc(nb_total_mesures, sizeof(struct timespec))) ==
NULL) {

278
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Tâches périodiques
Précision - exemple

perror("calloc");
exit(EXIT_FAILURE);
}

// Configurer le timer
signal(SIGRTMIN, handler_signal);
event.sigev_notify = SIGEV_SIGNAL;
event.sigev_signo = SIGRTMIN;
periode = periode * 1000; // en nanosec
spec.it_interval.tv_sec = periode / 1000000000;
spec.it_interval.tv_nsec = periode % 1000000000;
spec.it_value = spec.it_interval;
// Allouer le timer
if (timer_create(CLOCK_REALTIME, & event, & timer) != 0) {
perror("timer_create");
exit(EXIT_FAILURE);
}
// Programmer le timer
if (timer_settime(timer, 0, &spec, NULL) != 0) {

279
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Tâches périodiques
Précision - exemple

perror("timer_settime");
exit(EXIT_FAILURE);
}
// Attendre le dernier signal
while (nb_mesures < nb_total_mesures)
pause();
// Afficher les mesures en micro-secondes
for (nb_mesures = 0; nb_mesures < nb_total_mesures; nb_mesures ++)
printf("%ld\n", mesure[nb_mesures]/1000);
return EXIT_SUCCESS;
}

 Le programme complet sur ARCHE


exemple-timer-create-02.c
 Tracé d’exécution du programme (compilé avel les options
-pthread et -lrt) :

280
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Tâches périodiques
Précision - exemple

992
989
998
1003
997
1007
999
1001
996
993
1008
996
998
1013
994
1013
996
1021
963
281
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Tâches périodiques
Précision - exemple

1009
998
1006
981
1005
1002
1006
993
1010
1030
955
993
1031
968
1027
972
1028
998
1004

282
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Tâches périodiques
Précision - exemple

968
1030
1002
982
993
1015
1014
963
1001
1027
975
1029
971
996
1013
985
997
1017
984

283
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Tâches périodiques
Précision - exemple

1000
1017
997
1010
985
989
1008
1037
958
1003
997
1000
997
1001
999
999
1007
994
999

284
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Tâches périodiques
Précision - exemple

997
1005
996
1003
999
997

...
 Les stats calculées :

Nb mesures = 5000
Minimum = 47
Maximum = 2754
Moyenne = 1000
Ecart-type = 53

285
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Tâches périodiques
Précision - exemple

 Si les mesures sont perturbées avec un programme en cours


d’exécution (perturbateur)

Nb mesures = 5000
Minimum = 2
Maximum = 5310
Moyenne = 1002
Ecart-type = 113

286
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Les classes d’ordonnancement


 Plusieurs classes d’ordonnancement disponibles
 La classe par défaut est la classe time-sharing
▷ Tous les process, peu importe leur priorité, seront desservis
à un moment donné par le CPU
▷ La proportion du temps CPU obtenu par un process peut
être modifiée dynamiquement en utilisant la commande
nice acceptant les valeurs de -20 (+ prioritaire) jusqu’à 19
(le moins prioritaire)
 Dans les classes d’ordonnancement SCHED_FIFO et
SCHED_RR
▷ Le process de plus haute priorité monopolise le CPU
jusqu’à sa terminaison
▷ Dans la classe SCHED_RR, les tâches de même priorité sont
desservies équitablement
▷ La priorité peut être fixée de 0 à 99

287
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Les classes d’ordonnancement

 Un programme peut démarrer avec une classe


d’ordonnancement choisie au démarrage avec la commande
chrt
Exemple : chrt -f 99 ./myprog
 La fonction sched_setscheduler() peut être utilisée pour
changer la classe d’ordonnancement utilisée d’un process

int sched_setscheduler(pid_t pid, int policy, const


struct sched_param *param);

 policy est la classe d’ordonnancement (SCHED_OTHER,


SCHED_FIFO, SCHED_RR,. . .
 param est la structure contenant la priorité

288
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Les classes d’ordonnancement

 la priorité peut également être fixée au moment de la


création d’un thread

struct sched_param parm;


pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setinheritsched(&attr,
PTHREAD_EXPLICIT_SCHED);
pthread_attr_setschedpolicy(&attr, SCHED_FIFO);
parm.sched_priority = 42;
pthread_attr_setschedparam(&attr, &parm);

289
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Les classes d’ordonnancement

 Au moment de la création du thread avec la fonction


pthread_create(), la structure attr sera passée en
argument

290
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Les classes d’ordonnancement


Exemple

int main(void)
{
printf("SCHED_FIFO : [%d - %d]\n",
sched_get_priority_min(SCHED_FIFO),
sched_get_priority_max(SCHED_FIFO));
printf("SCHED_RR : [%d - %d]\n",
sched_get_priority_min(SCHED_RR),
sched_get_priority_max(SCHED_RR));
printf("SCHED_OTHER : [%d - %d]\n",
sched_get_priority_min(SCHED_OTHER),
sched_get_priority_max(SCHED_OTHER));
return EXIT_SUCCESS;
}

 Le tracé d’exécution de ce programme :

291
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Les classes d’ordonnancement


Exemple

SCHED_FIFO : [1 - 99]
SCHED_RR : [1 - 99]
SCHED_OTHER : [0 - 0]

292
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Processus temps réel


Exemple

void fonction_fils (int cpu);

int main(void)
{
int nb_cpus = sysconf(_SC_NPROCESSORS_ONLN);
int cpu;

for (cpu = 0; cpu < nb_cpus; cpu ++) {


if (fork() == 0) {
fonction_fils(cpu);
}
}
/* Attendre la fin des fils */
for (cpu = 0; cpu < nb_cpus; cpu ++)
waitpid(-1, NULL, 0);
return EXIT_SUCCESS;
}

293
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Processus temps réel


Exemple

void fonction_fils (int cpu)


{
struct sched_param param;
cpu_set_t cpuset;

/* Se placer sur le CPU indique */


CPU_ZERO(& cpuset);
CPU_SET(cpu, &cpuset);
if (sched_setaffinity(0, sizeof(cpuset), & cpuset) !=0) {
perror("sched_setaffinity");
exit(EXIT_FAILURE);
}
/* Passer en temps-reel */
param.sched_priority = 99;
if (sched_setscheduler(0, SCHED_FIFO, & param) != 0) {
perror("sched_setscheduler");
exit(EXIT_FAILURE);
}
/* Dormir une seconde pour etre sur que tous les autres

294
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Linux embarqué
Systèmes temps réel

Processus temps réel


Exemple

processus sont sur leurs CPUs respectifs */


sleep(1);
/* Programmer une alarme dans 15 secondes */
alarm(15);
/* Boucler activement */
while (1)
;
}

295
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Références Références

Références

[1] AM335x Sitara Processors. 2014. url :


[Link]
[2] Marko Bertogna. The Mars Pathfinder. 2009.
[3] Christophe Blaess. Solutions temps réel sous Linux.
Eyrolles, 2012.
[4] Loïc Cuvillon. Systèmes temps réel et systèmes
embarqués. 2014.
[5] Free Electrons. Embedded Linux System Development.
2015.
[6] Pierre Ficheux et Eric Bénard. Linux embarqué, 4ème
édition. Eyrolles, 2010.

296
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Références Références

Références

[7] Chistopher Hallinan. Embedded Linux Primer - A


Practical Real World Approach, 2nd Edition. Prentice
Hall, 2010.
[8] http ://[Link]/.
[9] Patrick Kadionik. Les Systèmes Embarqués - Linux pour
l’embarqué. 2003. url :
[Link]
[10] OpenAI. chatGPT 4.0. 2024. url : [Link].
[11] Pierre Paradinas. Les systèmes temps réel. 2005.
[12] Christian Poellabauer. Real time systems. 2007.
[13] Jean-Christophe Ponsart. Les systèmes temps réel. 2014.

297
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26
Références Références

Références

[14] Dr. C.-K. Shene. CS4411 Introduction to Operating


Systems. 2010.
[15] Alex C. Snoeren. Semaphores and Monitors. 2005.
[16] Xilinx Zynq-7000 All Programmable SoC. 2014. url :
[Link]
devices/soc/[Link].

298
Slaviša Jovanović & Hassan Rabah • M2 - EEA • Systèmes embarqués temps réel • 2025/26

Vous aimerez peut-être aussi