Microcontrôleurs I - Les interruptions : principes ...

33
Microcontrôleurs I Les interruptions : principes, programmation et utilisation, Application : prise en compte d’événements et mesure du temps Frédéric Rousseau IESE3 S5 2020–2021

Transcript of Microcontrôleurs I - Les interruptions : principes ...

Page 1: Microcontrôleurs I - Les interruptions : principes ...

Microcontrôleurs I

Les interruptions :principes, programmation et utilisation,

Application :prise en compte d’événements et mesure du

temps

Frédéric Rousseau

IESE3 S5

2020–2021

Page 2: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

Principes des interruptions

DéfinitionI En informatique, une interruption est un arrêt temporaire

de l’exécution normale d’un programme informatique par lemicroprocesseur afin d’exécuter un autre programme(appelé service ou fonction d’interruption - ISR ou interrupthandler) (extrait en partie de wikipedia).

CausesI Une requête d’interruption peut provenir de :

I La modification de l’état électrique d’une entrée-sortie (onparle d’interruption asynchrone)

I L’indication de début ou de fin de traitement par unpériphérique associé au microprocesseur (par exemple : finde transmission de donnée, décomptage de temps, ...)

I Autre ... (exception - accès à une zone mémoire interdite,calcul arithmétique incorrect, ...)

Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021

Page 3: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

Fonctionnement

2 types d’interruption - ITI matérielle (ou externe) : déclenchée par un matériel

extérieur au processeurI logicielle (ou interne) : déclenchée par une instruction

spéciale du processeur

UtilitéI 2 raisons principales d’utiliser une interruption

I Lorsqu’il est nécessaire de réagir en temps réel à unévénement asynchrone

I Quand on souhaite économiser le temps d’exécution duprocesseur lié à une boucle de scrutation (polling)

On s’en sert où?I Partout : clavier, souris, tous les périphs

Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021

Page 4: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

Principe de l’exécution des fonctions d’IT

Programme  en  cours  d'exécu1on  

Sauvegarde  du  contexte  du  programme  

Fonc1on  service  d'interrup1on  

interrup1on  

Traitement  de    l'interrup1on  

Restaura1on  du  contexte  du  programme  

Retour  ou  fin  d'interrup1on  

I Lors d’une interruption, le microprocesseur sauve tout oupartie de son état interne (le contexte, càd les registres)dans la pile, et exécute la fonction d’interruption

I A la fin du traitement d’interruption, on restaure lecontexte, et on termine l’interruption

I On reprend le programme à l’endroit ou on s’était arrêtéMicrocontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021

Page 5: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

Plus précisément - 1

I A la détection de l’interruption, le processeur terminel’instruction (ou les instructions) en cours d’exécution

I Si les interruptions sont validées coté microprocesseur, l’ITest prise en compteI A chaque type d’IT est associé un vecteur d’interruption,

c’est à dire l’adresse de la fonction d’interruption à exécuterI On peut alors exécuter la fonction d’interruption

I Sinon, on continue normalement l’exécution duprogramme.

Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021

Page 6: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

Plus précisément - 2

Au niveau de la fonction d’interruptionI On sauvegarde le contexteI On vérifie si nécessaire que l’interruption est bien celle

attendue (si un vecteur d’IT est associé à plusieurs IT)I Généralement, le déclenchement d’une IT bloque les ITs

suivantes. Il faut alors re-valider les ITsI On exécute le traitement associé à l’interruptionI On restaure le contexte et on termine la fonction

d’interruption

Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021

Page 7: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

Conséquences

En terme de programmationI Il faut laisser le contenu des registres identiques

(sauvegarde et restauration du contexte)I Une seule façon d’échanger des informations entre le

programme principal et une fonction d’interruption : lesvariables globales

I Une fonction d’interruption doit toujours être la plus courtepossible (au sens du temps d’exécution), c’est à dire sansboucle d’attente ... Attention aux appels de fonctions ...

Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021

Page 8: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

ExempleOn souhaite développer une application qui fait clignoter uneLED toutes les 500ms. Un périphérique associé aumicroprocesseur génère une interruption toutes les ms.

