A.P.C.

Le contrôleur d’interruption et les IRQs

 

 

Le contrôleur d’interruption programmable ou PIC  (PIC 8259A) est un petit circuit intégré se trouvant entre le CPU et les périphériques, permettant de séparer davantage le CPU et l’électronique. Dès qu’un périphérique « externe » à l’ordinateur veut émettre des données, prévenir un programme qu’une action est terminée, demande à un programme des données, il lui suffit d’envoyer une requête à ce PIC qui se chargera de prévenir le CPU que « quelqu’un veut prendre la parole ». Enfin, le CPU (ou un programme) répondra à cette requête.

Prenons un exemple : le clavier. Dès que vous tapez sur une touche, le clavier « demande la parole » en passant par le PIC. Le PIC déclenche une interruption, et celle-ci ira lire le registre du clavier pour aller retirer le caractère. En ce qui concerne de l’écriture de données sur une disquette, après avoir tout programmé et envoyé les premières données à écrire, le lecteur de disquette déclenchera, par l’intermédiaire du PIC, une interruption qui permettra d’avertir que l’écriture est finie et que l’on peut recharger la mémoire pour continuer d’écrire des données sur celle-ci.

 

Les ordinateurs AT, contrairement au PC/XT, disposent de deux PICs connectés en cascade pour avoir à disposition 16 interruptions. Etant connecté en cascade, l’un sera le maître, et l’autre l’esclave Voici le détail des 16 interruptions avec les périphériques qui y sont généralement attachés :

 

Interruption

Maître

Esclave

Périphérique

0 (la plus forte)

IRQ0

 

Timer

1

IRQ1

 

Clavier

2

IRQ2

 

2ème contrôleur d’interruption programmable (car PICs montés en cascade)

3

IRQ3

 

2ème interface série

4

IRQ4

 

1ère interface série

5

IRQ5

 

2ème interface parallèle ou carte son

6

IRQ6

 

Lecteur de disquettes

7

IRQ7

 

1ère interface parallèle

8

 

IRQ0

Horloge temps réel

9

 

IRQ1

Libre

10

 

IRQ2

Libre (par exemple pour USB)

11

 

IRQ3

Libre (par exemple lecteur de CD-ROM)

12

 

IRQ4

Souris PS/2

13

 

IRQ5

Coprocesseur arithmétique

14

 

IRQ6

Disque dur

15 (la plus faible)

 

IRQ7

Libre (par exemple second disque dur)

 

 

Il faut savoir que le PIC ne peut gérer qu’une interruption à la fois. Tant qu’une interruption n’a pas été terminée, toutes les autres requêtes d’interruptions sont en attente. Dès que le gestionnaire d’interruption à fini son travail, il envoie un code nommé EOI au PIC (End Of Interrupt). Enfin, le PIC peut générer une autre interruption qui était en attente. Si 2 requêtes d’interruption arrivent en même temps, il faut savoir qu’il y en a un qui est plus prioritaire que l’autre. Plus le numéro d’interruption est près du zéro, plus l’interruption est prioritaire. Donc, plus le numéro d’interruption est près de 15, moins l’interruption est prioritaire.

 

 

Maintenant, nous allons voir la programmation des PICs.

Il faut savoir que l’on communique avec le PIC, par l’intermédiaire de 2 ports uniquement : ports 20H et 21H pour le maître et 0A0H, 0A1H pour l’esclave.

Il y a deux types de commandes que l’on peut adresser au PIC : les OCW et ICW (Operational Command Words, Initialization Command Words). Normalement, vous n’avez pas besoin d’initialiser le PIC, car le BIOS le fait pour vous au démarrage du système. De plus, une mauvaise programmation des PICs peut entraîner le plantage du système. Mais, je vais quand même vous expliquer l’initialisation des PICs, en vous donnant les valeurs qu’utilise le BIOS.

A la différence des OCW, vous devez envoyer les ICW dans un ordre bien précis.

 

 

ICW :

 

En général, vous n’avez absolument pas besoin de réinitialiser le PIC, car le BIOS le fait à chaque fois que vous allumez votre système. Cependant, l’initialisation est intéressante dans le fait où vous pouvez modifier les numéros de base des gestionnaires d’interruptions (cf. ICW2), chose que vous aurez besoin de faire si vous passez en mode protégé (cf. tutoriel sur le mode protégé)

 

