Le langage Esterel

Frank Singhoff






I. Présentation

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.


II. Simuler


Exercice 1 : Tic/Tac


Ecrire et tester avec xes un programme Esterel dont le fonctionnement est le suivant :



Exercice 2 : Incrémenter/décrémenter


Ecrire et tester avec xes un programme Esterel qui incrémente ou décrémente une donnée. Le programme Esterel contient trois signaux :





III. Exécuter, embarquer






Exercice 3 : Calculatrice


Cet exercice a pour but d'illustrer la façon dont on "embarque" du code Esterel dans un langage hôte ... Le langage hôte utilisé ici est le langage C.

Soit le programme Esterel calcul.strl suivant. Compiler et tester ce programme avec Xes.

Ce programme est une calculatrice élémentaire. Le signal de sortie LCD modélise l'écran LCD. Les autres signaux d'entrée modélisent les touches du clavier de la calculatrice. On suppose qu'entre deux activations du programme Esterel, une seul signal ne peut délivré par le clavier vers le programme Esterel.

On vous donne le programme C calcul_main.c suivant. Ce programme fournit un environnement permettant d'exécuter le programme calcul.strl.


Question 1 :


  • Etudier le programme calcul_main.c. Identifier dans ce programme:
    1. Ou l'automate Esterel est invoqué,
    2. Quand l'automate est informé de la présence des signaux d'entrée,
    3. Ou sont les fonctions pour les signaux de sortie,
    4. Et comment l'automate Esterel est invoqué automatiquement. Quelle est la période d'activation de l'automate ?
  • Avec ce Makefile, compiler puis tester le programme calcul_main.c. Que se passe t il si, lors d'une phase de saisie, les 2 signaux OPERANDE et ADDITIONNE sont présents au même instant ? Comment ce problème il est résolu par le programme C ?


    Question 2 :


  • Modifier le programme calcul.strl de sorte que la calculatrice fournissent une fonction de réinitialisation. Pour ce faire, vous ajouterez un signal d'entrée pur RESET. Sur réception du signal RESET, la calculatrice doit interrompre la séquence de saisie encours et afficher 0 sur l'écran LCD. Pour tester votre programme Esterel, vous devrez modifier calcul_main.c afin d'autoriser l'utilisateur à saisir la commande de réinitialisation (ex : saisie du caractère "r").


    Question 3 :


  • On souhaite archiver dans un fichier les différentes données émises vers l'écran LCD par le programme Esterel. Modifier le programme afin :
    1. 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.
    2. Modifier les programmes calcul.strl et calcul_main.c afin de tester la fonction d'archivage.





    Exercice 4 : la machine à café

    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 :

    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 :
    1. La première gère la sélection des boissons.
    2. 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.

    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 :

    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.







    V. Exercices supplémentaires




    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 :
    1. 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).

    2. 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 :


    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 :

    1. Proposez un programme Esterel répondant à la description ci-dessus.
    2. 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 :






    Exercice 8 : Instructions étendues (suite)


    Soit le programme lebavard.strl.

    Travail à faire :

    1. Etudiez le comportement du programme lebavard.strl.
    2. Décrivez le fonctionnement de l'instruction suspend/when.
    3. 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