L'objectif du TP est de vous montrer les outils
disponibles pour tester et exécuter
des programmes Esterel.
Pour accèder aux outils Esterel, vous devrez
utiliser la commande source
strl.csh.
Pour les éventuelles intérrogations concernant Esterel (syntaxe/comportement des
instructions), vous pouvez utiliser le
manuel de référence/guide de programmation.
On souhaite archiver dans un fichier les différentes
données émises vers l'écran LCD par le programme Esterel.
Modifier le programme afin :
- D'utiliser deux nouveaux signaux SWITCH et WRITE.
Le programme Esterel possède deux modes de fonctionnement : la fonction
d'archivage peut être active ou non.
Par défaut, la fonction d'archivage n'est pas active. Sur réception
du signal SWITCH, le programme Esterel doit activer la fonction d'archivage.
Une seconde réception de ce signal permet à l'utilisateur de désactiver
cette fonction : le signal SWITCH fonctionne
donc comme un interrupteur.
Le signal de sortie WRITE est un signal valué par un entier.
Le programme Esterel utilise ce signal
afin d'ajouter dans le fichier d'archivage
une nouvelle chaine de caractères indiquant un affichage sur l'écran LCD.
L'archivage concerne donc les émissions du signal
LCD.
- Modifier les programmes calcul.strl
et calcul_main.c afin de tester la fonction d'archivage.
On se propose de réaliser une application
qui simule le comportement d'une machine à café.
Cet exerice montre comment un programme Esterel peut être associé
à une interfance graphique (qui par nature, fonctionne de façon
réactive).
C'est aussi un exercice de synthèse sur les différentes instructions
Esterel que l'on a étudiées auparavant.
L'application est constituée des fichiers
main.c,
input.c,
input.h,
output.c et
ihm.c.
Pour construire la machine à café, vous devrez utiliser ce
Makefile.
Le contenu/rôle des fichiers est le suivant :
- main.c est le programme principal. Ce fichier initialise
puis, active périodiquement le programme Esterel.
Le programme Esterel est activé toutes les 250 milli-secondes.
- ihm.c contient le code nécessaire à l'initialisation de l'ihm
simulant la machine à café. Vous n'avez, a priori, pas besoin de consulter/modifier
ce fichier.
- output.c contient les fonctions C invoquées par le programme
Esterel lors des émissions de signaux de sortie.
- input.c contient les fonctions C invoquées pour générer les
signaux d'entrée du programme Esterel. Ces fonctions sont invoquées
par l'ihm lorsque ses boutons sont pressés.
Dans les questions suivantes, on vous demande de compléter le programme
Esterel
cafe.strl.
Seul ce fichier sera à modifier.
Le fonctionnement de la machine à café sera modélisé
par un programme Esterel offrant deux fonctionnalités :
- La première gère la sélection des boissons.
- La deuxième, le monnayeur, gère le
paiement des boissons sélectionnées.
Question 1 : sélection des boissons
On regarde d'abord la sélection des boissons.
Pour cette première partie du programme, les signaux utilisés
sont :
choisir_une_boisson,
supplement_sucre_interdit,
boisson_selectionnee,
the,
chocolat,
cafe,
supplement_sucre et
annuler.
- Les signaux the, cafe, chocolat
signalent que l'utilisateur
souhaite commander un thé, un café ou un chocolat.
Sur présence de ces signaux, le programme Esterel doit
générer un signal de sortie boisson_selectionnee qui
contient le nom de la boisson sélectionnée. Le
signal boisson_selectionnee doit indiquer
si la boisson est sucrée ou non (boisson avec ou sans
supplément de sucre).
-
Lorsqu'un utilisateur souhaite une boisson avec un supplément
de sucre, il doit d'abord presser le bouton "supplément
de sucre" avant de choisir sa boisson.
La sélection du supplément de sucre est indiquée par
le signal supplement_sucre.
- La sélection supplément sucre est interdite avec le chocolat.
Ce cas de figure doit déclencher l'émission du signal
supplement_sucre_interdit.
- Enfin, le signal annuler permet d'annuler la sélection
du supplément sucre. Ce signal invite l'utilisateur à choisir
une boisson en émettant le signal choisir_une_boisson.
Travail à faire :
Complétez et compilez le programme, puis, testez son fonctionnement.
Pour compiler le programme, n'oubliez pas de générer le code C à partir du programme
Esterel. Vous disposez de l'exécutable Linux cafeq1
qui vous montre comment le programme
Esterel doit fonctionner.
Question 2 : ajout d'un timeout
En pratique,
il est possible qu'un utilisateur sélectionne le supplément
sucre, puis, parte sans choisir de boisson.
Pour éviter ce type de situation, on souhaite ajouter
un chien de garde, qui, au bout de 10 secondes,
annule la sélection du supplément de sucre.
Modifiez le programme cafe.strl en ajoutant cette fonctionnalité.
Question 3 : ajout du monnayeur
Dans cette dernière question, on souhaite ajouter la gestion
du paiement de la boisson.
Pour cette question, les signaux à utiliser
sont :
servez_vous,
argent_verse,
nouvelle_piece_inseree,
prenez_votre_monnaie et
annuler.
Le fonctionnement du monnayeur est le suivant :
- Le prix d'une boisson non sucrée est de 20 centimes.
Le prix d'une boisson sucrée est de 30 centimes.
- Le monnayeur mémorise les sommes versées par l'utilisateur.
Lorsque l'utilisateur insère des pièces dans la machine,
le signal
nouvelle_piece_inseree est délivré au programme Esterel. L'utilisateur peut donner des pièces
de 10,20 et 50 centimes.
- L'émission du signal argent_verse permet
d'actualiser le montant affiché sur la machine à café.
Ce signal indique la somme totale versée par l'utilisateur.
Il doit être émis à chaque fois que l'utilisateur
insère des pièces dans la machine.
- Lorsque le signal
annuler est reçu, le monnayeur doit éventuellement rendre
les pièces précédemment versées.
L'opération "rendre la monnaie" est modélisée par l'émission
du signal prenez_votre_monnaie.
- Lorsqu'une boisson est payée,
le signal servez_vous doit être émis.
Le payement d'une boisson doit être déclenché par le programme Esterel
une fois que la boisson est sélectionnée et que suffisamment d'argent
a été versé.
- Enfin, comme le supplément de sucre, un timeout de
10 secondes doit compléter le fonctionnement du monnayeur.
Sur expiration du timeout, la monnaie précédemment versée
doit être rendue et la sélection de la boisson doit être annulée.
L'opération "rendre la monnaie" est modélisée par l'émission
du signal prenez_votre_monnaie.
Le timeout doit démarrer lorsqu'une boisson est sélectionnée ou lorsqu'une première
pièce est versée dans la machine.
Compléter le programme Esterel cafe.strl
afin d'implanter le comportement
décrit ci-dessus.
Vous disposez de l'exécutable Linux cafeq2
qui vous montre comment le programme
Esterel doit fonctionner.
Exercice 5 : Gaston, ya le téléphon qui son
On souhaite spécifier le comportement temporel et logique
d'un téléphone grâce à un programme Esterel.
L'interface du programme Esterel contient les signaux
d'entrée APPEL, RACCROCHER, DECROCHER, SAISIE_NUMERO
et SECONDE.
Les signaux
de sortie sont ECHEC_APPEL, SONNERIE et TEMPS_DE_COMMUNICATION.
Tous ces signaux sont purs, excepté TEMPS_DE_COMMUNICATION
qui contient un entier.
Le téléphone possède deux fonctionnalités
principales :
- La gestion des appels entrants :
Un appel entrant commence lors de la réception par le téléphone du signal APPEL. Le téléphone émet
alors toutes les secondes une occurrence du signal SONNERIE.
Vous modéliserez l'écoulement des secondes par les
occurrences du signal SECONDE.
Si 20 sonneries sont émises sans que l'utilisateur
décroche le combiné (occurrence du signal DECROCHER), alors le signal
ECHEC_APPEL est émis et le téléphone attend
l'arrivée d'un nouvel APPEL.
Si un utilisateur a décroché le combiné, le téléphone affiche à chaque seconde la durée totale
de la communication et ce, jusqu'à la terminaison de la
communication. Une communication se termine au moment où l'utilisateur
raccroche le combiné (occurrence du signal RACCROCHER).
- La gestion des appels sortants :
Un appel sortant commence lors de la réception, par le téléphone,
du signal DECROCHER. Sur réception du signal
DECROCHER, le téléphone attend
durant 10 secondes que l'utilisateur fournisse le numéro
de téléphone du correspondant à
appeler.
Si l'utilisateur ne fournit pas ce numéro
dans les délais,
alors le signal ECHEC_APPEL est émis. Par la
suite, le téléphone
attend que le combiné soit raccroché, puis,
traite un nouvel appel sortant.
Si un numéro de téléphone a été donné dans le délai
escompté,
le téléphone affiche chaque seconde la durée totale
de la communication.
Une communication se termine lorsque l'utilisateur
raccroche le combiné (occurrence du signal RACCROCHER).
Travail à faire :
donnez un programme Esterel conforme à la description
ci-dessus.
Exercice 6 : Exceptions Esterel
Pour sortir d'un bloc d'instructions, il est possible d'utiliser
l'instruction abort/when. Toutefois, la condition de sortie (dite de préemption)
avec abort
est nécessairement une expression temporelle (expression sur des
signaux). Une méthode plus générale
pour sortir d'un bloc consiste à utiliser les exceptions Esterel grâce à
la notion de trap. Le code suivant :
trap T
P;
end trap
;
permet de sortir du bloc d'insctructions P
lorsque
l'instruction exit T y est invoquée;
T étant le nom de l'exception.
On se propose d'illustrer le fonctionnement des exceptions Esterel. Pour ce faire,
on considère un programme Esterel comportant 2 signaux :
- Un signal d'entrée I valué par un entier.
- Un signal de sortie O pur.
Le programme Esterel considéré doit attendre l'occurrence du signal I, puis, sur les
?I tops d'horloge suivants, émettre le signal O.
Vous utiliserez une boucle loop/end loop pour effectuer les ?I
émissions de O.
Travail à faire :
- Proposez un programme Esterel répondant à la
description ci-dessus.
- Utilisez le simulateur
xes pour tester son fonctionnement.
Exercice 7 : Instructions Esterel étendues
L'objectif de cet exercice est de vous présenter
quelques instructions Esterel "étendues".
On considère le programme
micro_ondes.strl .
Ce programme utilise les instructions étendues
sustain, loop/each et halt.
Travail à faire :
- Etudiez le programme micro_ondes.strl
grâce à xes.
- Décrivez le fonctionnement des instructions
sustain, loop/each et halt.
- Proposez, pour chaque instruction sustain, loop/each et halt,
une combinaison d'instructions dont le comportement est équivalent.
Ces combinaisons seront construites à partir des
instructions de plus bas niveau emit, pause, loop/end loop
et abort/when.
- Modifiez le programme
micro_onde.strl
en substituant les instructions sustain, loop/each, halt
par vos propositions.
- Testez par simulation, que le programme modifié possède
un comportement identique à celui du programme initial.
Exercice 8 : Instructions étendues (suite)
Soit le programme
lebavard.strl.
Travail à faire :
- Etudiez le comportement du programme lebavard.strl.
- Décrivez le fonctionnement de l'instruction
suspend/when.
- Proposez un programme de comportement équivalent en substituant les instructions
suspend et sustain par des instructions Esterel de plus bas niveau
(instructions emit, pause, present, loop/end loop
et abort/when).
Page maintenue par Frank Singhoff
(singhoff@univ-brest.fr)
Dernière mise à jour le 11 novembre 2009