Chap. 10 Interruptions Mounir Boukadoum Traduit et adapté de l’anglais sources anglaises Programmes et pilotes de périphériques Traduit et adapté de l’anglais sources anglaises 1 Principe général d’une interruption • Arrêt temporaire de l'exécution d'un programme, suite à un évènement logiciel ou matériel, afin d'exécuter un sous‐programme dont l’adresse dépend du type d’évènement • L’exécution du sous‐programme se termine par la restauration de l'état sauvé du CPU qui repart de l'endroit où il a été interrompu. • Différence avec un sous programme conventionnel : – L’adresse du saut est prédéfinie – Certains registres sont sauvés automatiquement lors du saut et remis en état au retour Traduit et adapté de l’anglais sources anglaises Exemples d’évènements sources d’interruptions Déplacement de souris Entrée de caractère au clavier Secteur de disque défectueux Compte terminal d’un temporisateur Disfonctionnement de l’imprimante Accès de la carte vidéo vers la mémoire Emission et réception par le Modem Faute d’accès en mémoire Lecture d’un code d’instruction inconnu Etc. Traduit et adapté de l’anglais sources anglaises 2 Buts d’utilisation • Gestion de conditions d’exception • Communication non bloquante avec des périphériques externes – Communication sans délais d’attente qui mène souvent à une économie d’énergie en mettant le CPU dans un état dormant au lieu de tourner dans une boucle d’attente. • Appels de service et commutation de tâches dans un système géré par un programme d’exploitation Traduit et adapté de l’anglais sources anglaises Deux types fondamentaux d’interruptions • Logicielle – L’instruction SWI détourne le programme vers un autre programme (e.g. service du système d’exploitation) • Matérielle – Un signal interne du CPU ou une ligne externe détourne le programme vers un autre programme (e.g. pilote de périphérique) • Permet la synchronisation sans passer par une boucle d’attente. • Celles en provenance d’une horloge peuvent permettre la répartition des tâches dans un système multitâches ou multi‐ usager Traduit et adapté de l’anglais sources anglaises 3 Branchement de sources mutiples Ligne de requête externe commune Lignes individuelles à drain/collecteur ouvert Traduit et adapté de l’anglais sources anglaises Processus général d’interruption IRQ • Les étapes avant et après l’exécution de la routine de réponse à l’interruption introduisent des délais qui s’ajoutent au temps de réponse – Effet limitatif sur le nombre de sources en temps‐réel • Les sources ont des priorités fixes ou programmables – Blocage de sources de moindre priorité par d’autres de priorité plus élevée Traduit et adapté de l’anglais sources anglaises 4 Adresses des routines de réponse • Appelées vecteurs • Emmagasinées dans une table • Les priorité sont établies par la position dans la table Ex. Vecteurs d’interruption normaux du 68HC11 et bits de commande associés adresse source d’IRQ Bit CCR Bit spécifique adresse source d’IRQ bit du CCR Bit de gestion 0xffc0-d5 Réservés - - 0xffea-b IC3 I IC3I 0xffd6-7 SCI I RIE, TIE, TCIE, ILIE 0xffec-d IC2 I IC2I 0xffd8-9 SPI I SPIE 0xffee-f IC1 I IC1I 0xffda-b PA I PAII 0xfff0-1 RTI I RTII 0xffdc-d PA OFLW I PAOVI 0xfff2-3 IRQ I - 0xffde-f TIMER I TOI 0xfff4-5 XIRQ X - 0xffe0-1 IC4/OC5 I I4/O5I 0xfff6-7 SWI - - 0xffe2-3 OC4 I OC4I 0xfff8-9 Ill. Opcode - - 0xffe4-5 OC3 I OC3I 0xfffa-b COP - NOCOP 0xffe6-7 OC2 I OC2I 0xfffc-d CLK mon. - - 0xffe8-9 OC1 I OC1I 0xfffe-f RESET - - Traduit et adapté de l’anglais sources anglaises Traduit et adapté de l’anglais sources anglaises Monjy Rabemanantsoa 10 5 Les interruptions dans ARM • Correspondent à trois types d’évènements – Les déroutements ou erreurs d’exécution; par exemple, un code d’instruction invalide – Les interruptions externes; par exemple, des évènements externes impromptus – Les appels de type système • Les 3 occurrences correspondent à 7 entrées d’un tableau contenant les adresses des routines associées • On peut aussi raisonner en termes d’exceptions: – Synchrones : arrêts causés par des situations d’exception lors de l’exécution d’un programme – Asynchrones : dues à des sources externes au programme Traduit et adapté de l’anglais sources anglaises Sources d’interruption dans un processeur ARM Traduit et adapté de l’anglais sources anglaises 6 Mécanisme d’une exception ARM Traduit et adapté de l’anglais sources anglaises Interruptions logicielles • Causent l’interruption de la séquence d’exécution normale avec l’instruction SWI • Souvent utilisées pour des tâches auxiliaires ou un appel au système d’exploitation Traduit et adapté de l’anglais sources anglaises 7 • Les Types de SWI en ARM – – – – SWI_WriteC (SWI 0) SWI_Write0(SWI 2) SWI_ReadC(SWI 4) SWI_Exit(SWI 0x11) : écrit un octet sur le canal Debug : envoie un caractère Null vers debug : lit un octet à partir du canal Debug : “Halt emulation” ‐> sortie de programme – SWI_EnterOS(SWI 0x16) : mode superviseur – SWI_Clock(SWI 0x61) : Compteur de secondes/100 – SWI_Time(SWI 0x63) : retourne les nombres de secondes Traduit et adapté de l’anglais sources anglaises Où aller précisément ? • L’exécution de SWI mène à l’adresse 0x08 qui pointe vers le sous programme d’interruption • L’argument de SWI spécifie la fonction finale Table des sauts Programme de l’usager ADD r0,r0,r1 SWI 0x10 SUB r2,r2,r0 Commence à l’adresse 0x00 en mémoire 0x00 to R_Handler (Reset 0x04 to U_Handler (Undef instr.) 0x08 to S_Handler (SWI) 0x0c to P_Handler (Prefetch abort) 0x10 to D_Handler (Data abort) 0x14 ... (Reserved) 0x18 to I_Handler (IRQ) 0x1c to F_Handler (FIQ) Code SWI (S_Handler) Gérer les différents identificateurs de l’appel … MOVS pc, lr Traduit et adapté de l’anglais sources anglaises 8 Où aller précisément ? Étapes d’exécution : 1 (1) copie CPSR dans SPSR_SVC (2) Change les bits du mode d’opération dans CPSR à superviseur (3) Bloque d’autres interruptions (bit IRQ dans CPSR) (4) Emmagasine la valeur (PC+4) dans LR_SVC (5) Charge le PC avec l’adresse 0x08 Programme de l’usager ADD SWI SUB cond 1 1 1 1 « commentaire » de 24 bits = 0x10 Table des sauts 2 r0,r0,r1 0x10 r2,r2,r0 Code pour SWI 0x10 : 0x00 0x04 0x08 0x0c 0x10 0x14 0x18 0x1c to to to to to R_Handler U_Handler S_Handler P_Handler D_Handler ... to I_Handler to F_Handler 3 (Reset Code SWI (S_Handler) (Undef instr.) (SWI) LDR r0,[lr,#4] (Prefetch abort) BIC r0,r0,#0xff000000 (Data abort) switch (r0){ (Reserved) case 0x00: service_SWI1(); (IRQ) case 0x01: service_SWI2(); case 0x02: service_SWI3(); (FIQ) … } MOVS pc, lr MOVS restaure le CPSR original en plus de mettre à jour le PC 4 Traduit et adapté de l’anglais sources anglaises Interruptions matérielles • Deux types : – Non masquables • Ne peuvent être bloquées par logiciel : NMI, Reset, codes illégaux, fréquence d’horloge trop basse, chien de garde, tension d’alimentation anormale – Masquables : • Peuvent être bloquées par un bit du CPSR • Représentent la majorité des source d’interruption : périphériques internes, périphériques externes utilisant les lignes externes IRQ et FIQ Traduit et adapté de l’anglais sources anglaises 9 Adresses et registres associés • Table des vecteurs – Région réservée située à la fin de l’espace mémoire – Un mot d’adresse pour chaque type d’interruption • Processus de gestion – Le mode de fonctionnement passe de user à un autre mode qui dépend de la source d’instruction – Chaque routine d’interruption a ses propres registres, dont : • r13 = stack pointer • r14 = link register • SPSR (Saved Program Status Register) – Les autres registres doivent êtres sauvés à l’entrée et remis en état à la sortie si utilisés Traduit et adapté de l’anglais sources anglaises Traduit et adapté de l’anglais sources anglaises 10 Cas de deux ou plusieurs interruptions simultanées • Un mécanisme d’arbitration est requis (e.g. NVIC) Traduit et adapté de l’anglais sources anglaises Autorisation et opérations 31 30 29 28 27 N Z C V … 8 7 I 6 F 5 4 3 2 1 0 M4 M3 M2 M1 M0 • C/S Program Status Register • Pour bloquer l’une des interruptions, on met le bit correspondant (F ou I à 1) • Au début d’une interruption, le processeur accomplit les tâches suivantes : • • • • • • Commute les registres concernés Copie CPSR et SPSR_mode (sauve le mode courant mode, les sémaphores, etc.) Modifie les de mode du CPSR (M[4:0]) Bloque les nouvelles interruptions Copie PC le dans R14_mode (pour mémoriser l’adresse de retour) Charge le PC avec le vecteur d'adresse de la routine d’interruption • La routine de service doit remettre à zéro la source de l’interruption! Traduit et adapté de l’anglais sources anglaises 11 Réponse à un IRQ ou FIQ • Pour un IRQ, si le bit I du CPSR est à 0 : – l’instruction en cours est complétée et le processeur ARM : • Sauve l’adresse de la prochaine instruction, plus 4, dans r14_irq • Sauve CPSR dans SPSR_irq • Force les bits de mode M[4:0] de CPSR à la valeur 10010 – Le CPU entre en mode IRQ et met le bit I à 1 pour bloquer de nouveaux IRQ • Pour un FIQ, si le bit F du CPSR est à 0 : – l’instruction en cours est complétée et le processeur ARM : • Sauve l’adresse de la prochaine instruction, plus 4, dans r14_fiq • Force les bits de mode M[4:0] de CPSR à 10001 (binaire) – Le CPU entre en mode FIQ et met les bits I et F á 1 pour bloquer de nouveaux IRQ et FIQ Traduit et adapté de l’anglais sources anglaises IRQ vs. FIQ • Les deux sont des lignes matérielles externes actives‐bas. • FIQ possède une priorité plus grande que IRQ – En cas d’interruptions simultanées, FIQ passe en premier – La réponse au FIQ bloque IRQ à moins de les rétablir explicitement dans la routine d’interruption • En quoi les FIQs sont plus rapides? – Il ont 5 registres supplémentaire à leur disposition, pouvant servir de mémoires de statut entre les FIQs – Le vecteur du FIQ occupe la dernière adresse dans la table des vecteur d’interruption • La routine du FIQ peut être placée à cet endroit et s’exécuter à partir de là. • Dans les systèmes à mémoire cache, le vecteur et la routine se retrouvent dans le même bloc en mémoire. Traduit et adapté de l’anglais sources anglaises 12 Routine d’interruption • À la réception d’une interruption, le processeur saute vers une routine d’interruption time Task user program user program IRQ Interrupt handler IRQ FIQ • Le processeur met le bit correspondant dans CPSR à 1 et bloque les nouvelles interruptions du même type ou de types inférieurs. • Mais les interruptions de plus haut niveau peuvent toujours avoir lieu Interrupt Traduit et adapté de l’anglais sources anglaises Interruptions imbriquées/réentrantes • Interruptions ayant lieu alors que le traitement d’une interruption est en cours Task IRQ time user program user program IRQ Interrupt handler FIQ Interrupt handler FIQ Interrupt Second Interrupt • Le processeur met le bit correspondant dans CPSR à 1 et bloque les nouvelles interruptions du même type ou de types inférieurs. • Mais les interruptions de plus haut niveau peuvent toujours avoir lieu. Traduit et adapté de l’anglais sources anglaises 13 Aspects temporels • Avant qu’une routine d’interruption puisse accomplir sa tâche, elle doit d'abord sauver les registre qu’elle va modifier; à la sortie, elle doit les remettre en état – Latence introduite dans la réponse • FIQ est avantageux à cet égard Task user program time cpu context saved user program IRQ “servicing” interrupt FIQ cpu context restored Interrupt latency Interrupt Interrupt response Traduit et adapté de l’anglais sources anglaises Mécanismes de branchement à la routine d’interruption • Vecteur automatique – Le processeur détermine l’adresse de la routine selon le type d’irq • Mécanisme de base de la plupart des processeurs, dont ARM • Vecteur fourni – La source d’interruption fournit l’adresse ou une partie de l’adresse • Souvent géré par un boîtier auxiliaire (e.g., contrôleur NVIC de ARM) • Différences entre mécanismes – Si des sources multiples déclenchent un même IRQ, le processeur doit les scruter individuellement pour savoir quoi faire. • Peut demander du temps dans un système à vecteur automatique – Dans un système à vecteur programmé, l’adresse est déterminée automatiquement par la source qui la met dans le bus d’adresses au moment opportun. Traduit et adapté de l’anglais sources anglaises 14 Traduit et adapté de l’anglais sources anglaises • Exemple de code pour les « Handler » • IRQ_Handler: STMFD sp!, {r0‐r12,lr} @ début : stocker Regs. BL ISR_IRQ @ Second niveau du handler SUB lr, lr, #4 @ sortie: retour à l’adr.initiale LDMFD sp!, {r0‐r12,pc} @ fin: restaure Reg et retourner • FIQ_Handler: SUB lr, lr, #4 @ début: calculater adr.de retour STMFD sp!, {r0‐r7,lr} @ entrée Handler: stocker Regs. @ Emplacement pour les évènements FIQ … LDMFD sp!, {r0‐r7,pc} @fin: restaure Reg et retourner. Traduit et adapté de l’anglais sources anglaises Monjy Rabemanantsoa 30 15 Traduit et adapté de l’anglais sources anglaises Écriture d’une routine de service • Demande l’usage d’une directive de déclaration de fonction spéciale (e.g. __irq) – Sauve automatiquement les registres concernés – Les remet en état à la sortie Traduit et adapté de l’anglais sources anglaises 16 Décodage d’une touche de clavier avec filtrage anti rebond Clavier_Touche: { Attendre que le clavier devienne actif ; Identifier touche; Attendre la fin du délai de rebondissement et vérifier que la même touche est toujours enfoncée; Attendre que le clavier devienne inactif; Attendre la fin du délai de rebondissement et vérifier que le clavier est toujours inactif; retourner les coordonnées de la touche dans l’affirmative; } Traduit et adapté de l’anglais sources anglaises Solution avec interruptions code principal : { ... compteur d’étapes = 0 ; indicateur de touche pesée = 0 ; temporisateur programmé en mode irq pour des intervalles récurrents de 10 ms ; interruptions du temporisateur autorisées interruptions du processeur autorisées ... Tant que (1) { Si indicateur de touche pesée =1 { Récupérer le code Indicateur de touche pesée=0 .... } sinon .... } } Traduit et adapté de l’anglais sources anglaises 17 Solution avec interruptions Routine d’interruption du temporisateur : { Si compteur d’étapes=0 { Lire le clavier Si touche enfoncée, incrémenter le compteur d’étapes } Si compteur d’étapes=1 { Lire le clavier Si touche toujours enfoncée, { Sauver le code incrémenter le compteur d’étapes } sinon compteur d’étapes=0 } Si compteur d’étapes=2 { Lire le clavier Si touche relâchée, incrémenter le compteur d’étapes } Si compteur d’étapes=3 { Lire le clavier Si touche toujours relâchée { Compteur d’étapes =0 Indicateur de touche pesée=1 } } Traduit et adapté de l’anglais sources anglaises 18