ITR : Sujets de travaux pratiques, édition spéciale Covid

Cette page présente les sujets de travaux pratiques à réaliser dans le cadre de l’option Informatique Temps-Réel, en contexte Covid, donc en travaillant à distance. Ces TPs utiliseront le système d’exploitation Trampoline, mais pas les robots Légo, qui demandent un accès aux locaux de l’ISTIC. Nous basculerons sur les sujets de TP normaux (https://team.inria.fr/pacap/teaching-material/real-time-systems-labs/str-sujets-de-travaux-pratiques/) quand les circonstances sanitaires le permettront.

Les TPs “édition Covid” utilisent la cible Linux de Trampoline. Les sujets de TP (3 séance de découverte d’OSEK/VDX) sont précédés d’une documentation d’installation de la cible Posix de Trampoline.

Le texte des sujets de TP est volontairement très bref. On se référera à la documentation pour l’API OSEK/VDX, au format des fichiers OIL ainsi qu’à l’API Ecrobot.

Installation de la cible Posix de Trampoline et exécution d’un premier programme

Les sources de Trampoline, ainsi qu’une version précompilée de goil (outil de transformation de fichier OIL en code C) sont disponibles sur Teams. Pour utiliser Trampoline voir aussi le fichier README.md à la racine des sources, il faut tout d’abord compiler viper (logiciel d’émulation de ticks d’horloge sur Posix)  :

cd viper
make

Pour utiliser viper et goil, il faudra ensuite modifier votre .bashrc:

export VIPER_PATH=PATH_TO_TRAMPOLINE/viper
export PATH=PATH_TO_TRAMPOLINE/goil-linux-64:$PATH

A partir de ce moment, vous pouvez exécuter votre tout premier programme comme PATH_TO_TRAMPOLINE/examples/posix/periodic

cd examples/posix/periodic
goil --target=posix/linux  --templates=../../../goil/templates/ periodic.oil

Le premier appel à goil créera un makefile. Le makefile appelera goil par la suite automatiquement dès que le fichier OIL sera modifié.

Pour compiler :

./make.py -s

Pour exécuter :

./periodic_exe

Pour créer un nouveau projet, vous pouvez dupliquer un des fichiers d’exemples de examples/posix.

Découverte — 3 séances

L’objectif de ce premier TP est de prendre en main le système d’exploitation OSEK/VDX. Plus particulièrement, il vise à vous familiariser avec l’édition simultanée de la description du système, dans le fichier OIL, et son implémentation dans le fichier source correspondant. À cette fin, vous allez manipuler les fonctions de gestion de tâches d’OSEK/VDX (affichage, gestion de priorité, évènement …) et les hooks OSEK/VDX.

Dans la cible Posix de Trampoline, contrairement à la cible Nxt, il n’y a pas de bibliothèque particulière à utiliser pour effectuer des affichages, vous avez donc à votre disposition les fonctions habituelles de la bibliothèque C standard, telles que printf.

Hello World !

Dans un premier temps, toutes les tâches ont la même priorité, et sont sporadiques.

Q1: En utilisant PreTaskHook, PostTaskHook, et GetTaskID, lancer au démarrage du système une tâche task0 qui affiche son identifiant unique et indique sur l’écran du Nxt qu’elle s’exécute. Exemple d’affichage:

Task0 : PreTaskHook
Task0 : Hello World !
Task0 : PostTaskHook

NB : Certains évènements PreTaskHook et PostTaskHook sont déclenchés par la tâche idle du système, dans ces cas, GetTaskID fournit la valeur -1.

Q2: Ajouter une tâche task1 activée par task0 (ActivateTask), qui en plus de ses informations de lancement affichera l’heure du système. Ex:

Task0 : PreTaskHook
Task0 : Hello World!
Task0 : PostTaskHook
Task1 : PreTaskHook
Task1 : 42 ms
Task1 : PostTaskHook

Q3: Ajouter une tâche task2, activée au démarrage, qui affichera un message avant d’enchaîner sur la tâche task3 (ChainTask), qui, elle, viendra en complément afficher l’heure.

Que constatez-vous/déduisez-vous sur l’ordre de lancement des tâches en fonction de la manière dont elles sont activées? Si vous rajoutez un petit temps d’attente dans la task0 et/ou task1, ou encore dans le couple 2/3, l’ordre reste t-il le même ? Quid des hooks ?

Q4: Ajouter une dernière tâche task4 qui attendra un évènement, lequel sera lancé après appuie sur la touche “a” de votre clavier. Pour un exemple de programme attendant  un appuie sur les touches “a” et “b” pour exécuter un bout de code, vous pouvez vous référer à l’exemple isr présent dans “examples/posix/isr”.

Q5: Vous pouvez jouer avec les priorités et les périodicités afin d’en apprendre un peu plus sur leur fonctionnement et leurs effets.

Aller, on joue!

Vous réaliserez 2 versions distinctes de cet exercice, l’une avec des alarmes absolues (dans le fichier oil), l’autre avec des alarmes relatives (dans le source).

Ce deuxième TP a pour objectif de vous faire découvrir l’ordonnancement de tâches, la notion de ressources OSEK et quelques uns des problèmes liés comme l’inversion de priorité.

Dans un premier temps, toutes les tâches ont la même priorité, l’ordonnancement est préemptif.

Construire une application composée des trois tâches suivantes et d’une variable partagée distance. La variable liée à distance indiquera la distance du pare-chocs du robot aux obstacles l’entourant.

  • Détection_contact : tâche périodique de période 100 ms mettant distance à 0 quand le pare-chocs est en contact avec un obstacle
  • Détection_distance : tâche périodique de période 300 ms mettant distance à jour à partir du résultat du capteur ultrason
  • Navigation : tâche périodique de période 200 ms qui selon la valeur de distance entreprend les actions suivantes :
    • Distance = 0 : marche arrière du robot
    • Distance < 50 : faire tourner le robot (pour éviter l’obstacle)
    • Par défaut : toutes les 10 périodes, changement du cap du robot (virage à droite ou à gauche d’un angle aléatoire avant de continuer tout droit)

Vous afficherez sur la 1ère ligne de l’afficheur, le temps système et la valeur de la distance. Puis sur les lignes suivantes, le défilement des lancements/arrêts des tâches.

Que se passe-t-il si les pare-chocs détectent un obstacle à ras de terre mais que le capteur ultrason est interrogé avant que la tâche de navigation ne s’exécute ? Proposer une modification du système pour pallier à ce problème.

NB : On n’oublie pas la règle d’or des applications multi-tâches : Tout accès à une variable partagée doit être protégé en lecture et en écriture par une section critique. Pour cela vous pourrez utiliser une ressource particulière qui bloque temporairement le mode préemptif de l’ordonnanceur.

Et la théorie dans tout ça ?

Dans l’exercice précédent, nous avons utilisé les mêmes priorités pour chaque tâche. Question de rhétorique, mais pensez-vous que ce fût un choix judicieux ? Dans ce 3ème exercice vous avez en charge de construire un petit visualisateur d’ordonnancement. Celui-ci permettra de générer un fichier SVG qui présentera l’ordonnancement de l’exercice précédent. Au choix, il devra pouvoir générer des ordonnancements suivant les politiques RM ou EDF vues en cours, en version préemptive et non-préemptive.

Pour ce faire, vous aurez besoin de plusieurs informations initiales dont le WCET de chaque tâche, leur priorité et l’hyperpériode. Hormis le WCET, vous êtes en mesure de déterminer/calculer ces informations. Attention aux éventuelles inversions de priorités qui devront être gérées avec le système PCP (aussi vu en cours).

Pour le WCET, nous vous proposons d’utiliser l’outils développé dans notre équipe depuis maintenant des décennies, le bien nommé : Heptane. Pour cela vous devez créer 2 fichiers de configuration et un fichier d’annotation (cf la documentation d’Heptane). L’estimation du WCET est une approximation du pire cas réel, pour simplifier notre analyse tout en restant sûr, nous ne prendrons pas en compte les détails de la mirco-architecture de la brique ; i.e. pas de cache, pas de pipeline.
“-O0” et voir même virer, le “-Winline=1000”
Quelle configuration pour les caches/memory? -> NOPIPELINE_NOCACHE
Heptane* et cplex dans le PATH
–>

cd DOSSIER_PROJET
cp /share/m1info/ITR/heptane/configExtract.xml .
cp /share/m1info/ITR/heptane/configAnalysis.xml .
HeptaneExtract configExtract_ARM.xml
HeptaneAnalysis configAnalysis_ARM.xml

Que constatez-vous lors de l’utilisation d’Heptane ?

NB: On réduira artificiellement les périodes si l’on ne voit rien sur l’ordonnancement.

/!\ Accès à Heptane sur les machines ISTIC cette année

Il faut rajouter à votre ~/.bashrc les lignes suivantes:

ITR=/import/share/2019-2020/m1info/ITR
HEPTANE=${ITR}/heptane/bin
CPLEX=${ITR}/cplex/cplex/bin/x86-64_linux
export PATH=$PATH:$HEPTANE:$CPLEX

et n’oublier pas de faire le rajouter aussi:

source /share/l3seta/ITR/osek_env/env_setup

si ce n’est déjà fait puis de relancer votre shell