main:. . .

/∗ Boucle ∗/Loop1:

ldr r0, =G_VARldr r1, [r0]cmp r1, #500/∗ G_VAR != de 500 ∗/bne Loop1

/∗ si G_VAR = 500 ∗/ldr r1, =#0str r1, [r0]/∗ faire clignoter la LED ∗/. . .b Loop1. . .

IT_handler:push {r0, r1, lr}

/∗ On incrémente G_VAR ∗/ldr r0, =G_VARldr r1, [r0]add r1, r1, #1str r1, [r0]. . .pop {r0, r1, pc}

Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021

Page 9: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

Exemple : une autre façon de faireOn souhaite développer une application qui fait clignoter uneLED toutes les 500ms. Un périphérique associé aumicroprocesseur génère une interruption toutes les ms.

main:. . .

Loop1:b Loop1. . .

IT_handler:push {r0, r1, lr}

/∗ On incrémente G_VAR ∗/ldr r0, =G_VARldr r1, [r0]add r1, r1, #1str r1, [r0]

cmp r1, #500/∗ si G_VAR != de 500 ∗/bne finIT/∗ si G_VAR = 500 ∗/ldr r1, =#0str r1, [r0]/∗ faire clignoter la LED ∗/. . .

finIT:pop {r0, r1, pc}

Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021

Page 10: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

Différences entre les 2 versions

I Dans un cas, une fonction d’IT très courteI Dans l’autre cas, une fonction plus longue (mais

néanmoins raisonnable)I L’échange de valeurs entre le programme et la fonction

d’IT à l’aide d’une variable globale

Point commun !I Sauvegarde et restauration du contexte

Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021

Page 11: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

A éviter ! ! !I Une fonction d’IT trop longue !

Diagramme  temporel  d'exécu3on  correcte  

Diagramme  temporel  d'exécu3on  incorrecte  

U"lisa"on    du  processeur  

Programme  >  95%  

Fonc"on  IT  <  5%  

U"lisa"on    du  processeur  

Programme  ≈  50%  

Fonc"on  IT  ≈  50%  

Diagramme  temporel  d'exécu3on  à  éviter  absolument  !!!  

U"lisa"on    du  processeur  

Programme  <  5%  

Fonc"on  IT  >  95%  

Avec  boucle  d'aAente  

Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021

Page 12: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

Mise en oeuvre des interruptions

Validation des ITsI De façon générale, pour utiliser les IT, il faut :

I Valider les IT du périphérique (ou des GPIO) qui émet l’ITI Valider la prise en compte de(s) IT par le processeurI Programmer le contrôleur d’interruptionsI Insérer la fonction d’interruption dans le programme et en

définir son contenuI Vérifier que le vecteur d’interruption est bien défini et

associé à la fonction d’interruptionI Toute la programmation se fait par configuration de

registres

Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021

Page 13: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

Contrôleur d’interruptions

Un processeur ne possède que peu de lignes d’interruption. Side nombreux périphériques (et signaux extérieurs) nécessitentl’utilisation des IT, il est nécessaire d’introduire un contrôleurd’interruptions qui gère les arrivées

Microprocesseur   Contrôleur  d'interrup2ons  

IRQ  1  

IRQ  2  

IRQ  n  

IT  

ACK  IT  

data  NMI  

IRQ  :  Interrupt  ReQuest  NMI  :  Non  masquable  Interrupt  

Fonctions du contrôleurI Etablir les priorités entre

les sources d’ITI Décharger le processeur

de la détermination de lasource

Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021

Page 14: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

Un contrôleur d’interruption NVIC

I Pour gérer toutes les interruptions matériellesI Un composant EXTI pour gérer les IT provenant d’une

source autre qu’un périphérique

Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021

Page 15: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

Application à la carte STM32

Docs à consulterI Programming manual (PM0214) - Systick (pp. 245-250) -

et NVIC (pp. 207-219)I Reference manuel (RM0390)

ProgrammationI De nombreux registres ...

Etudes de cas : IT déclenchée parI Le bouton poussoir bleuI Une horloge système période : SysTick

Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021

