Examen Temps-Réel : Le langage synchrone Lustre (durée prévue : 2h00) (Seul le document «Rappel sur Lustre» est autorisé) N.B : Vos réponses sont à consigner sur le présent document. Exercice 1 : Question de compréhension (3 pts) 1.1 Le langage LUSTRE est défini sur le paradigme du synchronisme fort. Expliquer en quelques lignes cette notion. (1.5 pts) 1.2 Le langage LUSTRE associé à LESAR est une Technique Formelle. Quel est l'intérêt d'utiliser une Technique Formelle dans le cadre d'un développement de systèmes? (1.5 pts) Exercice 2 : Un petit programme (2pts) Ecrire les équations Lustre (et uniquement les équations) qui calculent la suite des 1/n 2 pour n variant de 1 à l infini (suite qui converge vers 2 /6). 1/2 10/01/2006
Exercice 3 : Question de compréhension (3 pts) Soit les programmes Lustre TEST1 et TEST2 suivants : node somme (X: int) returns (S:int); S = X -> X + pre(s); tel node TEST1 (X: int) returns (S:int); var B:bool; B = true -> not pre(b); S = current (somme(x when B)); tel node TEST2 (X: int) returns (S:int); var B:bool; B = true -> not pre(b); S = current (somme(x) when B); tel Soit le flot constant I = (1,1,1,1,1,1 ). Quelle sont les réponses de somme(i), TEST1(I) et TEST2(I)? somme(i) = (,,,,,,,, ) TEST1(I) = (,,,,,,,, ) TEST2(I) = (,,,,,,,, ) Exercice 4 : Calcul d horloges (3 pts) Soit le programme Lustre défini partiellement par node prog1 (B1, B2:bool ; H1:bool when B1 ; H2:bool when B2 ; X1:int when H1 ; X2:int when H2 ; Y:int when (B1 and B2)) returns (S : int when ) ; var Z1:int when ; Z2:int when ; Z3:int when ; Z4:int when ; Z1 = current(x1) ; Z2 = current(x2) ; Z3 = current(z1) + current(z2) ; Z4 =(current(z3) when (B1 and B2)) + Y ; S = current(z4) ; tel. 2/2 10/01/2006
Il manque dans ce programme les informations d horloge. Lorsqu elles existent, précisez les horloges de Z1 Z4 et S. (Note : pour indiquer qu un flot F est sur l horloge de base on peut écrire indifféremment «F : int» ou «F : int when true»). S : int when Z1: int when Z2: int when Z3: int when Z4: int when Exercice 5 : Cadence d'un noeud. L'opérateur When. (3 pts) On souhaite calculer la vitesse d un avion comme étant égale à M = racine((pt/ps) 1) où PT et PS sont des pressions mesurées à l extérieur de l avion, et «racine» la fonction racine carrée. En fonctionnement normal, PS est inférieure à PT tout en étant strictement positive. Cependant, en cas de défaillance d un des capteurs, il se peut que la valeur mesurée de PS devienne supérieure à PT ou devienne nulle. Il est impératif dans ce cas de retourner une vitesse M=0 sans provoquer une erreur d exécution (racine d un nombre négatif). On souhaite écrire un nœud LUSTRE calculant M selon la spécification ci-dessus et qui respecte cette exigence. 1.1Ecrire une équation définissant un flot de booléens B tel que B=true si PT est supérieur ou égal à PS et B=false si PS est différents de 0. (0.5 pts) B= 1.2Ecrire un noeud Frac() disposant de trois entrées réelles A, B, C et d'une sortie réelle S tel que : S=A/B C. (0.5 pts) 3/2 10/01/2006
1.3Ecrire le noeud MesureVitesse() respectant les spécifications données ci-dessus. Le prototype du noeud sera : (2 pts) MesureVitesse(PS,PT : real) returns (M : real) Vous utiliserez les noeuds racine(), Frac et la condition booléenne B. 4/2 10/01/2006
Question 4 Un croisement (6 pts) On souhaite automatiser un croisement ferroviaire (simplifié). On considère un croisement composé de deux voies à sens unique représenté figure 3 (les trains circulent toujours dans le même sens). L accès au croisement est protégé par deux feux Fi (i=1,2), un sur chaque voie. (Pour simplifier, on considérera que Fi est un flot booléen égal à vrai pour traduire que le feu est vert et égal à faux pour traduire qu il est rouge). D autre part, le croisement est précédé sur chaque voie par un capteur Ei (i=1,2). L arrivée d un train devant le croisement par la voie i provoque l activation de ce capteur. On supposera, pour simplifier que Ei est un flot booléen positionné à vrai tant que le train est bloqué devant le croisement, et qui repasse a faux dès que le train a franchi la capteur (pour simplifier, on suppose que les trains ont une longueur nulle). Enfin, un capteur C détecte la présence d un train dans le croisement lui-même. La présence d un train dans le croisement provoquera le positionnement à vrai de ce capteur, tandis que son absence le positionnera à faux (pour simplifier, on considérera que C est un flot booléen égal à vrai tant qu un train est présent dans le croisement). On demande d écrire en Lustre un programme gérant les feux F1 et F2 tel que : - toute collision dans le croisement entre deux trains circulant sur les voies 1 et 2 est impossible (sous réserve que les trains respectent les feux) - tout train se présentant devant le croisement recevra un jour l'autorisation de passer. Attention! Ce problème ne se ramène pas à une simple exclusion mutuelle. On doit en effet accepter le cas où deux trains, circulant sur la même voie (par exemple la voie 1), sont suffisamment proches pour que à un instant donné le premier soit dans le croisement tandis que le second arrive devant le feu F1. Il peut donc y avoir deux trains en attente du croisement (un sur chaque voie) tandis qu un troisième occupe le croisement comme indiqué figure 1. (On se s occupera pas du problème de risque de collision entre deux trains circulant sur la même voie). feu F2 zone d attente voie 2 feu F1 zone d attente voie 1 capteur E1 capteur E2 voie1 voie2 zone de croisement (incluant les deux voies) surveillée par le capteur C figure 3. 5/2 10/01/2006
6/2 10/01/2006
7/2 10/01/2006