8

Click here to load reader

Partie 4 Timers et interruptions Timers and interruptsgeii-web.unice.fr/.../index.html_files/INFO2_coursTD_4_etudiant.pdf · informatique par le microprocesseur afin d'exécuter un

Embed Size (px)

Citation preview

Page 1: Partie 4 Timers et interruptions Timers and interruptsgeii-web.unice.fr/.../index.html_files/INFO2_coursTD_4_etudiant.pdf · informatique par le microprocesseur afin d'exécuter un

CV C/TD INFO2 - Partie 4 page 1

Cours/TD d’informatique embarquée

Utilisation d’un microcontrôleur MBED

Partie 4 Timers et interruptions

Timers and interrupts

Plan du cours

4.1. Temps et événements en informatique embarquée

4.2. Introduction aux Timers

4.3. Utilisation des objets mbed du type Timer

4.4. Utilisation de plusieurs Timers

4.5. Utilisation des objets mbed du type Ticker

4.6. Interruptions externes matérielles

Page 2: Partie 4 Timers et interruptions Timers and interruptsgeii-web.unice.fr/.../index.html_files/INFO2_coursTD_4_etudiant.pdf · informatique par le microprocesseur afin d'exécuter un

CV C/TD INFO2 - Partie 4 page 2

4.1. Temps et événements en informatique embarquée

Il est nécessaire de ____________________________________________ (ex : chronomètre, caméra)

Il est également fréquemment nécessaire d'avoir ____________________________ (ex: freinage

ABS, capteurs de chocs pour les airbags).

Les interruptions permettent à ______________________________________________________

ex : vous travailler (basse priorité) et vous recevez un sms (haute priorité), lorsque vous aurez

fini de répondre vous pourrez reprendre votre travail

Une interruption peut être programmée pour s’exécuter sur un événement ________________

(toutes les secondes par ex) ou sur un événement ________________________________ (ex :

bouton poussoir)

En informatique, une interruption est un arrêt temporaire de l'exécution normale d'un programme

informatique par le microprocesseur afin d'exécuter un autre programme (appelé

____________________________).

Remarque : Le terme interruption est également utilisé (abus de langage) pour désigner des

exceptions

– c'est-à-dire des arrêts provoqués par une condition exceptionnelle lors de l’exécution

d’un programme (instruction erronée, zone mémoire inexistante, ...).

Les interruptions peuvent ____________________________________________________.

– Une interruption de priorité supérieure est prise en compte lors du traitement d'une

autre interruption, mais une interruption de priorité inférieure est mise en attente.

On utilise les interruptions principalement dans deux buts :

– permettre _____________________________________ avec des périphériques

– ___________________________________ avec un ordonnanceur. Bloquant : qui empêche d'exécuter d'autres instructions (paralysie), exemple : fonction wait()

Ordonnanceur : l'ordonnanceur est le programme du système d'exploitation qui contrôle et pilote l'exécution des autres

programmes.

4.2. Introduction aux Timers

Une interruption Timer peut être vue comme ____________________________________________

(et non pas par le programme principal)

– Un exemple d’interruption simple est : incrémentation automatique d’un compteur à un

intervalle de temps régulier. L’incrémentation est faite (en arrière plan) pendant l’exécution

du programme principal

– La fonction peut alors être exécutée à des intervalles de temps spécifiques imposés par le

compteur

– Par exemple, on peut exécuter certaines parties du code toutes les 10ms et d’autres toutes

les 100ms (programmation ordonnancée).

La plupart des microcontrôleurs ont des timers et des routines d’interruptions temps réel.

Page 3: Partie 4 Timers et interruptions Timers and interruptsgeii-web.unice.fr/.../index.html_files/INFO2_coursTD_4_etudiant.pdf · informatique par le microprocesseur afin d'exécuter un

CV

Les méthodes associées au type Timer

Timer / Fonctions Utilisation

start Déclenche le timer

stop Arrête le timer

reset Remet le timer à 0

read Renvoie le temps écoulé en secondes