Pour commencer, vous devez d’abord envoyer ICW1 sur le premier port du PIC, soit 20H (maître) ou 0A0H (esclave).

7   6   5   4   3   2   1   0

 
 

 

 

 

 

 

 

 

 

 

 

 

 

 


Le premier bit concerne ICW4. Quand vous vous lancez dans l’initialisation d’un des PICs, vous devez obligatoirement envoyer ICW1, ICW2 et ensuite ICW3. Cependant, en mettant ce bit à un, vous indiquez au PIC que vous enverrez ICW4 juste après ICW3 ; sinon, pour ne pas l’envoyer, il suffit de le mettre à 0. Le deuxième bit permet d’indiquer au PIC s’il y a un ou deux PICs. Les PC/XT n’existant quasiment plus, ce bit doit se trouver à 0 car sur les AT, il y a deux PICs. Le quatrième bit (3) montre au PIC la manière dont les lignes d’interruption IR0 à IR7 sont activées. Les sources d’interruption demandent une interruption via ces lignes. L’opération se déroule en revanche en mode attaque dans un environnement PC (bit 3 = 0). Cela veut dire qu’une source d’interruption met momentanément sa ligne IR sur high pour la passer ensuite sur low pour informer le PIC de sa demande. En mode palier, la source d’interruption laisse sa ligne sur high ce qui provoque l’exécution ininterrompue de l’interruption concernée jusqu’à ce que la source remette la ligne sur low. En général, on utilise le mode attaque (bit = 0)

Le BIOS utilise la valeur00010001b pour initialiser ICW1 pour le maître et l’esclave. Autrement, dit, l’envoie de ICW4 à lieu, l’existence de PIC en cascade est vérifiée et l’opération se déroule en mode attaque.

 

7   6   5   4   3   2   1   0

 
 

 

 

 

 

 

 

 


ICW2, qui fait suite à ICW1 indique au PIC le numéro d’interruption de base. Soit x un numéro d’IRQ entre 0 et 7. x fait une requête d’interruption au PIC. Le PIC va donc exécuter un gestionnaire d’interruption. Pour trouver le numéro d’interruption à déclencher, il prend ce nombre, et y ajoute x. Le tout donne le numéro d’interruption pour x. Le BIOS fixe cette valeur à 08H pour le maître et 70H pour l’esclave. Donc les interruptions hardware vont de 08H à 0FH et de 70H à 77H. Cependant, il faut savoir que vous ne pouvez pas donner n’importe quel numéro d’interruption, mais seulement un numéro où les 3 premiers bits sont à 0.

Il faut envoyer cette valeur sur le port 21H ou 0A1H, et ce sera de même pour ICW3 et ICW4 (si vous devez l’envoyer).

 

 

 

 

 

 

 

 

 

ICW3 qui suit ICW2 ne doit être envoyé au PIC que s’il est relié en cascade avec l’autre PIC. Il attend cette commande que si le bit 1 de ICW1 se trouvait à 1. a l’envoie de ICW3, il y a une distinction à savoir si vous êtes en train de programmer le maître ou l’esclave. L’octet se construit différemment.

 

Pour le maître :

7   6   5   4   3   2   1   0

 
 

 

 

 

 

 

 

 

 

 

 

 


Cette commande permet d’indiquer au maître par quelle ligne d’interruption l’esclave est-il relié au maître. Comme dans les AT, ils sont reliés par l’intermédiaire de l’IRQ2, le BIOS envoie la valeur 00000100b soit 4H ( sur le port 21H)

 

 

 

 

Pour l’esclave :

 

 

 

 

 

 

 

 


Cette commande permet d’indiquer à l’esclave par quelle ligne d’interruption il est relié au maître. Dans les AT, ils sont reliés par l’intermédiaire de l’IRQ2, donc le BIOS envoie 2 comme valeur (au port 0A1H).

 

 

 

 

 

 

 

 

 

 


ICW4 informe donc le PIC s’il fonctionne dans un environnement Intel, et s’il doit enregistrer automatiquement la fin d’une Interruption ou bien s’il doit demander l’aide d’un logiciel. En général, c’est la méthode manuelle qui est appliquée dans les PC, soit bit1 = 0. Cela entraîne de fortes implications pour le gestionnaire d’interruption, sujet que j’aborderais à la fin de ce tutoriel.

 

 

 

OCW :

 

