10. Les interruptions

publicité
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
Téléchargement