read_ms Renvoie le temps écoulé en milli

read_us Renvoie le temps écoulé en micro

4.3. Utilisation des objets mbed du type

• Exemple : Création d’un signal carré avec un programme ordonnancé

#include "mbed.h" Timer timer1; // définition du timer DigitalOut sortie1(p5); void tache1(void); // prototype de tache1int main() { timer1.start(); // déclenchement du timer while(1) { if (timer1.read_ms()>=200)// { tache1(); // appel de la fonction tache1 timer1.reset(); // remise à zéro du timer } } } void tache1(void){ // fonction sortie1.write(!(sortie1.read()); // inversion}

Ce programme inverse la valeur de la sortie toutes les 200ms.

Exercice 1 :

a) Réaliser et tester le programme cib) Réaliser un programme permettant Leds le nombre de secondes écoulées (modulo 16 évid emment).devez utiliser un bus.

C/TD INFO2 - Partie 4

au type Timer sont dans le tableau ci-dessous :

Déclenche le timer

te le timer

Remet le timer à 0

Renvoie le temps écoulé en secondes

Renvoie le temps écoulé en milli-secondes

Renvoie le temps écoulé en micro-secondes

Utilisation des objets mbed du type Timer

ion d’un signal carré avec un programme ordonnancé

Timer timer1; // définition du timer DigitalOut sortie1(p5); void tache1(void); // prototype de tache1

timer1.start(); // déclenchement du timer

(timer1.read_ms()>=200)// lecture du timer

tache1(); // appel de la fonction tache1 timer1.reset(); // remise à zéro du timer

void tache1(void){ // fonction sortie1.write(!(sortie1.read()); // inversion

nverse la valeur de la sortie toutes les 200ms.

a) Réaliser et tester le programme ci -dessus. b) Réaliser un programme permettant d'afficher en binaire sur les 4 Leds le nombre de secondes écoulées (modulo 16 évid emment).

un bus.

page 3

d'afficher en binaire sur les 4 Leds le nombre de secondes écoulées (modulo 16 évid emment). Vous

Page 4: Partie 4 Timers et interruptions Timers and interruptsgeii-web.unice.fr/.../index.html_files/INFO2_coursTD_4_etudiant.pdf · informatique par le microprocesseur afin d'exécuter un

CV C/TD INFO2 - Partie 4 page 4

4.4. Utilisation de plusieurs Timers

Dans des programmes ordonnancés il est parfois nécessaire d’exécuter ______________

______________________________ :

Le système d’injection d’essence d’une voiture doit être contrôlé toutes les 1ms

Le niveau d’essence du réservoir peut être contrôlé toutes les 1s

Il est donc nécessaire d’avoir les lectures des données à des rythmes différents

Ce découpage en deux timers va améliorer l’efficacité du code.

Il est nécessaire de définir deux objets de type Timer et une fonction relative à chaque Timer :

Timer timer1; Timer timer2; // définition des timers DigitalOut sortie1(p5), DigitalOut sortie2(p6); void task1(void); // prototype de tâche1 void task2(void); // prototype de tâche2 //... int main() { timer1.start(); // déclenchement du timer1 timer2.start(); // déclenchement du timer2 while(1) { if (timer1.read_ms()>=200) // lecture du temps du timer1 { task1(); // appel de la fonction liée au time r1 timer1.reset(); // remise à zéro du timer1 } if (timer2.read_ms()>=1000) // lecture du temps du timer2 { task2(); // appel de la fonction liée au time r2 timer2.reset(); // remise à zéro du timer2 } } } // Corps des fonctions task1 et task2 void task1(void){ sortie1.write(!sortie1.read()); // inversion de l a sortie1 } void task2(void){ sortie2.write(!sortie2.read()); // inversion de l a sortie2 }

Exercice 2 : Réaliser et tester ce programme. Quelle est la tâch e prioritaire ?

CAS d’une CONCURRENCE ENTRE PLUSIEURS TÂCHES

Avec la programmation ordonnancée il faut faire très attention à ________________________