Maintenant, nous allons passer de l’initialisation du PIC à la « programmation » du PIC, chose que vous utiliserez nettement plus souvent que l’initialisation.

Contrairement à l’initialisation du PIC, vous pouvez envoyer chaque ordre, indifféremment, dans n’importe quel ordre.

 

7   6   5   4   3   2   1   0

 
 

 

 

 

 

 

 

 

 

 

 

 


L’envoie de OCW1 se fait sur le second port (20H ou 0A1H). Il permet d’activer ou de désactiver les lignes d’interruptions. En général, ce registre se trouve à 0, autorisant toutes les interruptions. A la différence des autres registres, vous pouvez lire son état en faisant une lecture sur le second port (21H ou 0A1H)

 

Remarque :

La fonction « STI » met la valeur 11111111b dans ce registre, interdisant toute interruption de type hardware. Par contre, la fonction « CLI » met la valeur 0 dans ce registre pour activer toutes les interruptions.

 

7   6   5   4   3   2   1   0

 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


Comme les PICs ont été programmés en mode EOI manuel, OCW2 permet de finir une interruption, soit envoyer ce fameux code EOI. Pour ce faire, il vous suffit d’envoyer la valeur 00100000b soit 20h sur le premier port : 20H ou 0A0H. Les autres fonctions ne sont pas très utiles, et n’ont pas trop d’utilité dans un ordinateur.

 

 

 

 

 

 

 

 

 

 

 

 

 

 


OCW3 permet à un programme de lire les registres internes nommés IRR et ISR du PIC. La commande doit être envoyée sur le premier port du PIC, tout comme OCW2 : les bits 3 et 4 permettant de les distinguer. Après l’accès en écriture sur le  premier port, le registre souhaité peut être demandé à l’étape suivante via un accès en lecture sur le port. Dans ce contexte, un programme peut servir à déterminer le gestionnaire d’interruption en cours d’exécution et celui qui attend son tour.

Le mode polling n’est pas utilisable dans un environnement PC.

 

 

 

Finir un gestionnaire d’interruption :

 

Dès que le gestionnaire d’interruption à fini sa tâche, il doit en avertir le ou les PICs, en envoyant le code EOI. Comme j’expliquais plus haut, on se sert de OCW2. Mais attention : si c’est un gestionnaire pour un IRQ de l’esclave, vous devez IMPERATIVEMENT envoyer la commande EOI à l’esclave en premier, c’est à dire : envoyer le code 20H à l’adresse 0A1H. Ensuite, vous devez OBLIGATOIREMENT envoyer un code EOI au PIC, soit envoyer le code 20H au port 21H. Si c’est le gestionnaire de l’IRQ du maître, il vous suffit seulement d’envoyer le code EOI au maître.

Si le gestionnaire envoie mal ces codes ou ne les envoie pas du tout, le PIC croira que le gestionnaire d’interruption n’a pas fini sa tâche, et le PIC ne pourra exécuter d’autres interruptions qui seront en attente.

Conclusion : le système sera planté car tous les périphériques « externes » ne pourront déclencher leur gestionnaire d’interruption.

 

 

 

Programme d’exemple :

Pour illustrer cette leçon, je vous propose un petit programme qui ne sert pas trop à grand chose, seulement à illustrer le fonctionnement des PICs. Il programme le PIC de façon à autoriser l’interruption du timer (IRQ0), puis crée un nouveau gestionnaire d’interruption qui affichera un symbole en haut à gauche de votre écran qui changera au rythme du timer.

 

Gestionnaire de Timer

 

 

Des questions …

 

Cette leçon a été nettement abrégée, car elle aurait été trop longue, vous n’auriez pas compris, et cela vous aurait ennuyé. Je ne vous ai expliqué que le strict minimum. C’est pourquoi, si vous voulez avoir de plus amples informations sur ce sujet, il vous suffit de nous envoyer un mail, et je répondrais volontiers à votre (vos) question(s). Cette leçon est un peu difficile, et je comprendrais aussi très bien que vous ne compreniez pas quelque chose, alors une chose a faire pour vous : nous écrire, en nous expliquant ce que vous n’avez pas compris. Je vous expliquerais en plus détaillé, et de façon plus compréhensive.

Nous envoyer un Mail …

 

 

Aurélien

 

 

Retour au menu précédent

 

Dernière modification de cette page : 10/09/2000