Aller au contenu

Interruptions matérielles

Tout changement d’état d’un périphérique se reflète dans ses registres d’état (STAT - Status Register). Pour détecter ces changements, le logiciel peut scruter ces registres via le bus µP. Cette technique fonctionne bien pour des changements périodiques ou excessivement rapides, mais requiert beaucoup de temps CPU s’ils sont sporadiques. Pour soulager le CPU et éviter ainsi la scrutation, une ligne de requêtes d’interruptions (IRQ-Line - Interrupt Request Line) permet au périphérique de signaler tous ses changements au CPU.

Ligne de requêtes d’interruptions

En activant la IRQ-Line, le CPU suspend l’exécution du programme en cours pour exécuter une routine de traitement des événements du périphérique (Interrupt Service Routine ou Interrupt Handler).

Ce mécanisme fonctionne parfaitement pour un périphérique, mais qu’en est-il pour plusieurs périphériques ? La solution se trouve dans les réponses à ces trois questions:

  • Comment connecter les périphériques au CPU ?
  • Comment identifier le périphérique ayant levé une interruption ?
  • Comment arbitrer des requêtes simultanées provenant de plusieurs périphériques ?

Trois techniques permettent de répondre à ces questions:

  • Scrutation logicielle
  • Priorité d’interruption
  • Interruption vectorisée

Scrutation logicielle

La première solution consiste à connecter tous les périphériques en parallèle sur une même ligne de requêtes d’interruptions. Cette ligne forme ainsi un “OU” câblé.

Connexion de périphériques pour la scrutation logicielle

La gestion des périphériques s’effectue grâce à leurs registres de contrôle et d’état. Ils permettent de bloquer et d’autoriser la levée d’interruptions ainsi que d’identifier le périphérique ayant levé l’interruption.

Si une interruption apparaît, le CPU suspend le programme en cours et exécute la routine de traitement d’interruptions. Cette routine interroge successivement tous les périphériques connectés sur la ligne d’interruption afin de déterminer le ou les périphériques ayant activé le signal. Cette technique se nomme scrutation logicielle (Interrupt Polling), dont voici deux implémentations principales:

  • Priorité fixe
    les périphériques sont scrutés dans un ordre précis et déterminé à l’avance (Fixed Priority). Le 1er périphérique rencontré ayant levé une interruption est servi, puis le 2e et ainsi de suite.

  • Tourniquet
    les périphériques sont ordonnés comme dans la première méthode, mais la recherche débute depuis le dernier périphérique servi (Round-Robin). La recherche recommence au début, lorsque la fin de la liste est atteinte.

La scrutation logicielle est simple à mettre en œuvre, mais peut prendre énormément de temps selon le nombre de périphériques connectés au CPU.

Cette technique est par contre couramment utilisée par des périphériques capables de lever de différentes interruptions pour signaler divers types d’événements, telles la réception et la transmission de données. Dans l’exemple ci-dessous, le périphérique lève une interruption si la condition suivante est vraie: \(\((\mathsf{TIE} \land \mathsf{TXE}) \lor (\mathsf{RIE} \land \mathsf{RXE})\)\)

Logique d’interruption d’un périphérique pour la scrutation logicielle

La routine de traitement du pilote logiciel (io_handler) distingue entre une interruption due à l’émission (TX) et/ou à la réception (RX) en testant les fanions des registres de contrôle et d’état.

void io_handler() {
    if ((io->ctrl & CTRL_TIE) && (io->stat & STAT_TXR))
        // interruption levée en émission  

    if ((io->ctrl & CTRL_RIE) && (io->stat & STAT_RXR))
        // interruption levée en réception 
}

Priorité d’interruption

Avec la deuxième solution, chaque périphérique dispose d’une ligne de requêtes d’interruptions dédiée connectée directement au CPU.

Connexion de périphériques pour la priorité d’interruption

Le CPU affecte à chacune de ces lignes de requêtes d’interruptions une priorité matérielle fixe et unique, par exemple aux lignes IRQ-Line1, IRQ-Line2 et IRQ-Line3, le CPU accorde les priorités 1, 2 et 3. Lorsqu’une ou plusieurs requêtes d’interruptions sont levées, le CPU examine les lignes de requêtes d’interruptions et détermine la ligne active la plus prioritaire afin de servir le périphérique correspondant.

Pour chaque priorité d’interruptions (Interrupt Priority), le CPU dispose d’une entrée dans sa table des vecteurs d’interruptions. Ceci permet aux pilotes logiciels d’attacher une routine de traitement propre à chaque périphérique.

Cette technique améliore grandement le traitement des interruptions, car elle élimine la scrutation logicielle des périphériques. Elle permet aussi un traitement imbriqué des interruptions et réduit la latence pour les événements les plus importants et les plus prioritaires. Cependant, elle se butte au nombre de lignes de requêtes d’interruptions que les CPU disposent, souvent qu’une ou deux lignes.

Interruption vectorisée

La troisième solution consiste à générer des interruptions vectorisées (Vectored Interrupt). Celle-ci se caractérise par la mise en œuvre d’un contrôleur d’interruptions permettant de connecter une multitude de périphériques, chacun avec une ou plusieurs lignes de requêtes d’interruptions dédiées. Il associe à chaque ligne un numéro de vecteur d’interruptions unique (Unique Interrupt Vector Number).

Connexion de périphériques pour des interruptions vectorisées

Lors de la levée d’une interruption, le contrôleur dispose d’une logique interne pour prioriser et identifier la source d’interruption. Une fois la source identifiée, le contrôleur informe le CPU. Là, il existe deux réalisations possibles d’interface entre le contrôleur et le CPU.

Avec la première interface, le contrôleur d’interruption informe le CPU en activant une ligne de requêtes d’interruptions (IRQ-Line), pour laquelle, il n’existe qu’une seule entrée dans la table des vecteurs d’interruptions. Lorsque l’interruption est levée, la routine de traitement attachée dans la table des vecteurs acquiert l’identité de la source d’interruption, le numéro de vecteur, en lisant un registre du contrôleur d’interruptions. La source connue, il appelle ensuite la routine de traitement correspondant au périphérique. Avec ce type d’interface, le logiciel effectue l’essentiel de l’identification de la source.

Avec la deuxième interface, le contrôleur d’interruption informe toujours le CPU en activant une ligne de requêtes d’interruptions (IRQ-Line). Par contre, lorsque l’interruption est levée, c’est le CPU qui acquiert l’identité de la source d’interruption, le numéro de vecteur. Il utilise ensuite ce numéro de vecteur pour appeler la routine de traitement correspondant au périphérique, laquelle a été précédemment attachée directement dans la table des vecteurs. Avec cette interface, l’essentiel de l’identification de la source d’interruption étant réalisée par le contrôleur et le CPU, le logiciel n’a plus qu’à effectuer le traitement approprié à l’événement.

Les interruptions vectorisées sont spécialement bien adaptées à un traitement imbriqué des interruptions.