Click here to load reader
Upload
phungcong
View
213
Download
1
Embed Size (px)
Citation preview
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
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.
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
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
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 }
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) ?
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
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 ?