Partie 4 Timers et interruptions Timers and interrupts

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 1
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
C/TD INFO2 - Partie 4
page 2
Les méthodes associées au type Timer sont dans le tableau ci-dessous :
Timer / Fonctions Utilisation
start
Déclenche le timer
stop
Arrête
te le timer
reset
Remet le timer à 0
read
Renvoie le temps écoulé en secondes
read_ms
Renvoie le temps écoulé en milli-secondes
milli
read_us
Renvoie le temps écoulé en micro-secondes
micro
4.3. Utilisation des objets mbed du type Timer
•
Exemple : Création
ion 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 tache1
int main() {
timer1.start(); // déclenchement du timer
while(1) {
if (timer1.read_ms()>=200)//lecture
(timer1.read_ms()>=200)//
du timer
{
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
nverse la valeur de la sortie toutes les 200ms.
Exercice 1 :
a) Réaliser et tester le programme ci-dessus.
ci
b) Réaliser un programme permettant d'afficher en binaire sur les 4
Leds le nombre de secondes écoulées (modulo 16 évidemment). Vous
devez utiliser un bus.
CV
C/TD INFO2 - Partie 4
page 3
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 timer1
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 timer2
timer2.reset(); // remise à zéro du timer2
}
}
}
// Corps des fonctions task1 et task2
void task1(void){
sortie1.write(!sortie1.read()); // inversion de la sortie1
}
void task2(void){
sortie2.write(!sortie2.read()); // inversion de la sortie2
}
Exercice 2 :
Réaliser et tester ce programme. Quelle est la tâche 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 4
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
o
•
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 relatif au timer1
{
task1(); // appel de la fonction liée au timer1
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
Associe au Ticker une fonction (ou methode) qui sera appelée et spécifie un
attach
intervalle de temps en seconde entre 2 appels
Associe au Ticker une fonction (ou methode) qui sera appelée et spécifie un
attach_us
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 toutes les 200ms
flipper2.attach(&task2, 1.0); //task2 appelée toutes les 1s
while(1) {
wait(0.2);
}
}
// Corps des fonctions task1 et task2
void task1(void){
sortie1.write(!sortie1.read()); // inversion de la sortie1
}
void task2(void){
sortie2.write(!sortie2.read()); // inversion de la sortie2
}
CV
C/TD INFO2 - Partie 4
page 5
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 :
Une entrée numérique est utilisée pour appeler une fonction sur un front
InterruptIn
montant ou descendant
InterruptIn
Crée un objet du type InterruptIn connecté à une broche spécifique
Associe une fonction/méthode (routine d'interruption) à appeler lorsqu’un front
rise
montant intervient sur la broche spécifiée
Associe une fonction/méthode (routine d'interruption) à appeler lorsqu’un front
fall
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 toggle
int main() {
button.rise(&toggle); // associe l’adresse de la fonction toggle
while(1);
// à un front montant de la broche 18
}
// Corps de la fonctions toggle (routine d'interruption)
void toggle(void){
sortie1.write(!sortie1.read()); // inversion de la sortie1
}
Exercice 4 :
Réaliser et tester ce
erratique (étrange) ?
CV
programme.
Constatez-vous
C/TD INFO2 - Partie 4
un
comportement
page 6
• 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.
Réponse
Réponse
idéale
réelle
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 fonction 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 poussoir. Quelle
est le temps minimum de l'anti-rebond ?
Exercice 6 :
Utilisation d'un Timer et d'une interruption matérielle.
Réaliser un programme permettant de faire flasher deux Leds à des
périodes différentes et d'inverser l'état d'une troisième Led
lorsqu'on appuie sur un bouton poussoir.
CV
C/TD INFO2 - Partie 4
page 7
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 aux Timers ?
Q6) Ecrire le code qui permet d'associer la fonction 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 instruction par cycle
d'horloge) ? Dans ce cas, le mbed peut-il exécuter d'autres tâches ?
CV
C/TD INFO2 - Partie 4
page 8