_________________________________________________.

• Si une tâche doit être exécutée toutes les 1ms, il faut que cette tâche prenne moins de

1ms pour être exécutée… sinon la synchronisation de la tâche ne sera pas assurée

• Plus il y a de code et plus l’horloge du processeur devra être rapide

• Il faut parfois prioriser les tâches

Page 5: Partie 4 Timers et interruptions Timers and interruptsgeii-web.unice.fr/.../index.html_files/INFO2_coursTD_4_etudiant.pdf · informatique par le microprocesseur afin d'exécuter un

CV C/TD INFO2 - Partie 4 page 5

o Est-ce que la tâche qui s’exécute toutes les 1ms est plus importante que celle qui

s’exécute toutes les 100ms ? Parce qu’au bout de 100ms les deux tâches

voudront s’exécuter en même temps…

• Cela implique également qu’il est interdit d’utiliser des fonctions de types pause, wait ou

delays avec la programmation ordonnancée

4.5. Utilisation des objets mbed du type Ticker

• L’objet Ticker est utilisé pour _________________________________ avec une période

déterminée. (ex : émettre un bip toutes 2 secondes)

• Avec les Timer il fallait dans le code surveiller en permanence le temps pour savoir si c'était

le moment ou non d’exécuter la fonction liée à l’interruption (on parle de "polling").

if (timer1.read_ms()>=200) // lecture du temps rela tif au timer1 { task1(); // appel de la fonction liée au time r1 timer1.reset(); // remise à zéro du timer1 }

• Avec les Ticker il n’est _______________________________, nous pouvons exécuter du code

pendant que le Ticker fonctionne en arrière-plan.

• Les méthodes associées au type Ticker sont dans le tableau ci-dessous :

Ticker / Fonctions Utilisé pour appeler une fonction périodiquement

attach Associe au Ticker une fonction (ou methode) qui sera appelée et spécifie un intervalle de temps en seconde entre 2 appels

attach_us Associe au Ticker une fonction (ou methode) qui sera appelée et spécifie un intervalle de temps en micro seconde

detach Dissocie la fonction (ou methode) du Ticker

• Exemple d’utilisation (génération de deux signaux carré)

#include "mbed.h" Ticker flipper1; //déclaration du premier Ticker Ticker flipper2; //déclaration du deuxième Ticker DigitalOut sortie1(p5); DigitalOut sortie2(p6); void flip1() ; //prototypes void flip2() ; int main() { flipper1.attach(&task1, 0.2); //task1 appelée tou tes les 200ms flipper2.attach(&task2, 1.0); //task2 appelée tou tes les 1s while(1) { wait(0.2); } } // Corps des fonctions task1 et task2 void task1(void){ sortie1.write(!sortie1.read()); // inversion de l a sortie1 } void task2(void){ sortie2.write(!sortie2.read()); // inversion de l a sortie2 }

Page 6: Partie 4 Timers et interruptions Timers and interruptsgeii-web.unice.fr/.../index.html_files/INFO2_coursTD_4_etudiant.pdf · informatique par le microprocesseur afin d'exécuter un

CV C/TD INFO2 - Partie 4 page 6

Exercice 3 : Réaliser et tester ce programme.

4.6. Interruptions externes matérielles

• Les microprocesseurs peuvent être configurés pour exécuter des tâches spécifiques lorsque

que surviennent des ___________________________.

• Le code principal est exécuté et effectue ses tâches, et on bascule sur certaines routines

