Systèmes temps-réel et systèmes embarqués

Aller à : navigation, rechercher

Contenu de la formation : 8 séances de cours de 1h15 + 3 séances de 4 heures de TP
Intervenants : Loïc Cuvillon et Jacques Gangloff

Cours

Polycopiés 2012/2013

Exemples

Architecture des systèmes d'exploitation

Commande pour compiler les exemples : gcc test.c -lpthread -o test

L'archive regroupant tous les tests (mise à jour novembre 2015) est disponible ici.

./test
I'm the parent.
i=10
I'm the child.
i=20
On note la séparation des espaces mémoire des 2 processus contrairement aux threads.
./test 
Dad : damned who stole my beer !
Dad : damned who stole my beer !
Son : damned who stole my coke !
Dad : damned who stole my beer !
[CTRL-C]
Si entre l'affectation (refrigerator = COKE; par exemple) et le test
(if ( refrigerator == COKE ) { par exemple), l'autre thread change le 
contenu du réfrigérateur, il y a conflit. On est dans le cas typique de l'accès 
concurrent à une ressource commune : le frigidaire.
./test
[CTRL-C]
Le mécanisme d'exclusion mutuelle de Peterson est utilisé pour réaliser une 
section critique comprise entre l'affectation et le test.
./test
syscall(SYS_getpid)=2058
getpid()=2058

La commande getpid est équivalente à l'appel système SYS_getpid.
./test
Period = 10163 us
Period = 10269 us
Period = 21635 us
Period = 8276 us
Period = 23642 us
Period = 6262 us
Period = 21404 us
...
Period = 20196 us
Period = 19801 us
Period = 20653 us
Period = 9343 us
Period = 10708 us
Period = 9290 us
Period = 10008 us
Period = 9991 us
Period = 11970 us
Period = 8053 us
Period = 9978 us
Max latency : 19843 Max advance : 9726
Cet exemple démontre l'imprécision d'une tâche périodique sur un système 
temps-réel mou (linux).
./test 
Thread_HP : running at FIFO/2
Thread_HP : non critical.
Thread_LP : running at FIFO/1
Thread_LP : non critical.
Thread_LP : critical.
Thread_HP : mutex timeout.
La thread HP (Haute Priorité) bloque indéfiniment sur un mutex car une thread  
de basse priorité est dans la section critique et consomme du temps CPU.
Thread 0xb464eba0 : i = 0 write current_time = 1199815415
Thread 0xb6652ba0 : i = 0 read current_time = 1199815415
Thread 0xb6652ba0 : i = 1 read current_time = 1199815415
Thread 0xb6e53ba0 : i = 0 read current_time = 1199815415
Thread 0xb6e53ba0 : i = 1 read current_time = 1199815415
Thread 0xb6652ba0 : i = 2 read current_time = 1199815415
Thread 0xb6e53ba0 : i = 2 read current_time = 1199815415
Thread 0xb7e55ba0 : i = 0 read current_time = 1199815415
Thread 0xb5e51ba0 : i = 0 write current_time = 1199815415
Thread 0xb5650ba0 : i = 0 write current_time = 1199815416
Thread 0xb4e4fba0 : i = 0 write current_time = 1199815416
Thread 0xb7654ba0 : i = 0 read current_time = 1199815416
Thread 0xb6652ba0 : i = 3 read current_time = 1199815416
Thread 0xb6652ba0 : i = 4 read current_time = 1199815416
Thread 0xb7654ba0 : i = 1 read current_time = 1199815416
Thread 0xb7654ba0 : i = 2 read current_time = 1199815416
Thread 0xb6e53ba0 : i = 3 read current_time = 1199815416
Thread 0xb6e53ba0 : i = 4 read current_time = 1199815416
Thread 0xb6652ba0 : i = 5 read current_time = 1199815416
Thread 0xb6652ba0 : i = 6 read current_time = 1199815416
Thread 0xb7654ba0 : i = 3 read current_time = 1199815416
Thread 0xb7654ba0 : i = 4 read current_time = 1199815416
Thread 0xb6e53ba0 : i = 5 read current_time = 1199815416
Thread 0xb7654ba0 : i = 5 read current_time = 1199815416
Thread 0xb6652ba0 : i = 7 read current_time = 1199815416
Thread 0xb5e51ba0 : i = 1 write current_time = 1199815416
Thread 0xb5650ba0 : i = 1 write current_time = 1199815416
Problème du "reader-writer" simulant l'accès en lecture et écriture à une base 
de données. L'accès en lecture peut se faire avec plusieurs thread 
simultanément mais l'accès en écriture doit être unique. Le mécanisme 
implémenté évite à la thread qui écrit d'attendre indéfiniment que les thread 
qui lisent aient terminé.
Avec des priorités identiques :
./test 
Thread_HP : running at RR/1
Thread_LP : running at RR/1
HP: hp_count: 100000000 lp_count: 94578307 ratio : 1.057325e+00
LP: hp_count: 100000000 lp_count: 100000000 ratio : 1.000000e+00
Avec des priorités différentes :
./test 
Thread_HP : running at RR/2
Thread_LP : running at RR/1
HP: hp_count: 100000000 lp_count: 0 ratio : inf
Cet exemple montre les effets des politiques de séquencement dans le cas de 2 
threads dont les priorités sont variables et avec des stratégies de 
séquencement variables : SCHED_RR (round-robin) ou SCHED_FIFO (FIFO).


Programmation Xenomai: Linux temps réel

TPs

TPs temps réel

Annales

Lien page Annales

Documents

Ancienne version