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
© Copyright 2024