spécifiques (routine d'interruption) lorsque survient un événement physique

– ex : bouton appuyé ou un signal changeant d’état

• Ces interruptions sont utilisées _______________________________________ à des

sollicitations extérieures.

• Le seul inconvénient des interruptions est la complexification du code.

• Objet du type interruption externe sur mbed :

InterruptIn Une entrée numérique est utilisée pour appeler une fonction sur un front montant ou descendant

InterruptIn Crée un objet du type InterruptIn connecté à une broche spécifique

rise Associe une fonction/méthode (routine d'interruption) à appeler lorsqu’un front montant intervient sur la broche spécifiée

fall Associe une fonction/méthode (routine d'interruption) à appeler lorsqu’un front descendant intervient sur la broche spécifiée

mode Définit le type mode de la broche d’entrée

Rq : toutes les entrées numériques peuvent être définies comme une entrée d’interruption sauf les

broches 19 et 20 (sur la plateforme LPC1768)

• Exemple d’utilisation

#include "mbed.h" InterruptIn button(p18); // Broche 18 définie comme entrée d’interruption DigitalOut sortie1(p5); void toggle(void); // prototype de la fonction togg le int main() { button.rise(&toggle); // associe l’adresse de la fonction toggle while(1); // à un front montant de la broch e 18 } // Corps de la fonctions toggle (routine d'interrup tion) void toggle(void){ sortie1.write(!sortie1.read()); // inversion de l a sortie1 }

Exercice 4 :

Réaliser et tester ce programme. Constatez-vous un comportement erratique (étrange) ?

Page 7: Partie 4 Timers et interruptions Timers and interruptsgeii-web.unice.fr/.../index.html_files/INFO2_coursTD_4_etudiant.pdf · informatique par le microprocesseur afin d'exécuter un

CV C/TD INFO2 - Partie 4 page 7

• Anti rebond

Lorsque vous appuyez sur le bouton poussoir, la lame métallique qui constitue l'interrupteur peut

rebondir et générer brièvement des passages de 0 à 1 que le programme va prendre en compte.

Il faut détecter le premier front montant et ignorer les rebonds du bouton poussoir. Il existe

plusieurs façons de procéder pour ignorer ces rebonds (filtrage passe-bas, comptage d'un certain

nombre de 1 après le front), voici une solution logicielle utilisant un Timer :

#include "mbed.h" InterruptIn bouton(p18); //définition de p18 comme entrée d’interruption DigitalOut led1(p5); // Timer antirebond; // définition du Timer antirebond void toggle(void); // prototype de toggle int main() { antirebond.start(); bouton.rise(&toggle); //attache l’adresse de la f onction au front while(1); //montant du bouton } void toggle() { if (antirebond.read_ms()>200){ //autorisation de l’inversion seulement led1.write(!led1.read()); //si le Timer a dé passé 200ms antirebond.reset(); //Remise à zéro du Timer } }

Exercice 5 : Réaliser et tester ce programme. Visualiser à l'oscilloscope les rebonds du bouton p oussoir. Quelle est le temps minimum de l'anti-rebond ?

Exercice 6 : Utilisation d'un Timer et d'une interruption matéri elle. Réaliser un programme permettant de faire flasher d eux Leds à des périodes différentes et d'inverser l'état d'une tro isième Led lorsqu'on appuie sur un bouton poussoir.

Réponse

idéale

Réponse

réelle

Page 8: Partie 4 Timers et interruptions Timers and interruptsgeii-web.unice.fr/.../index.html_files/INFO2_coursTD_4_etudiant.pdf · informatique par le microprocesseur afin d'exécuter un

CV C/TD INFO2 - Partie 4 page 8

Questions de cours :

Q1) Ecrire une ligne de code permettant de définir Bouton_Poussoir comme entrée d'interruption associé à la broche p15 ?

Q2) A quoi servent les interruptions ?

Q3) Qu'est-ce qui peut déclencher une interruption ?

Q4)A quoi sert la hiérarchisation des interruptions ?

Q5)Quelle est l'avantage des Tickers par rapports a ux Timers ?

Q6) Ecrire le code qui permet d'associer la fonctio n allume au front descendant de l'entrée BP sur la broche p12 et la fonction eteint au front montant de cette même entrée.

Q7) La période d'une interruption est de 1µs, la fr équence du processeur est de 100MHz, combien d'instructions au maximum puis-je exécuter dans la routine d'interruption (1 instruct ion par cycle d'horloge) ? Dans ce cas, le mbed peut-il exécuter d'autres tâches ?