Je parle de choses au niveau de base.
Autant que je sache, le noyau du contrôleur exécute simplement des instructions qui sont extraites de la mémoire (Fetch - Decode - Execute). Lorsqu'une interruption arrive, comment le noyau / ALU décide-t-il de passer à l'ISR?
Parce que nous, ou le compilateur, n'ajoutons aucune instruction pour interroger l'état de l'interruption - alors comment sait-il qu'une interruption doit être servie?
la source
CALL
instruction ordinaire , car les interruptions se terminent de manière différente (cf.RET
vs.RETI
).Généralement, dans les microcontrôleurs modernes, il existe une unité dédiée de contrôleur d'interruption (IC) chargée de gérer les interruptions. En outre , chaque composant périphérique a une sortie d' interruption (s) qui va de
0
la1
(ou vice versa) si certaines conditions sont applicables (par exemple ce périphérique terminé des travaux). Cette sortie est connectée au contrôleur d'interruption. LaCore
CPU peut dire au CI d'ignorer cette interruption spécifique (la masquer) ou d'avertir le MCU chaque fois qu'elle se produit en déclenchant des signaux spécifiques, puis le MCU décide quoi en faire. La manière courante consiste à demander à l'IC de dire à MCU quelle interruption s'est produite et de passer au code de gestion correspondant.la source
Il y a du matériel dans le cœur de l'ordinateur qui bloque une nouvelle valeur dans le compteur de programme qui correspond à l'interruption particulière qui a été déclenchée. Afin de se rappeler où revenir après la fin de la routine d'interruption, la valeur actuelle dans le compteur de programme est poussée dans la pile avant que le matériel ne bloque l'adresse d'interruption dans le compteur de programme. Lorsque la routine d'interruption est terminée, la valeur d'origine du compteur de programme est restaurée hors de la pile.
Les valeurs à bloquer dans le compteur de programmes au moment de l'interruption sont généralement déterminées par l'un des deux schémas. Une approche bloque une adresse fixe pour chaque type d'interruption dans le compteur de programmes et le cœur de l'ordinateur commence alors à s'exécuter à partir de cet emplacement fixe. L'espace à l'emplacement fixe est souvent de taille limitée, il est donc courant de coder une instruction de saut aux adresses fixes qui vont à l'emplacement réel du service d'interruption. L'autre schéma utilise quelque chose appelé une table de vecteurs d'interruption. Ici, le matériel génère un décalage d'adresse fixe dans la table vectorielle en fonction du type d'interruption. Le matériel extrait ensuite le contenu à cet emplacement de table et utilise cette valeur comme adresse pour bloquer le compteur de programmes.
la source
Le contrôleur a un registre pour le compteur de programmes qui garde une trace de l'adresse où la prochaine instruction à exécuter est stockée. (Ce registre est également écrit lorsqu'un saut est exécuté.)
Le contrôleur possède un vecteur d'interruption (ou parfois plus d'un, selon le type d'interruption), qui est l'adresse où l'ISR est stocké. Cette adresse est toujours la même - c'est comme le vecteur de réinitialisation, où le programme démarre.
(Souvent, il y a une instruction de saut stockée sur ce vecteur qui saute au code réel à exécuter, car l'espace sur le vecteur n'est pas suffisant pour stocker toute la procédure. Cependant, l'important est que l'ISR se trouve toujours au même position.)
Lorsqu'une interruption se produit, il y a du matériel dédié dans le contrôleur qui écrit le compteur de programme avec le vecteur d'interruption. Ensuite, lorsque le contrôleur atteint le cycle d'instruction suivant, il récupère l'instruction à partir de l'adresse pointée par le compteur de programme (donc, le vecteur d'interruption).
(Dans un cycle d'instructions du contrôleur, il effectue différentes tâches: il récupère l'instruction suivante à partir de l'adresse indiquée par le compteur de programmes; il augmente le compteur de programmes; il décode l'instruction et l'exécute.)
la source