Cliquer ici pour imprimer

Xenomai : Prise en main

Vous allez utiliser le système d'exploitation Xenomai 3 installé en mode co-noyau afin de programmer un système de tâches temps réel périodiques que vous aurez tout d'abord analysé d'un point de vue théorique. Vous allez comparer les traces d'exécution de ce système à la théorie.

À l'issue des séances de TP, vous devrez rendre un rapport expliquant à quoi sert Xenomai et a quoi il ne sert pas, comment on l'utilise, les points positifs et les points négatifs. Les exercices à réaliser en TP sont la pour vous aider et vous guider dans votre découverte mais ne constituent pas un plan ou un fils conducteur du rapport demandé.

Sous linux standard ?

Comment fait-on pour programmer et lancer un système de tâches périodiques (voir le model de tâche dans le cours de temps-réel) en C ? Que peut-on faire, que ne peut-on pas faire ?

Qu'est-ce que Xenomai ?

Vous allez commencer par lire la documentation sur cette page (lire entre autre les deux premières sections : "what is Xenomai about" ? et "How does Xenomai deliver real-time ?". N'hésitez pas à chercher d'autres sources de documentation (google, wikipédia etc.)

Demandez vous notamment

  • pourquoi Linux ne peut pas être utiliser pour programmer des applications avec des contraintes temps-réel fortes ?
  • qu'apporte le patch "Preempt-RT" pour résoudre ce problème ?
  • quelles sont ses limites ?
  • quelle est l'autre approche proposé par Xenomai (et par d'autre RTOS comme RTAI par exemple) ?

La documentation pour la suite se trouve à l'adresse https://xenomai.org/documentation/xenomai-3/html/xeno3prm/group__alchemy.html.

Lancer une tâche avec Xenomai

Si ce n’est pas déjà fait, bootez votre machine sur le noyau Xenomai. Téléchargez cette archive et décompressez la à l’endroit de votre choix. Étudiez le fichier hello.c, compilez avec la commande make, testez. En cas de soucis, vérifiez que le répertoire /usr/xenomai/lib se trouve bien dans les répertoires de recherche des librairies dynmique (variable LD_LIBRARY_PATH). De plus, vous devez avoir les privilèges super-utilisateur pour lancer l’application.

Adaptez le code pour lancer plusieurs tâches à des priorités différentes. Testez le comportement.

Comment séparer la création de la tâche et son démarrage ? par quelles fonctions faut il remplacer rt_task_spawn ?

Mode primaire / Mode secondaire

Téléchargez, étudiez et tester les deux programmes suivants :

Regardez le fichier /proc/xenomai/sched/threads

  • Que contient il ?
  • Quelle est la priorité des taches créées par les deux programmes précédents ?

Regardez le fichier /proc/xenomai/sched/stat

  • Que contient il ?
  • Que représentent les variables CSW et MSW ? Quelle différence entre les deux programmes exemple hello ?

Lancer une tâche périodique

Téléchargez, étudiez et tester les deux programmes suivants :

  • Téléchargez, étudiez et tester le programme exemple periodique 1. Ce programme lance une tâche de période 1 seconde qui affiche le temps courant. Lancez le programme et analyser si la durée entre deux periodes est bien constante (il ne doit pas y avoir de dépassement significatif)
  • Téléchargez, étudiez et tester le programme exemple periodique 2. Dans ce programme, on execute une tache périodique de période 0,5 secondes mais avec une durée supérieure à 0,8 secondes. Interprétez les résultats.
  • Téléchargez, étudiez et tester le programme exemple periodique 3. Dans ce programme, on execute une tache périodique de période 0,5 secondes mais avec une durée supérieure à 1 secondes. Interprétez les résultats. Le comportement vous semble-t-il conforme à la documentation ?

Quelques Statistiques et outils

  • Téléchargez le fichier calc-stat.c. Compilez le avec la commande gcc -o calc-stat calc-stat.c -lm Le programme obtenu permet de calculer le minimum, la moyenne et l’écart type d’une grandeur se trouvant dans un fichier.
  • Téléchargez, étudiez et tester le programme exemple periodique 4.
  • Lancez le avec la commande exemple-periodique-04 1000 1000 correspond à une tâche de période 1ms. Vérifiez qu’il affiche bien la durée écoulée entre les activations successives de la tâche (en nano secondes). Sauvegardez les résultats obtenus dans un fichier (fic-res) pendant une minute, en le lancant avec la commande exemple-periodique-04 1000 > fic-res
  • À l'aide de calc-stat, analysez les résultats pour un système non chargé : calc-stat < fic-res
  • On souhaite maintenant evaluer l’influence de la charge sur les performances du programme exemple-periodique-04. Pour cela, compilez le programme hackbench (procédure de compilation détaillée dans le fichier), puis comparez les résultats obtenus par la commande ping 127.0.0.1 (temps de réponse : time) avant et pendant l’execution de la commande : /usr/xenomai/bin/dohell -b ./hackbench -s 127.0.0.1 -m /mnt/ 10
  • Refaites le protocole des questions 3 et 4 avec dohell qui tourne en parallèle. Concluez.

Mise en oeuvre

Soit les deux systèmes de tâches suivants :

Ci Ti Di
τ1 1 4 4
τ2 2 6 6
τ3 3 8 8

et

Ci Ti Di
τ1 2 7 7
τ2 2 11 11
τ3 5 13 13
  • sont-ils ordonnançables ? avec quel(s) algorithme(s) ?
  • tracez les chronogrammes théoriques avec les algorithmes à priorités fixes que vous jugerez adéquats
  • programmez ces systèmes et relevez les traces d’éxécutions
  • comparez