Comment le contrôleur sait-il quand passer à l'ISR?


12

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?

Réponses:


13

Ce qui vous manque, c'est que le noyau fait plus que simplement exécuter des opcodes extraits de la mémoire. Il a une logique spécifique pour implémenter les interruptions.

Lorsque le matériel de détection d'interruption affirme le signal qui indique qu'il est temps de prendre une interruption, une instruction spéciale est généralement bloquée dans le cœur qui n'a jamais été extraite de la mémoire. Dans la plupart des cas, il s'agit d'une instruction CALL à l'adresse du vecteur d'interruption. Celui-ci utilise le mécanisme d'exécution d'instructions existant pour enregistrer le PC actuel sur la pile d'appels et le changer en adresse vectorielle d'interruption. Il traite également de la suppression des instructions prélues et similaires.

La logique de prise d'interruption spéciale doit également désactiver les interruptions de telle manière que la même condition d'interruption ne provoque pas un autre appel à l'adresse du vecteur d'interruption au cycle suivant. Différents processeurs ont différentes manières de gérer cela. Le plus simple est de désactiver simplement les interruptions de manière globale, ce qui nécessite que le logiciel les réactive à la fin de la routine de service d'interruption. D'autres processeurs ont un niveau de priorité d'interruption. Ce niveau est augmenté de sorte que seules les conditions d'interruption de priorité supérieure peuvent provoquer une nouvelle interruption. La priorité d'interruption est alors quelque chose qui est automatiquement enregistrée avec l'adresse de retour CALL, et restaurée lorsque le code revient de l'interruption.


1
Souvent, ce n'est pas une CALLinstruction ordinaire , car les interruptions se terminent de manière différente (cf. RETvs. RETI).
glglgl

1
Puis-je supposer en toute sécurité que lorsque ce matériel de détection d'interruption affirme le signal, au lieu de la mémoire, le processeur reçoit des instructions d'un autre endroit pour sauter ... Comme un commutateur peut-être ... , Exécutez cette instruction?
Swanand

3

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 0la 1(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. La CoreCPU 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.


2

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.


2

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.)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.