Page 16: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

Les vecteurs d’IT de la carte STM32

Les vecteurs d’IT sont déjà définis dans le fichier

/∗ File asm_project/src/boot/interrupts.S ∗//∗ ARM Cortex-M4 Interrupts ∗/

Interrupt_Handler NMIInterrupt_Handler HardFaultInterrupt_Handler MemManageInterrupt_Handler BusFault. . .Interrupt_Handler SysTick. . .Interrupt_Handler EXTI15_10. . .

I Ce qui indique que les handler d’IT associés sontI SysTick_HandlerI EXTI1510_Handler

Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021

Page 17: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

IT générée par le bouton poussoir

Le bouton poussoir bleu est connecté à PC13

Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021

Page 18: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

IT générée par le bouton poussoir

Contenu du mainI Valider les GPIOCI Valider le contrôleur

système SYSFIG sur lebus APB2I Utiliser pour rediriger

l’une des lignes d’entréeextérieure vers les GPIO

I Valider le bouton sur PC13I Valider les interruptions sur

PC13

main:push (lr)/∗ enable GPIOC ∗/bl enable_GPIOC

/∗ Enable SYSCFG on APB2 ∗/bl enable_SYSCFG

/∗ enable PC13 input from button ∗/bl enable_button2PC13

/∗ IRQ init from PC13 ∗/bl init_IRQ_PC13

loop:b loop

pop {pc}

Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021

Page 19: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

Description de init_IRQ_PC13 - 1

Configuration de SYSCFG pour le contrôleur EXTII EXTI13[3 :0] = 0010 pour "mapper" PC13

Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021

Page 20: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

Description de init_IRQ_PC13 - 2

Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021

Page 21: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

Description de init_IRQ_PC13 - 3

Configuration de EXTII Configuration du registre EXTI_IMR[13] = 1I Configuration du registre EXTI_RTSR[13] = 0I Configuration du registre EXTI_FTSR[13] = 1

Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021

Page 22: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

Description de init_IRQ_PC13 - 4

Configuration de EXTII Configuration du registre EXTI_PR[13] = 1

Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021

Page 23: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

Description de init_IRQ_PC13 - 5

Configuration de NVICI Les IT provenant de EXTI[15 :0] sont en position 40I Il faut donc configurer NVIC_ISER[40] = 1 (en fait

NVIC_ISER1[8] = 1)

Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021

Page 24: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

Description de init_IRQ_PC13 - 6

