Enfin, début janvier, il vous sera demandé de présenter votre travail lors d'une
démonstration complétée par des questions.
L'objectif de cet exercice est de réviser les concepts clefs vus dans le cours AADL et ordonnancement.
On vous demande de faire un modèle d'un système de contrôle-commande, d'analyser ses performances/son comportement
et de
répondre à quelques questions de compréhension.
Un système de contrôle-commande est un logiciel qui observe et agit sur un système qui peut être un moteur,
un système de climatisation, ...
Un système de contrôle-commande lit des données à partir d'un ensemble de capteurs, analyse ces données, puis émet
des commandes vers des actionneurs.
Dans cet exercice, on vous demande de produire différentes solutions architecturales possibles avec AADL
à partir d'une spécification.
Vous pouvez travailler en binome. Pour le lundi 7 janvier, vous devez livrer :
- L'ensemble des modèles AADL élaborés pour chaque question ; modèles que l'on doit pouvoir analyser avec AADLInspector.
- Un rapport qui contient les réponses aux questions ci-dessous.
Spécification du système à étudier
On regarde ici le fonctionnement d'une chaudière (cf. figure ci-dessus).
La chaudière est controlée par un logiciel de contrôle-commande composé de 5 traitements périodiques
donc les caractéristiques sont les suivantes :
Traitement | Périodes/Echéances |
Pire temps d'exécution (ou capacité) | |
AFFICHAGE | 50 ms | 10 ms |
ANALYSE | 60 ms | 10 ms |
LIRE_CAPTEUR | 50 ms | 7 ms |
ACTIVER_ARRET | 200 ms | 2 ms |
TRANSMETTRE_THERMOSTAT | 200 ms | 2 ms |
La logiciel dialogue avec 4 périphériques:
- La chaudière comporte une sonde thermique dont l'objet est de capturer la température de la chaudière.
La température mesurée par cette sonde thermique est lue périodiquement par le traitement LIRE_CAPTEUR.
- La chaudière comporte un mécanisme d'arrêt d'urgence, utilisable par exemple, quand la température
de la chaudière dépasse un seuil donné. Ce mécanisme est implanté par un actionneur qui coupe l'alimentation
électrique de la chaudière.
Le traitement ACTIVER_ARRET envoie la commande d'arrêt de la chaudière lorsque
la situation le demande.
- La chaudière est également connectée à un thermostat dont l'objet est de régler la
température à atteindre dans le local à chauffer.
Le traitement TRANSMETTRE_THERMOSTAT a pour rôle l'envoie de la température de la chaudière au thermostat.
- Enfin un écran d'affichage permet de transmettre à l'utilisateur la température actuelle de la
chaudière. Cet écran est piloté par le traitement AFFICHAGE.
En dehors des traitements décrits ci-dessus, le logiciel de contrôle-commande
comporte le traitement périodique ANALYSE.
ANALYSE recoit de LIRE_CAPTEUR la température mesurée dans la chaudière, vérifie cette donnée
puis transmet la température vérifiée aux tâches AFFICHAGE, TRANSMETTRE_THERMOSTAT et ACTIVER_ARRET.
A partir de cette spécification, on cherche un modèle d'architecture qui, par exemple :
- Permet de respecter les échéances des tâches.
- Permet de minimiser certaines latences, comme celle entre le moment où une température est lue par LIRE_CAPTEUR
et le moment où le thread ACTIVER_ARRET émet la commande vers le dispositif d'arrêt d'urgence.
- Permet de minimiser, voire de supprimer le risque de perte de données.
- Permet de maximiser l'efficacité concernant l'utilisation des ressources: comme par exemple réduire
le nombre de préemption, de commutation de contexte, de messages lus plusieurs.
- Etc
Il est fortement conseillé de lire l'intégralité des questions avant de commencer à répondre.
Attention : une spécification peut conduire à plusieurs solutions architecturales, et donc certaines
des questions ci-dessous peuvent être traitées plus ou moins rapidement/facilement.
Question 1 :
On suppose dans cette question que chaque traitement est modélisé par un thread AADL et que les échanges de données
entre threads sont assurés par des données partagées.
Durant ce travail de conception d'architecture, on décide arbitrairement de fixer les priorités des threads comme suit :
- La priorité d'AFFICHAGE est 1.
- La priorité d'ANALYSE est 4.
- La priorité de LIRE_CAPTEUR est 3.
- La priorité d'ACTIVER_ARRET est 5.
- La priorité de TRANSMETTRE_THERMOSTAT est 2.
- Proposer un modèle AADL où chaque traitement est modélisé par un thread et les échanges
de données
entre threads sont assurés par un ou plusieurs composants data.
Cet ensemble de thread doit être ordonnancé selon un algorithme à priorité fixe préemptif.
- Expliquer:
- Que représente le composant AADL processor et la propriété actual_ processor_binding d'un modèle AADL ?
- En général, que peut on modéliser par un composant data ?
- Pourquoi peut il être intéressant de déclarer un composant data dans un paquetage séparé ?
- Analyser le comportement de votre modèle. Par exemple: Quels sont les pires temps de réponse des threads ?
Dans le pire cas, quelle est la latence maximale entre le moment où une température est lue par LIRE_CAPTEUR
et le moment où le thread ACTIVER_ARRET émet la commande vers le dispositif d'arrêt d'urgence? Peut on perdre
des mesures ?
Question 2
Plutôt que d'employer des composants data partagés, il est possible de modéliser les échanges entre les
traitements par des data port. On suppose les mêmes priorités concernant les threads.
- Modifier votre modèle en employant des data port.
- Expliquer:
- Quelles sont les différences entre une connexion data port immediate et une connexion sampling ?
- Nous pourrions modéliser la sonde thermique et le thermostat avec des composants AADL devices
(cette modification du modèle n'est pas demandée).
En général, que représente un composant AADL device ?
- Analyser le comportement de ce nouveau modèle, d'abord quand les connextions
sont de type sampling, puis de type delayed. Que constatez vous ? Par exemple: Quels sont les pires temps de réponse des threads ?
Dans le pire cas, quelle est la latence maximale entre le moment où une température est lue par LIRE_CAPTEUR
et le moment où le thread ACTIVER_ARRET émet la commande vers le dispositif d'arrêt d'urgence?
Peut on perdre
des mesures ?
Si les résultats d'analyse sont différents de ceux de la question 1, expliquer alors ces différences.
Question 3
-
Dans les question 1 et 2, nous avons donc élaboré deux solutions architecturales différentes à partir d'une
spécification. D'après vous, quelle est celle qui vous semble la plus appropriée, du point de
vue des latences et des pires temps de réponse, mais également vis à vis de tout autre point de vue qui vous semble
important de prendre en compte.
-
Avez vous des suggestions pour améliorer ces modèles architecturaux ? On ne vous demande pas ici le modèle AADL
amélioré mais seulement d'indiquer si des pistes d'amélioration vous semble possibles.
Question 4
ANALYSE peut faire l'objet de panne. Une solution classique pour tolérer les pannes d'un composant
consiste à executer plusieurs exemplaires de ce composant. Les données produites par l'ensemble des exemplaires
sont comparés afin de détecter si l'un d'entre eux fonctionne anormalement. On parle de VOTEUR
pour désigner le composant qui compare les données produites par l'ensemble des exemplaires.
Avec cette méthode, 3 instances d'ANALYSE permettent de corriger au plus une panne.
En effet, si deux instances d'ANALYSE calculent
une valeur identique et si le résultat produit par la 3ème est différent, on considére que
la 3ème instance est en panne.
Ce mécanisme est appelé la redondance active.
- On souhaite appliquer un mécanisme de redondance active sur le traitement ANALYSE.
Modifier votre modèle AADL de la question 1 de sorte que :
- Plusieurs instances d'ANALYSE recoivent la température mesurée et calculent donc autant de températures vérifiées.
- Un nouveau traitement nommé VOTEUR recoit les températures vérifiées par les instances d'ANALYSE
afin de détecter la présence d'une panne,
pour finalement transmettre la donnée aux traitements ACTIVER_ARRET, AFFICHAGE et TRANSMETTRE_THERMOSTAT.
Le traitement VOTEUR possède la même période qu'ANALYSE et une capacité de 1 ms.
- Comme dans les questions précédentes, analyser le comportement de ce modèle.
Quels sont les pires temps de réponse des threads ?
Dans le pire cas, quelle est la latence maximale entre le moment où une température est lue par LIRE_CAPTEUR
et le moment où le thread ACTIVER_ARRET émet la commande vers le dispositif d'arrêt d'urgence ?
-
Plus le nombre d'instance d'ANALYSE est grand, plus le système pourra tolérer de fautes d'ANALYSE.
Combien de fois au maximum
peut on instancier le composant ANALYSE sans manquer d'échéance ?
Combien de pannes d'ANALYSE cela peut il permettre de tolérer ?
Vous trouverez ci-dessous différentes approches pour la conception
et la vérification (généralement de l'ordonnancement) d'une architecture
temps réel critique :
- Autosar/EAST-ADL.
- MARTE/UML et Mast.
- TASTE.
- Symta/S.
- Times.
- Polychrony.
- SCADE.
- UPPAAL.
- HRT HOOD.
- Giotto.
Il vous est demandé :
- De vous organiser en groupe de 3 étudiants.
- Chaque groupe doit :
- Choisir une de ces approches sachant que chaque approche sera traitée
par un groupe et un seul.
- Lire le document choisi. Il est, par ailleurs, facile
de compléter cette lecture par d'autres documents disponibles sur Internet.
Pour trouver d'autres articles sur chacune de ces approches, vous pouvez utiliser
scholar.google.fr par exemple qui est un moteur de recherche pour les publications
scientifiques.
- Pour début janvier, il vous est demandé de livrer un rapport de 4 pages maximum
décrivant l'approche choisie en répondant aux questions suivantes :
- Quels sont les systèmes ciblés ?
- Comment les systèmes à vérifier sont il décrits/spécifiés ?
En particulier comment sont modélisées les données temps réel de ces systèmes ?
- Si une vérification d'ordonnancement est possible, comment est elle conduite ?
Quelles sont les techniques de vérification et les modèles formels utilisés ? Les outils ?
- Peut on réaliser une génération de code et pour quelles cibles ?
- Enfin, courant janvier, il vous sera demandé de présenter votre travail d'analyse lors d'une
soutenance de 10 minutes de présentation, complétée par des questions.
On souhaite modéliser et vérifier l'ordonnancement d'un logiciel embarqué dans un commutateur réseau.
Le commutateur est constitué:
- D'un ensemble de ports d'entrée et de sortie.
- Chaque port d'entrée et chaque port de sortie mémorise un message.
- Chaque port d'entrée et associé à un port de sortie où ses messages sont envoyés.
- Pour chaque port d'entrée, une tâche copie le message du port d'entrée vers le port de sortie associé toutes les 50 ms.
- Nous supposons dans un premier temps que le commutateur ne comporte que 4 ports d'entrée et de sortie, soit 4 tâches nommées PORT_1, PORT_2, PORT_3 et PORT_4 ci-dessous.
- Une tâche, dont le nom est STAT, collecte toutes les 21 ms des statistiques sur l'utilisation des ports d'entrée et de sortie.
- Enfin, une tâche de supervision, dont le nom est SUPER, permet aux utilisateurs de configurer l'équipement.
Les paramètres des tâches sont donnés ci-dessous:
Threads | Priorités | Temps d'exécution | Périodes/Echéances |
SUPER | 1 | Entre 2 et 3 ms | 7 ms |
STAT | 2 | 7 ms dans certains cas, 6 ms sinon | 21 ms |
PORT_1 | 3 | Jamais plus de 4 ms | 50 ms |
PORT_2 | 4 | Jamais plus de 4 ms | 50 ms |
PORT_3 | 5 | Jamais plus de 4 ms | 50 ms |
PORT_4 | 6 | Jamais plus de 4 ms | 50 ms |
Les tâches sont périodiques et indépendantes. Elles démarrent toutes à l'instant zéro.
Pour toutes les tâches, les échéances sont égales aux périodes.
Enfin, chaque tâche a une priorité fixe. Nous appliquons un ordonnancement
préemptif à priorité fixe. Les niveaux de priorités vont de 0 à 255 sachant
que le niveau de priorité le plus fort est 0. On applique ici Rate Monotonic.
Question 1 :
Votre responsable vous propose dans un premier temps de déployer cet ensemble
de tâches sur une machine disposant d'un processeur.
Compléter le modèle AADL ci-dessous afin de pouvoir simuler l'ordonnancement de
ce système avec un logiciel comme AADLInspector.
package commutateurs
public
thread tache_periodique
properties
Dispatch_Protocol => Periodic;
end tache_periodique;
thread implementation tache_periodique.Impl
end tache_periodique.Impl;
process implementation Application.Impl
subcomponents
SUPER : thread tache_periodique.Impl;
STAT : thread tache_periodique.Impl;
end Application.Impl;
processor cpu
end cpu;
system commutateur
end commutateur;
system implementation commutateur.Impl
subcomponents
process1 : process application.Impl;
cpu1 : processor cpu;
end commutateur.Impl;
end commutateurs;
Question 2 :
En fait, ce système n'est pas ordonnançable sur un processeur seulement.
On cherche donc à ordonnancer ce jeu de tâches sur une architecture comportant
deux processeurs identiques. On applique une approche par partitionnement.
Proposer une affectation des tâches sur les deux processeurs qui garantisse le
respect des échéances. Montrer, sans calculer l'ordonnancement des tâches, que
les tâches respectent effectivement leur échéance.
Question 3 :
Calculer l'ordonnancement sur les 50 premières unités de temps.
Question 4 :
Comment doit-on modifier le modèle AADL proposé dans la question 1 afin de
représenter le logiciel déployé sur deux processeurs ? Donner la nouvelle version de ce modèle.
On souhaite modéliser et vérifier l'ordonnancement d'un logiciel embarqué
dans un réfrigérateur. Ce logiciel contrôle la production de froid, une alarme
associée à la porte et à la température ainsi que l'éclairage de l'équipement.
Votre responsable vous demande de vérifier le respect des contraintes temporelles de ce logiciel.
On suppose que ce dernier est composé des tâches périodiques suivantes :
Threads | Temps d'exécution | Périodes/Echéances |
Thermostat | Jamais plus de 6 ms | 15 ms |
Porte | 4 ms dans certains cas, 2 ms sinon | 30 ms |
Lampe | Jamais plus de 1 ms | 7 ms |
Alarme | Souvent 2 ms, mais parfois jusqu'à 3 ms | 10 ms |
Sonde | Jamais plus de 2 ms | 14 ms |
Les échéances sont égales aux périodes. La date de première activation
de toutes les tâches est identique et est égale à zéro.
Question 1 :
Votre responsable vous propose dans un premier temps d'utiliser
un OS disposant d'un seul processeur avec un ordonnanceur Rate Monotonic préemptif.
Compléter le modèle AADL ci-dessous afin de pouvoir simuler
l'ordonnancement de ce système avec un logiciel comme AADLInspector.
package refrigerateur
public
thread tache_periodique
properties
Dispatch_Protocol => Periodic;
end tache_periodique;
thread implementation tache_periodique.Impl
end tache_periodique.Impl;
process implementation Application.Impl
subcomponents
thermostat : thread tache_periodique.Impl;
porte : thread tache_periodique.Impl;
lampe : thread tache_periodique.Impl;
alarme : thread tache_periodique.Impl;
sonde : thread tache_periodique.Impl;
end Application.Impl;
processor cpu
end cpu;
system froid
end froid;
system implementation froid.Impl
subcomponents
process1 : process application.Impl;
cpu1 : processor cpu;
end froid.Impl;
end refrigerateur;
Question 2 :
En fait, ce système n'est pas ordonnançable sur un processeur seulement.
On cherche donc à ordonnancer ce jeu de tâches sur une architecture
comportant deux processeurs identiques. On hésite à utiliser soit une approche par partitionnement,
soit une approche d'ordonnancement global.
On applique d'abord la méthode par partitionnement. On suppose que les tâches Lampe et Sonde sont
placées sur un processeur et que les autres tâches sont placées sur le second.
Donner le chronogramme d'ordonnancement de ce jeu de tâches sur l'hyper-période (ou encore nommée
la période d'étude).
Question 3 :
On applique maintenant une approche par ordonnancement global.
Les migrations de tâches sont autorisées à tout instant.
Donner le chronogramme d'ordonnancement sur les 20 premières unités de temps.
On souhaite modéliser et vérifier l'ordonnancement d'un logiciel embarqué
dans un réfrigérateur. Ce logiciel contrôle la production de froid, une alarme
associée à la porte et à la température ainsi que l'éclairage de l'équipement.
On vous demande d'étudier le comportement de ce système.
On suppose que ce dernier est composé des tâches périodiques suivantes :
Threads | Temps d'exécution | Périodes/Echéances |
Thermostat | Jamais plus de 2 ms | 15 ms |
Porte | 1 ms dans certains cas, 2 ms sinon | 30 ms |
Lampe | Jamais plus de 1 ms | 7 ms |
Alarme | Souvent 2 ms, mais parfois jusqu'à 3 ms | 10 ms |
Sonde | Jamais plus de 2 ms | 14 ms |
Les échéances sont égales aux périodes. La date de première activation
de toutes les tâches est identique et est égale à zéro.
Dans un premier temps, on suppose que les threads sont indépendantes.
On suppose également un processeur avec un ordonnanceur à priorité fixe préemptif et une
affectation des priorités selon Rate Monotonic.
Question 1 :
Proposer un modèle AADL du réfrigérateur avec AADLInspector.
Avec AADLInspector, vous validerez statiquement le modèle ainsi que le respect des contraintes temporelles.
Question 2 :
Nous regardons maintenant comment adapter le modèle de la question 1 pour une génération de code avec Ocarina.
-
Dans un premier temps, récupérer les fichiers de ce répertoire.
Il s'agit d'un exemple de modèle AADL composé de 2 threads périodiques indépendantes(threads tic et tac).
Cet exemple vous montre comment ocarina génére le code de l'application. Pour ce faire, il est nécessaire de procéder de
cette façon:
- Mettre en place l'environnement de travail avec la commande :
source ocarina.bash
- Générer le code C à partir du modèle AADL avec :
ocarina -x scenario.aadl
.
- Le code C généré est stocké dans le répertoire root_impl. Il peut être compilé par :
make
dans ce même répertoire.
Vous avez alors un exécutable Linux (fichier node_a) pouvant être lancé depuis le shell.
- Etudier les fichiers générés activity.h et activity.c, deployment.h et deployement.c
ainsi que main.c, puis indiquer leur rôle respectif.
- Compléter/adapter l'exemple ci-dessus afin de pouvoir générer avec
Ocarina le programme C correspondant à votre modèle de la question 1. Ce programme C constitue un simulateur de l'application permettant de se
rapprocher de la mise en oeuvre du système.
Question 3 :
Les tâches Alarme et Thermostat
partagent une donnée en exclusion mutuelle pendant l'intégralité de leur temps d'exécution.
Cette donnée stocke la température mesurée par Thermostat. Ainsi, Thermostat modifie
cette donnée alors qu'Alarme n'y accède qu'en lecture.
- On vous donne un nouvel exemple de modèle AADL,
disponible ici qui vous montre comment
intégrer un composant data avec Ocarina. La donnée partagée est modélisée par le composant
Counter.
- Etudier, générer le code avec Ocarina, compiler et tester ce modèle.
- Expliquer le rôle des composants tic_sequence et tac_sequence.
- Modifier votre modèle du réfrigérateur pour intégrer
la donnée partagée entre Alarme et Thermostat.
- Tester ce nouveau modèle avec Ocarina.
Question 4 :
On souhaite répartir les tâches sur deux processeurs :
- Les tâches Alarme et Thermostat ainsi que leur donnée partagée sont
déployées sur le premier processeur.
- Les tâches Sonde, porte et Lampe sont déployées sur le second processeur.
- Modifier votre modèle AADL en conséquence, puis, générer/tester le code avec Ocarina.
- Quelles sont les principales différences sur le code généré ?
L'objectif de cet exercice est de vous monter un autre outil AADL ; ce qui devrait vous permettre de comprendre
ce qui est de l'ordre de
l'outil ou du standard/langage.
Pour cet exercice, nous allons utiliser les 2 logiciels
qui se trouvent ici .
- Récupérer les fichiers zip et les ouvrir sur le bureau.
- Lancer osate ; créer un projet AADL composé d'un package contenant
ce modèle AADL.
- Positionner les propriétés du property set Cheddar_Parameters_Properties afin de pointer sur
le répertoire où vous avez stocké l'exécutable de cheddar.
- Générer le modèle d'instance et vérifier l'ordonnancement de ce jeu de tâches.