init_IRQ_PC13:push {lr}ldr r0,=SYSCFGldr r1,[r0,#EXTICR4]bic r1, r1, #0xF0orr r1, r1, #0x20 /∗ EXTI13 = 0b0010 (PC13) pin ∗/str r1,[r0,#EXTICR4] /∗ SYSCFG_EXTICR4 ∗/

ldr r0,=EXTIldr r1,[r0,#IMR]orr r1, r1, #(1<<13) /∗ IT PC13 non masque (MR13) ∗/str r1,[r0,#IMR] /∗ EXTI_IMR ∗/

ldr r1,[r0,#RTSR]bic r1, r1, #(1<<13) /∗ IT TR13 rising trigger disable ∗/str r1,[r0,#RTSR] /∗ EXTI_RTSR ∗/ldr r1,[r0,#FTSR]orr r1, r1, #(1<<13) /∗ IT TR13 falling trigger enable ∗/str r1,[r0,#FTSR] /∗ EXTI_FTSR ∗/ldr r1, =(1<<13) /∗ IT PR13 set to 1 ∗/str r1,[r0,#EXTIPR] /∗ clear EXTI_PR13 ∗/

Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021

Page 25: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

Description de init_IRQ_PC13 - 7

/∗ IT enable ∗//∗ EXTI15_10 is IRQ#40 ∗//∗ ISER1 (1*32), bit 8 ∗/.set ISER1,0X04

ldr r0,=NVICmov r1, #(1<<8) /∗ set bit40 of ISER (bit8 of ISER1) ∗/str r1,[r0,#ISER1]pop {pc}

Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021

Page 26: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

La fonction d’IT - EXTI15_10_Handler

Contenu - Nom et association définis dans une tableI On vérifie que l’IT provient de la ligne 13I Il faut re-valider les IT

EXTI15_10_Handler:push {r0, r1, lr}

/∗ Check if exti13 ∗/ldr r0, =EXTIldr r1,[r0,#EXTIPR]tst r1,#(1<<13)beq endHandler

/∗ Clear pending register EXTIPR[13] = 1 ∗/ldr r1, =(1<<13)str r1,[r0,#EXTIPR]. . .

endHandler:pop {r0, r1, pc}

Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021

Page 27: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

IT du Systick

I Le System Tick Timer ou SysTick est un compteur detemps (timer) intégré dans le NVIC

I Le SysTick génère une IT de façon régulière aprèsprogrammation initiale

I La fonction d’interruption associée est SysTick_Handler

I Il est très simple à programmer et à utiliser ! ! !

Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021

Page 28: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

Programmation du Systick

La documentation précise les étapes de programmationI Définir et programmer la valeur de décomptageI Supprimer la valeur de décomptage couranteI Programmer les registres de contrôle et d’état

Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021

Page 29: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

Définir et programmer la valeur de décomptage

I Le SysTick peut fonctionner à la même fréquence que leprocesseur

I La valeur à charger est le nombre de coups d’horloge

systick_init:. . .

/∗ Setup 1ms SysTick - CLK = 16 MHz ∗//∗ STK_LOAD register = 15999 ∗/

ldr r0, =SysTickldr r1, =#15999str r1, [r0, 0x04]. . .

Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021

Page 30: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

Supprimer la valeur de décomptage courante

I Le SysTick peut fonctionner à la même fréquence que leprocesseur

I La documentation précise que la valeur à charger est lenombre de coups d’horloge

systick_init:. . .

/∗ Clear current value ∗//∗ STK_VAL register = 0 ∗/

ldr r0, =SysTickldr r1, =#0str r1, [r0, 0x08]. . .

Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021

Page 31: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

Programmer le registres de contrôle

I Seuls les 3 bits de poidsfaibles nous intéressent

systick_init:. . .

/∗ Clear current value ∗//∗ STK_CRTL register = 0x07 ∗/

ldr r0, =SysTickldr r1, =#0x7str r1, [r0]. . .

Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021

Page 32: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

Programme complet utilisant le SysTick

I Ce programme ne fait rien,mais configure le SysTick

I Pas de re-validation des ITdans SysTick_Handler

main:push (lr)/∗ Setup 1ms SysTick ∗/bl systick_init

loop:b loop

pop {pc}

SysTick_Handler:push {lr}pop {pc}

systick_init:push (r0, r1, lr)ldr r1, =Systick

/∗ STK_LOAD = 15999 ∗//∗ 1ms SysTick with CLK = 16MHz ∗/ldr r0, =#15999str r0, [r1, 0x04]

/∗ Clear STK_VAL ∗/ldr r0, =#0str r0, [r1, 0x08]

/∗ STK_CTRL = 0x07 ∗/ldr r0, =#0x07str r0, [r1]

pop {r0, r1, pc}

Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021

Page 33: Microcontrôleurs I - Les interruptions : principes ...

Interruptions Programmation sur STM32F446 IT poussoir IT systick Pour aller plus loin

Pour aller plus loin

La fonction d’IT n’est pas une fonction comme les autresI Pas d’échange de paramètresI Arrivée asynchroneI Le processeur passe en mode particulier (IRQ) et certains

registres sont spécifiques (r13_irq, r14_irq, r15_irq)I Généralement, du matériel permet d’empiler d’adresse de

retour (pile d’interruption et interrupt stack pointer)I Une doc simple sur les IT (en anglais) :

http://www.iti.uni-stuttgart.de/~radetzki/Seminar06/08_report.pdf

Attention !I A l’arrivée d’une IT plus prioritaire (FIRQ, reset, ...)I A l’arrivée d’IT trop nombreuses

Microcontrôleurs I — F. Rousseau Cours 5 IESE3 S5 — 2020–2021