31 0 811KB
Chapitre 3
Interruptions Sommaire 3.1
Notion d'interruption . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.2
Système d'interruptions hiérarchisées . . . . . . . . . . . . . . . . . . . . 45
3.3
Causes d'interruption . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.4
Mécanisme d'interruption . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.5
Le PIC 8259 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.6
Gestion des Entrées-Sorties par interruption . . . . . . . . . . . . . . . . 54
3.7
Interruptions Logicielles . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
3.8
La programmation des interruptions . . . . . . . . . . . . . . . . . . . . . 56
3.1 Notion d'interruption Dénition 3.1 (Interruption). Une interruption est un signal déclenché par un événement in-
terne à la machine ou externe (envoyé au microprocesseur par un périphérique ou un programme) pour l'avertir d'un évènement à traiter. Le microprocesseur suspend alors l'éxécution en cours à la n de l' opération courante pour réagir à cet évènement et le traiter (le plus souvent, éxécution d'une routine ). Une fois la tâche eectuée, il reprend le cours normal de ses opérations à l' endroit où il avait été interrompu. ■ La plupart des fonctionnalités incluses dans un PC sont physiquement supportées par des composants autres que le microprocesseur. Par exemple, la communication série est assurée par un UART 16550 (situé dans un ASIC sur la carte mère), ou bien le clavier est controlé par un microcontrolleur de type 8042. Puisque chaque périphérique (ici interne) travaille individuellement, il est nécessaire de synchroniser toutes leurs opérations, notamment leurs échanges avec le microprocesseur. Une solution pour ce dernier, consiste à interroger relativement fréquemment l'état de chaque composant. Il s'agit de la scrutation ou polling. 43
CM_InfoIndus:version du mardi 25 octobre 2005 à 3 h 15
Chapitre 3. Interruptions
gure 3.1: Scrutation Cette méthode est (évidemment) coûteuse en temps et possède pour inconvénient majeur de monopoliser le microprocesseur (qui n'a plus de temps à consacrer à ses autres activités). De plus, lorsque le ot des données est élevé, le microprocesseur peut perdre certaines données.
3.1.1 Interruption matérielle et logicielle L'attitude préférable consiste à donner la responsabilité à chaque composant d'avertir (on dit notier ) le microprocesseur en attirant son attention sur la tâche à eectuer en priorité. Il s'agit du mécanisme (asynchrone) d'interruption. Le périphérique envoie un signal électrique via une patte spécique du PIC (Program Interrupt Controller : 8259) qui agit ici comme un intermédiaire entre le périphérique et le microprocesseur. Dans le cas où le PIC alerte le microprocesseur, ce dernier stoppe son activité courante et saute (on dit qu'il sedéroute ) vers une fonction spécique à executer (Interrupt Handler : traitant d'interruption) qui a été associée au préalable au périphérique (plus précisément, associée au vecteur d'interruption du périphérique). Ce type d'interruption est appelée Interruption Matérielle.
gure 3.2: Interruption Une alternative consiste à utiliser des interruptions appelées logicielles. Elle possèdent la particularité d'être synchrones. En eet, elles sont générées par le microprocesseur lorsqu'il rencontre une instruction de type INT. Ce type d'interruption est plutôt utilisé par le système d'exploitation. Certaines interruptions logicielles sont appelées exceptions (fault, trap and abort). Elles sont générées par le microprocesseur en présence d'une erreur critique interne. En résumé, on distingue : les interruptions (hardware) internes dites processeur : protection du système et des processus, appelées par une instruction à l'intérieur d'un programme (overow, erreur d'adressage, code opération inexistant, problème de parité . . . ) ; les interruptions (software) dites logicielles : permet à un processus utilisateur de faire un appel au système. Elles sont produites par l'instruction INT n où "n" est le type de l'interruption. les interruptions (hardware) externes dites matérielles déclenchées par une unité électronique (lecteur, clavier, canal, contrôleur de périphérique, panne de courant, . . . ) ou par l'horloge. Elles sont produites par l'activation des lignes INTR et NMI du microprocesseur. 44
CM_InfoIndus:version du mardi 25 octobre 2005 à 3 h 15
3.2. Système d'interruptions hiérarchisées
3.2 Système d'interruptions hiérarchisées A chaque interruption, est associée une priorité (système d'interruptions hiérarchisées) qui permet de regrouper les interruptions en classes. Chaque classe est caractérisée par un degré d'urgence d'exécution de son programme d'interruption. Règle : Une interruption de priorité j est plus prioritaire qu'une interruption de niveau i si j > i. L'intérêt de ce système est la solution de problèmes tels que : arrivée de plusieurs signaux d'interruption pendant l'exécution d'une instruction, arrivée d'un signal d'interruption pendant l'exécution du signal de traitement d'une interruption précédente. On peut utiliser un contrôleur d'interruptions pour regrouper les ls d'interruptions, gérer les priorités entre les interruptions et donner les éléments de calcul d'adresse au processeur. Remarque 3.1 (NMI). Certaines interruptions présentent tellement d'importance qu'il ne doit pas être possible d'interrompre leur traitement. On masquera alors les autres interruptions pour empêcher leur prise en compte. Certaines interruptions sont nonmasquables (Non Maskable IRQ) : on les prend obligatoirement en compte. Une interruption masquée n'est pas ignorée : elle est prise en compte dès qu'elle est démasquée. Au contraire, une interruption peutêtre désarmée : elle sera ignorée. Par défaut, les interruptions sont évidemment armées. ■ c'est dans les applications temps réel (conduite de processus industriels ou d'acquisition de données) que l'on trouve les systèmes d'interruptions les plus élaborés. Dans certains cas chaque niveau est découpé en sous-niveaux de priorités diérentes. Un bon système doit permettre au programmeur de pouvoir : activer/invalider le système d'interruption dans son ensemble ; armer/désarmer chacune des interruptions individuellement : une interruption désarmée est ignorée ; masquer/démasquer individuellement chaque interruption : une interruption masquée n'est pas ignorée, elle est mémorisée, mais elle n'est prise en compte que lorsqu'elle est démasquée ; établir une hiérarchie entre les sources d'interruption avec plusieurs niveaux de priorité, si possible de façon dynamique ; associer un programme spécique à chaque interruption.
Exemple : Priorités et NMI Imaginons que vous soyez en train d'étudier votre cours. Un camarade arrive pour vous demander un renseignement. Vous terminez la lecture de la phrase en cours, vous mémorisez mentalement où reprendre votre lecture, puis vous vous interrompez pour lui répondre. Vous auriez pu continuer en faisant semblant de n'avoir rien entendu : vous auriezmasqué l'interruption. Pendant votre discussion avec votre camarade, un troisième personnage vient vous poser une autre question. S'il s'agit d'un autre camarade vous le laisserez patienter quelques minutes le temps de terminer avec la première demande de renseignement. S'il s'agit de votre professeur vous allez vous interrompre immédiatement pour pouvoir lui répondre. La demande d'interruption du professeur a un niveau de priorité supérieur, elle peut interrompre l'interruption précédente.
3.3 Causes d'interruption Il y a deux grandes catégories d'interruptions : les interruptions externes et les interruptions internes. 45
CM_InfoIndus:version du mardi 25 octobre 2005 à 3 h 15
Chapitre 3. Interruptions
Les interruptions externes matérielles sont dues aux périphériques (imprimante, terminal, horloge externe, etc.) ou à des dispositifs extérieurs au système informatique (capteurs, système d'alarme, etc.). Par exemple un périphérique va générer une interruption pour signaler au système qu'il a terminé de traiter la requête précédente et qu'il est prêt pour recevoir une nouvelle commande. Dans le contexte de contrôle de processus, des phénomènes physiques doivent être signalés au système, par exemple le passage d'un objet devant un détecteur. Dans ce cas c'est le dispositif externe au système qui émet un signal qui est reçu par le système comme une interruption. Le programme courant lui-même peut déclencher une interruption à l'aide d'une instruction spéciale. Cela permet, par exemple, d'activer certains services du système qui nécessitent de bénécier de privilèges réservés au système. C'est une interruption externe et logicielle. Les interruptions internes produites par le processeur, sur des erreurs par exemple (division par zéro, dépassement de capacité, erreur d'adressage, accès à une zone de mémoire protégée, etc.). Ces interruptions sont généralement appelées exceptions. Les interruptions induites par l'horloge permettent la gestion du temps par le système d'exploitation. Par exemple, le système peut programmer l'horloge pour que celle-ci génère une interruption toutes les 10 ms. A chacune de ces interruptions le système peut reprendre la main et exécuter un algorithme de choix de tâches (ordonnanceur) de manière à éviter qu'un programme monopolise le CPU. Ces interruptions peuvent également servir à la gestion du temps dans les programmes et pour la comptabilité.
3.4 Mécanisme d'interruption 3.4.1 Identication de la source L'unité centrale dispose d'une entrée spéciale, généralement appelée IRQ (Interrupt ReQuest), associée à un bit dit bit d'interruption. Avant de passer à l'instruction suivante, le CPU teste l'état de ce bit. S'il est à 1 le CPU est informé d'une demande d'interruption. Pour pouvoir la traiter il doit en déterminer l'origine. Il existe deux méthodes principales pour identier la source d'une interruption : la scrutation (polling) et l'identication directe. Le choix entre ces deux méthodes est généralement le résultat d'un compromis coût/performance selon en particulier le nombre potentiel de périphériques qui peuvent être connectés. Etudions quelques mécanismes d'identication de la source d'une interruption. De très nombreuses architectures sont possibles : Un exemple, basé sur le principe de la scrutation, montre que toutes les lignes d'interruption sont réunies par une porte OU et chacune des lignes correspond à un périphérique. Lorsque le bit d'interruption est trouvé à 1 par le CPU, une routine de service est activée. Celle-ci va tester l'état de la ligne de chacun des périphériques pour identier le demandeur, puis exécuter la tâche correspondante. A la réception d'un signal sur l'entrée IRQ le processeur émet un signal d'acquittement IACK qui charge l'état des lignes de demande dans un registre. Le processeur lit ensuite ce registre pour identier l'origine de la demande. Il peut aussi n'exister qu'une seule ligne d'interruption que chaque périphérique demandeur maintient dans un état haut. L'unité centrale (le microprocesseur) est alors obligée d'interroger chacun des périphériques présents sur le bus pour lui demander s'il requiert un service. La priorité est ici dénie par l'ordre dans lequel les lignes sont testées. En général dans ce mode de fonctionnement une interruption n'est elle-même pas interruptible car le mécanisme de scrutation est assez long. Une autre méthode (IRQ : Interrupt ReQuest) consiste en un code envoyé par le périphérique. Ce code est utilisé pour exécuter une routine de service spécique au périphérique. Ce code 46
CM_InfoIndus:version du mardi 25 octobre 2005 à 3 h 15
3.4. Mécanisme d'interruption
peut être par exemple un pointeur dans une table contenant le vecteur d'interruption de chaque routine de service. Un vecteur d'interruption contient l'adresse de début de la procédure de traitement de l'interruption et le registre d'état du processeur nécessaire au début du traitement. Celui-ci, qui peut contenir certains niveaux de privilèges nécessaires au traitement de la requête, remplace le registre d'état courant, après que ce dernier ait été sauvegardé dans la pile avec le reste du contexte du programme interrompu. Le traitement de l'interruption, qui débute à la première instruction spécique à l'interruption, est donc plus rapide. Dans ce schéma une routine de service peut elle-même être interrompue. La technique précédente nécessite un mécanisme pour empêcher deux périphériques d'écrire leur code simultanément sur le bus. Il est également possible de chaîner les périphériques. La priorité est alors dénie par la position du périphérique sur la ligne d'interruption : câblage en daisy-chain.
3.4.2 Vecteur d'interruption Lorsqu'une interruption survient,le microprocesseur a besoin de connaître l'adresse du sousprogramme de service de cette interruption. Pour cela, la source d'interruption place sur le bus de données un code numérique indiquant la nature de l'interruption. Le microprocesseur utilise ce code pour rechercher dans une table en mémoire centrale l'adresse du sous-programme d'interruption à exécuter. Chaque élément de cette table s'appelle un vecteur d'interruption. Lorsque les adresses des sous-programmes d'interruptions sont gérés de cette manière, on dit que les interruptions sont vectorisées. Avantage de la vectorisation des interruptions : l'emplacement d'une routine (ISR) peut être n'importe où dans la mémoire, il sut de spécier le vecteur d'interruption correspondant. Les interruptions de la famille X86 sont vectorisées. La table des vecteurs d'interruptions (IVT : Interrupt Vector Table) doit obligatoirement commencer à l'adresse physique 0x00000 dans la mémoire centrale. Chaque vecteur d'interruption est constitué de 4 octets représentant une adresse logique du type CS : IP :
gure 3.3: Table des vecteurs d'interruptions 47
CM_InfoIndus:version du mardi 25 octobre 2005 à 3 h 15
Chapitre 3. Interruptions
Lors d'une interruption, le processeur se sert de la table des vecteurs (IVT) décrites à la gure 3.3. Cette table démarre à l'adresse 0 de la mémoire. Elle contient les adresses des routines d'interruptions (ISR) sur 4 octets (16 bits pour le segment,16 bits pour le déplacement) et les valeurs de ces quatres octets sont chargés dans les registres CS :IP. Chaque élément contient l'adresse de début d'un programme d'interruption sur 4 octets (oset 2 octets, segment 2 octets). La taille de la table est donc de 4 x 256 = 1 Ko. Elle occupe les adresses 0h à 3FFh en mémoire centrale. Le tableau 3.1 donne le détails des interruptions. INT (numéro) 00 - 01 02 03 - 07 08 09 0A 0B 0C 0D 0E 0F 10 - 6F 70 71 72 73 74 75 76 77 78 - FF
Nature de l'IT Exception NMI Exception IRQ 0 IRQ 1 IRQ 2 IRQ 3 IRQ 4 IRQ 5 IRQ 6 IRQ 7 IT Logicielles IRQ 8 IRQ 9 IRQ 10 IRQ 11 IRQ 12 IRQ 13 IRQ 14 IRQ 15 IT Logicielles
Utilisation usuelle Erreur de parité en mémoire Horloge interne (System Timer) Gestion Clavier Redirection PIC 2 Port série COM2 / COM4 Port série COM1 / COM3 Carte Son Lecteur Disquettes Port Parallèle Horloge Temps Réel (CMOS) Redirection IRQ2 Disponible Disponible Souris PS/2 Co-processeur Arithmétique IDE 1 IDE 2
tableau 3.1: Table des Vecteurs d'Interruptions de la famille Intel X86
3.4.3 Actions à entreprendre Lorsqu'une interruption est détectée il faut que le système réagisse le plus rapidement possible. Pour cela le matériel déclenche un branchement automatique vers une routine système préparée à l'avance (Interrupt Service Routine). Cette routine se trouve à une adresse xe qui peut être câblée. L'état de la machine doit être sauvegardé. Le contexte (en particulier, la table des pages, horloge, etc.) du programme interrompu est sauvé, en général dans une pile. Cette sauvegarde du contexte peut être réalisée par la routine de service elle-même ou prise en charge automatiquement par l'unité centrale de traitement. En fonction du code identiant le périphérique responsable de l'interruption, l'adresse de la routine de service associée est chargée dans le compteur ordinal, ce qui provoque un branchement automatique. Le registre d'état peut également être modié pour éventuellement bénécier de certains privilèges particuliers. Les interruptions de niveau inférieur ou égal doivent être masquées. Ce mécanisme est rapide car c'est le matériel (hardware) qui se charge du branchement vers la routine d'interruption, de la sauvegarde du contexte et la modication du compteur ordinal. Il ore une grande souplesse car il est possible d'écrire une grande variété de routines de service. Il peut cependant être pénalisant pour un processeur avec pipe-line et un grand 48
CM_InfoIndus:version du mardi 25 octobre 2005 à 3 h 15
3.5. Le PIC 8259
nombre de registres. Dans certaines architectures, en particulier celles orientées vers les applications temps réel, un processeur supplémentaire peut être associé au processeur principal avec pour tâche de gérer les opérations d'entrées/sorties et de ltrer les interruptions.
3.4.4 Reprise du programme interrompu Le programme en cours est suspendu pendant le temps de traitement de l'interruption. Le contexte doit ensuite être restauré avant la reprise de son exécution. Au retour de la routine de service il faut également démasquer les niveaux masqués à son appel. L'interruption est ainsi totalement transparente. La remise à jour du compteur ordinal provoque le retour au programme à l'instruction suspendue.
3.4.5 Le partage des interruptions Comme le montre l'IVT, les IRQ sont en nombre limitées. Ceci a longtemps été la cause de conits matériels. Ce problème est désormais résolu par le partage des interruptions. Tout composant dit legacy ne peut en aucun cas accepter le partage des interruptions. La raison est très simple. Ces composants sont physiquement connectés aux entrées du contrôleur, alors que pour pouvoir partager une interruption, il faut bien sûr pouvoir gérer une connexion de plusieurs lignes d'interruption intermédiaires avant d'en brancher physiquement une sur le contrôleur. Avec l'avènement du bus PCI, il est possible pour deux cartes d'extension PCI d'utiliser la même interruption si elles acceptent le partage d'IRQ. Seule la exibilité qu'ore le bus PCI le permet. De fait, dans le tableau des IRQ, seules les IRQ 9, 10 et 11 peuvent encore être considérées comme partageables. En eet, toutes les autres IRQ sont utilisées par des composants legacy, et ce en considérant que le PC est équipé d'une carte son connectée sur le bus ISA du PC. Les BIOS des PCs modernes autorisent maintenant aussi le partage d'interruption sur les IRQs de 3 à 7, à partir du moment où aucun composant legacy n'est connecté dessus. Par exemple, si vous n'utilisez aucun de vos ports série, vous pouvez alors, depuis le SETUP de certains BIOS, les déclarer comme inactifs. Ceci correspondra à une réelle déconnexion physique des ports qui seront alors rendus invisibles et le bénéce direct sera la libération des IRQ 3 et 4 dans cet exemple précis. Les périphériques PCI peuvent partager les mêmes IRQ parce qu'au démarrage du PC, le BIOS construit une table appelée PCI IRQ routing table. Cette table contient les entrées de chaque périphérique PCI qui se verra attribuer un numéro d'IRQ ISA (les numéros de 0 à 15). Ces assignations d'IRQ ISA sont aussi liées, par construction matérielle cette fois, aux lignes physiques d'interruptions PCI associées aux diérents connecteurs PCI d'un PC donné. L'ensemble des 2 se combine en ce qui s'appelle un Link Value. Ce dernier est utilisé à chaque fois qu'une communication s'établit avec un périphérique, et bien que des périphériques puissent partager une même IRQ, ils auront tous un unique Link Value : il n'y a donc pas d'erreur possible !
3.5 Le PIC 8259 Le circuit 8259 est un circuit programmable. Il dispose de plusieurs registres d'E/S. Ce composant intercepte toutes les demandes d'interruption des périphériques et les communique au microprocesseur selon leurs priorités. 49
CM_InfoIndus:version du mardi 25 octobre 2005 à 3 h 15
Chapitre 3. Interruptions
gure 3.4: Exemple de partage d'IRQ
3.5.1 Architecture du PIC 8259
gure 3.5: Architecture d'un PIC A partir de PC avec un 80286, la machine dispose de deux 8259 mis en cascade : 50
CM_InfoIndus:version du mardi 25 octobre 2005 à 3 h 15
3.5. Le PIC 8259
gure 3.6: Liaison entre les 2 PIC et le microprocesseur Le premier est implanté aux adresses d'E/S 0x20 à 0x2F tandis que le second est implanté aux adresses d'E/S OxA0 à 0xAF. Chaque circuit permet la gestion de 8 interruptions et gère : la vectorisation avec les processeurs 80x86 ; le déclenchement d'IT sur niveaux ou fronts ; les priorités des interruptions ; les masques d'interruptions. Le microprocesseur (8086) dispose de trois lignes d'interruptions (matérielles) : L'interruption NON MASQUABLE (NMI) : cette interruption ne peut pas être masquée, elle n'est pas prise en charge par le bit "I" du registre de Flags ; Les interruptions MASQUABLES (INTR : INTerrupt Request) : ces interruptions peuvent être invalidées par le bit "I" du registre de Flags. On trouve aussi INTA (INTerrupt Acknowledgement) qui signie que le microprocesseur a bien reçu par le bus de données le numéro d'IT envoyé par le contrôleur ; La broche RESET, provoque une réinitialisation du processeur (un reboot de la machine).
gure 3.7: Liaisons matérielles d'un PIC Lors d'une interruption : S'il s'agit d'une interruption matérielle, le processeur nit le traitement de l'instruction en 51
CM_InfoIndus:version du mardi 25 octobre 2005 à 3 h 15
Chapitre 3. Interruptions
cours et passe en mode non interruptible (Flag I) ; Le processeur empile le contenu des registres CS et IP (adresse de la prochaine instruction a exécuter) ; Le processeur lit le numéro d'interruption sur le bus de données envoyée par le 8259 si l'interruption est matérielle ; Il le multiplie par 4 pour obtenir l'adresse du vecteur d'interruption ; Il charge CS et IP avec les contenus de cette adresse ; Il exécute la routine d'interruption jusqu'à l'instruction IRET ; Il dépile alors CS et IP ; Il reprend le programme en cours d'exécution. Donc, la routine d'interruption doit acquitter l'interruption pour le 8259 et ré-autoriser le cas échéant les interruptions (Flag I). Pour programmer un traitement d'interruption matériel, il faut : Autoriser l'interruption par son démasquage (8259) ; Ecrire la routine de traitement d'interruptions ; Ecrire l'adresse de cette routine dans la table des vecteurs au bon emplacement. La routine doit contenir les éléments suivants : Lecture des E/S liés au périphérique ayant généré l'interruption ; Traitement a eectuer ; Acquitter l'interruption pour le 8259 (outp 0x20, 0x20) ; Pour l'installation du traitement d'interruption, il faut masquer toutes les interruptions au niveau du processeur.
3.5.2 Programmer le PIC 8259 Chaque circuit 8259 dispose : d'1 registre de masquage des IT (IMR : Interrupt Mask Register) d'1 registre de signalisation des IT (IRR : Interrupt Request Register) d'1 registre de traitement des IT (ISR : In Service Register) de 4 registres d'initialisation (ICW : Initialization Control Word). Ces registres sont initialisés au démarrage par le BIOS. de 3 registres de contrôle (OCW : Operation Command Word) utilisés pour activer, acquitter les IT : OCW1 permet de positionner les bits dans IMR. Si bit = 1 → interruption masquée, si bit = 0 → interruption autorisée ; OCW2 permet d'acquitter les interruptions suivant 3 modes : 1. Non spécique : annule le bit de l'ISR de plus forte priorité, 2. Spécique : annule un bit de l'ISR, ce bit devra être spécique, 3. Automatique : annule le bit de l'ISR après que le microprocesseur ait accusé réception de l'interruption. La première chose a faire est de programmer le registre OCW1 de chaque PIC (PIC1 : adresse 0x21 et PIC2 : adresse 0xA1) pour signier quelles vont être les IRQ masquables ou non en utilisant les tableaux ?? et ??. 52
CM_InfoIndus:version du mardi 25 octobre 2005 à 3 h 15
3.5. Le PIC 8259
Bit
Disable IRQ
Fonction
Bit
Disable IRQ
Fonction
0
IRQ 0
Horloge interne
0
IRQ 8
Horloge Temps Réel (CMOS)
1
IRQ 1
Gestion Clavier
1
IRQ 9
Redirection IRQ2
2
IRQ 2
PIC 2
2
IRQ 10
Disponible
3
IRQ 3
Port série COM2
3
IRQ 11
disponible
4
IRQ 4
Port série COM1
4
IRQ 12
Souris PS/2
5
IRQ 5
Carte Son
5
IRQ 13
Co-processeur Arithmétique
6
IRQ 6
Lecteur Disquettes
6
IRQ 14
IDE 1
7
IRQ 7
Port Parallèle
7
IRQ 15
IDE 2
tableau 3.2: Registre OCW1 du PIC 1 (0x21) et du PIC 2 (0xA1) Remarque 3.2. Si on masque l'IRQ2 du PIC 1, on masque automatiquement les IRQ 8 à 15 du
PIC 2 (du fait de la redirection). ■ Pour masquer une IRQ, il faut la mettre à la valeur 1. Exemple : écrire 0xF7 dans OCW1 autorise l'IRQ 3 et masque toutes les autres. En pratique, il faut préalablement lire le contenu du registre de masquage, puis forcer le bit associé au périphérique à contrôler sans modier les autres bits. Ceci est réalisé par la fonction outp(0x21,(inp(0x21) & 0xF7) ; . Une fois la routine terminée il faut rétablir l'état préalable des IRQ. Ceci est assuré par la fonction outp(0x21,(inp(0x21) | 0x08) ; . A la n de la routine (ISR), il ne faut pas oublier l'instruction EOI (End Of Interrupt) par le biais de la fonction outp(0x20,0x20) ; pour le PIC 1 ou outp(0xA0,0x20) ; pour le PIC 2. Pour initialiser complètement les PIC, on pourra s'inspirer du code suivant : void initPIC (void) { /* MASTER PIC */ outp(0x20,0x11) ; outp(0x21,0x20) ; outp(0x21,0x04) ; outp(0x21,0x01) ; outp(0x20,0xFF) ; /* SLAVE PIC */ outp(0xA0,0x11) ; outp(0xA1,0x70) ; outp(0xA1,0x02) ; outp(0xA1,0x01) ; outp(0xA1,0xFF) ; /* Démasquage des IRQ */ outp(0x21,0x0) ; outp(0xA1,0x0) ; }
/* /* /* /* /*
Init ICW1 */ Init ICW2 */ Init ICW3 */ Init ICW4 */ Masquage des IT */
/* /* /* /* /*
Init ICW1 */ Init ICW2 */ Init ICW3 */ Init ICW4 */ Masquage des IT */
53
CM_InfoIndus:version du mardi 25 octobre 2005 à 3 h 15
Chapitre 3. Interruptions
3.6 Gestion des Entrées-Sorties par interruption Chaque dispositif d'entrée sortie comprend en général deux parties : un appareil et un contrôleur de périphérique. Ce dernier sert d'interface entre l'appareil et le microprocesseur. Il reçoit les requêtes du microprocesseur et les transforme en commandes spéciques au périphérique, et réciproquement. Ce mécanisme permet une grande souplesse et ne nécessite pas d'instructions spécialisées à chaque type possible de périphérique. L'unité centrale de traitement communique avec un périphérique uniquement en mode lecture ou écriture comme pour la mémoire. Les données proprement dites sont accompagnées de commandes (actions à réaliser) et d'informations (état du périphérique). Le contrôleur de périphérique est chargé d'interpréter les requêtes ainsi transmises par le processeur et il met également en forme les informations à renvoyer au processeur. Un contrôleur peut être équipé d'un processeur, de registres et d'une mémoire tampon. C'est lui qui déclenche l'envoi d'un signal d'interruption. Par rapport au dialogue on classe souvent les périphériques en deux catégories (par caractères : communication par l'intermédiaire de registres et par blocs : information accessible par blocs disposant chacun d'une adresse). Selon les architectures les adresses des registres ou des blocs peuvent faire partie de la mémoire principale ou correspondre à des zones distinctes à cette mémoire centrale. Ces adresses peuvent être attribuées lors de la mise en place du matériel ou congurées dynamiquement. Lorsque les quantités de données à échanger sont importantes, il est pénalisant de charger le processeur de gérer ces échanges. Il est alors préférable de permettre une communication directe entre le périphérique et la mémoire, ou même entre deux périphériques (DMA). La gestion des échanges sur le bus de données est alors déléguée à un contrôleur DMA. Sur le plan logiciel on trouve une couche supplémentaire sous le système d'exploitation pour lequel, nous avons dit, le contrôle-commande d'un périphérique peut se limiter à des accès mémoire. Cette couche, appelée pilote ou driver, traduit les commandes générales d'échanges par caractères ou par blocs en commandes spéciques au périphérique, avec par exemple la gestion des signaux de contrôle de la liaison, des contraintes de temps à respecter, etc. Ces pilotes sont fournis avec le matériel.
3.7 Interruptions Logicielles 3.7.1 Interruptions BIOS Citons les principales interruptions du ROM BIOS : IT 0x08 : tic horloge (timer) appelé toutes les 55 ms ( 8,2 fois/s). Elle sert par exemple à arrêter le moteur de l'unité de disquette lorsque aucun accès à la disquette n'est exécuté. Cette interruption (après avoir lancé le programme correspondant), appele l'interruption 0x1C. Cette dernière ne contient qu'un retour IRET an de permettre aux programmeurs d'implanter leurs propres programmes d'interruption (objectifs : programmation concurrente, multitâche,. . . ) IT 0x10 à 0x12 : variable selon le matériel connecté. Souvent, IT 10 désigne l'IT vidéo, IT 11 fournit la liste du matériel disponible et IT 12 le calcul de l'espace mémoire disponible IT 0x13 : gestion des disques durs IT 0x14 : gestion du port série IT 0x15 : gestion d'un lecteur de cassettes IT 0x16 : gestion du clavier IT 0x17 : imprimante IT 0x18 : activation du ROM BIOS IT 0x19 : reset du système 54
CM_InfoIndus:version du mardi 25 octobre 2005 à 3 h 15
3.7. Interruptions Logicielles
IT 0x1A : gestion de la date et de l'heure Les IT de 0 à 7 sont appelées directement par l'U.C. du microprocesseur. Il s'agit de : IT 0x0 : division par 0 IT 0x1 : pas à pas IT 0x2 : circuit RAM défectueux IT 0x3 : point d'arrêt IT 0x4 : débordement IT 0x5 : copie d'écran IT 0x6 et 0x7 : inutilisées L'appel d'une interruption logicielle au niveau BIOS se fait par l'intermédiaire de la fonction int86 et en indiquant le numéro de l'interruption concernée. Par exemple, la gestion des ports série COM1 et COM2 du PC peut s'eectuer en appelant l'interruption numéro 0x14. On peut ainsi utiliser les fonctions de base résidentes correspondantes du BIOS. On utilise alors la fonction int int86 (int nb, union REGS *inregs, union REGS *outregs) ; où int86 exécute l'interruption 80x86 logicielle dont le numéro est spécié par "nb". Au retour de l'interruption, cette fonction recopie les valeurs courantes des registres du 80x86 dans outregs. inregs peut pointer sur la même structure que outregs. Cette fonction fait appel à des types particuliers de variables (relatifs au fonctionnement propre du microprocesseur). On utilise union REGS qui est déclarée de la manière suivante : union REGS { struct WORDREGS x ; struct BYTEREGS h ; }; La structure union REGS, dénie dans dos.h sert à échanger des informations avec la fonction int86 en utilisant 2 structures dénies ainsi : struct BYTEREGS { unsigned char al, ah, bl, bh ; unsigned char cl, ch, dl, dh ; }; struct WORDREGS { unsigned int ax, bx, cx, dx ; unsigned int si, di, cag, ags ; };
3.7.2 Interruptions DOS Les routines associées au DOS travaillent à un niveau supérieur. Elles peuvent parfois faire appel à des routines du ROM BIOS. Les principales interruptions associées au DOS sont : IT 0x20 : n normale d'un programme ; IT 0x21 : appel de sous-routines système ; IT 0x22 : gestion de l'adresse de saut après l'exécution d'un programme. Elle ne peut être activée directement. Elle précise la routine qui reprend le contrôle après la n du programme ; IT 0x23 : gestion de l'adresse de saut après un control-break. Idem à ci-dessus ; IT 0x24 : gestion de l'adresse de saut en cas d'erreur ; 55
CM_InfoIndus:version du mardi 25 octobre 2005 à 3 h 15
Chapitre 3. Interruptions
IT 0x25 : lecture directe sur disque ; IT 0x26 : écriture directe sur disque ; IT 0x27 : programme résident (terminer un programme en le laissant résident).
Un programme est dit résident si, une fois son exécution terminée, il rend le contrôle à l'environnement appelant mais reste chargé en mémoire. Il pourra alors être réactivé à tout moment, notamment à l'aide d'une interruption. Lorsqu'il se termine, l'espace mémoire qu'il occupait n'est pas libéré par le système d'exploitation. Un programme résidant s'écrit comme un autre programme, il sut que la dernière instruction exécutée soit un appel à la fonction 0x31 (fonction dite TSR : Terminate and Stay Resident) de l'interruption DOS 0x21.
Remarque 3.3. MS-DOS n'a pas été conçu pour exécuter plusieurs choses à la fois et en particulier
plusieurs appels au système (il n'est pas multi-tâches). Donc, si le programme qui s'exécute en avantplan utilise un service de MS-DOS, il ne faut pas que le programme de traitement de l'IT appelle le même service, sinon c'est généralement le plantage. ■
3.8 La programmation des interruptions
Rappelons brièvement le mécanisme d'interruptions : Au moment de l'interruption, le processeur reçoit sur une patte un signal électrique, il passe automatiquement en mode non interruptible. A la réception de ce signal, il termine l'instruction en cours d'exécution puis il sauvegarde les informations nécessaires à la reprise du programme en cours d'exécution. Il lit ensuite l'identité de l'interruption par un dialogue sommaire avec le composant contrôlant le mécanisme d'interruption. Il calcule l'adresse du vecteur d'interruption lié à cette identité d'interruption. Il charge depuis cette adresse une adresse pointant sur une routine appelée routine d'interruption (ISR). Il eectue un saut à cette adresse pour exécuter cette routine, souvent la première instruction de cette routine est de réautoriser les interruptions. Il exécute ce code jusqu'à la n de la routine où il trouve une instruction spéciale de n d'interruption. Il restaure l'état précédent l'interruption. Il reprend le cours du programme qui était en cours d'exécution. Ceci est encore illustré par la gure 3.8 : 56
CM_InfoIndus:version du mardi 25 octobre 2005 à 3 h 15
3.8. La programmation des interruptions
gure 3.8: Sous programme d'interruption Pour faciliter la programmation, on peut utiliser un certain nombre de fonction du langage C qui sont particulièrement destiné à cet usage.
3.8.1 Fonctions liées aux interruptions La fonction void keep (int retour, in taille) , prototypée dans dos.h, suspend le programme en cours d'exécution, le rend résident. taille désigne sa taille et code désigne le code retourné à l'environnement par ce programme. La fonction geninterrupt(int num) : déclenche l'IT num sans eectuer de copie de registres, mais en initialisant les registres à l'aide de pseudo-variables dénies dans dos.h : ah,al,ch,etc. . . La fonction intdos(union REGS * rin, union REGS * rout) et la fonction intdosx(union REGS * rin, union REGS * rout, union REGS rseg) permettent d'appeler directement une routine de traitement de l'IT 0x21. La fonction biosequip détermine la liste des équipements disponibles (IT 0x11). La fonction biosmemory calcule l'espace mémoire disponible (IT 0x12). La fonction biosdisk(int cmd, int face, int piste, int secteur, int nsecteur, void * buer) appele la fonction cmd de l'IT 0x13. La fonction bioscom(int cmd, char octet, int port) appele la routine cmd de l'IT 0x14. octet représente l'octet à écrire si cmd = 1, port désigne le numéro du port. La fonction bioskey(int cmd) appele la routine cmd de l'IT 0x16. La fonction biosprint(int cmd, char octet, int port) appele la routine cmd de l'IT 0x18. octet représente l'octet à écrire si cmd = 0, port donne le numéro du port parallèle. La fonction biostime(int cmd, long newtime) appele la fonction cmd de l'IT 0x1A. newtime contient la nouvelle heure en nombre de battements si cmd = 1. Il existe en C le type interrupt. Lorsqu'une fonction est déclarée de ce type, C va générer du code pour sauver les registres en début d'exécution et pour terminer la routine avec l'instruction 57
CM_InfoIndus:version du mardi 25 octobre 2005 à 3 h 15
Chapitre 3. Interruptions
IRET signalant le retour d'une interruption. La routine de service doit éviter un appel aux routines système car le DOS n'est pas réentrant. Pour réaliser un traitant d'interruption (handler), on dispose de 2 fonctions utiles comme setvect( ) qui modie le contenu d'un vecteur et getvect( ) qui lit la valeur d'un vecteur. On dispose aussi de 2 macros disable( ) qui met en attente de traitement tous les signaux d'interruption et enable( ) qui autorise à nouveau le traitement des interruptions. La fonction setvect(int num, void interrupt (*f) ( )) insère la fonction f en tant que routine de service de l'IT num. Pour éviter cette opération, il faut éviter d'être interrompu. Il faut donc faire précéder l'appel à setvect d'un appel à disable( ) qui masquera toutes les IT. Ensuite, un appel à enable( ) rendra à nouveau possible l'interruption du programme.
58
Chapitre 4
Port Parallèle Sommaire 4.1 4.2 4.3
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 Modes de fonctionnement . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 Programmation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.1 Introduction Un port parallèle comprend 8 canaux permettant d'envoyer simultanément les huit bits qui constituent un octet par l'intermédiaire des 8 ls. C'est une interface relativement rapide (par rapport au port série) qui est traditionnellement utilisée pour les imprimantes. Le seul problème posé par le port parallèle est qu'il ne peut guère être utilisé avec des câbles longs sans amplier le signal, au risque de provoquer des erreurs de données. En eet, la longueur ocielle est limitée à trois mètres sans perte de données. En fait, il est possible de dépasser cette longueur en veillant à certains points (le câble doit posséder un bon blindage, la présence de transformateur ou autre source électromagnétique à proximité du câble peuvent générer toutes sortes de dysfonctionnements). Le Port parallèle a subi plusieurs évolutions :
Port parallèle standard (SPP) : les premiers PC n'étaient pas équipés de diérents types de
ports parallèles. Le seul port parallèle disponible était celui qui servait à envoyer des informations de l'ordinateur à un périphérique tel qu'une imprimante. Le caractèreunidirectionnel du port parallèle du PC original était justié par son rôle premier, qui était d'envoyer des informations à l'imprimante. Il travaillait en mode nibble (envoi de 4 bits à la fois). Par un procédé astucieux, ce port était cependant capable d'eectuer des connexions de sortie de 8 bits et des connexions d'entrée de 4 bits. Les ports parallèles standard sont capables d'eectuer des connexions à un taux de transfert eectif d'environ 150 Ko/s en sortie et 50 Ko/s en entrée. Port parallèle bidirectionnel (BPP) : en 1987, IBM lança le port parallèle complètement 8 bits (en sortie comme en entrée) donc un taux de transfert d'environ 150 Ko/s en entrée et en sortie. Port parallèle amélioré (EPP) : le port EPP (Enhanced Parallel Port) correspond à une nouvelle spécication et est parfois appelé port parallèle mode rapide. Paru en 1991, ce type de port fonctionne quasiment à la vitesse d'un bus ISA. Ce port permet d'atteindre un débit de 2Mo/s. 59
CM_InfoIndus:version du mardi 25 octobre 2005 à 3 h 15
Chapitre 4. Port Parallèle
Port parallèle à capacité améliorées (ECP) : le port ECP (Enhanced Capabilities Port) a
été sorti en 1992. Tout comme le port EPP, ce port constitue une version améliorée du port parallèle standard et requiert un circuit logique spécial. Le port ECP très performant requiert cependant un canal DMA ce qui peut provoquer des conits avec d'autres périphériques qui utiliserait un canal DMA. Les nouveaux ordinateurs sont généralement fournis avec des ports ECP permettant d'eectuer des communications à haut débit. La plupart du temps, les ports ECP peuvent être convertis en port EPP ou en port parallèle standards par l'intermédiaire du BIOS (au setup). Il est seulement préférable de placer ce port en mode EPP pour bénécier d'un débit maximal.
4.1.1 Principales Caractéristiques En résumé SPP
EPP
ECP
unidirectionnel
bidirectionnel
bidirectionnel
simplex
half-duplex
half-duplex
No control
Software control
Hardware control
très lent
lent
rapide
pas de protocole
protocole (hanshake) simple
protocole (handshake) compliqué
tableau 4.1: Diérentes caractéristiques des ports parallèles La diérence principale entre EPP et ECP se situe dans le fait que EPP génère et contrôle tous les transferts vers et depuis le périphérique tandis que ECP nécessite que le périphérique négocie le mode reverse et contrôle le protocole (utilisation d'un controlleur dédié à l'utilisation du port ECP).
4.1.2 Norme IEEE 1284 Le standard IEEE de signaux d'interface bidirectionnelle de périphériques de port parallèle pour PC, adopté dans sa version nale en mars 1994, dénit les caractéristiques physiques du port parallèle, ses modes de transfert de données et ses caractéristiques physiques et électriques. Ainsi dénit-il le comportement des signaux électriques externes au PC applicable à un port parallèle multi-mode fonctionnant en mode 4 bits, 8 bits, EPP et ECP. Tous les types de modes ne sont pas requis dans le cadre du standard 1284, qui prévoit la possibilité d'en ajouter d'autres. Le standard IEEE 1284 vise à dénir le comportement des signaux entre un PC et un périphérique connecté, et plus particulièrement une imprimante, mais il intéresse également particulièrement les fabricants de périphériques utilisant le port parallèle (disques durs, adaptateurs de réseaux locaux, etc.). C'est un standard de niveau matériel exclusivement et il ne précise donc pas comment le logiciel doit communiquer avec le port, mais il a donné lieu à un standard supplémentaire destiné à dénir une interface de niveau logiciel. Ainsi la commission IEEE 1284.3 a-t-elle été formée pour élaborer un standard d'interface de niveau logiciel à utiliser avec le matériel conforme au standard IEEE 1284. Ce standard, qui vise à éliminer les disparités existant entre les puces de port parallèle des diérents fabricants, comporte une spécication destinée à faire contrôler le fonctionnement du mode EPP par le BIOS du PC. 60
CM_InfoIndus:version du mardi 25 octobre 2005 à 3 h 15
4.1. Introduction
4.1.3 Signaux
gure 4.1: Connecteur DB25 pour SPP SPP
EPP
ECP
1
STRB
R/W
Host CLK
2-9
D0-D7
D0-D7
D0-d7
10
ACK
INT
Periph CLK
11
BUSY
WAIT
Periph ACK
12
PAPER OUT
Reverse ACK
13
SELECT
X FLAG
14
AUTO FEED DATA STRB
Host ACK
15
ERROR
Periph Request
16
INIT/RESET
RESET
Reverse Request
17
SEL IN
ADR STRB
1284 Active
18-25
GND
GND
GND
tableau 4.2: Signaux des ports parallèles SPP, EPP et ECP STROBE : cette ligne active à l'état bas indique à l'imprimante que des données sont présentes sur les lignes D0 à D7 et qu'il faut les prendre en compte. ACK : l'imprimante met à 0 cette ligne pour indiquer à l'ordinateur qu'elle a bien reçu le caractère transmis et que ce dernier peut continuer la transmission. BUSY : cette ligne est mise à 0 par l'imprimante lorsque son buer de réception est plein. L'ordinateur est ainsi averti que celle-ci ne peut plus recevoir de données. Il doit attendre que cette ligne revienne à 1 pour recommencer à émettre. PAPER OUT : l'imprimante indique par cette ligne à l'ordinateur que l'alimentation en papier a été interrompue. SELECT : cette ligne indique à l'ordinateur si l'imprimante est on line ou o line. AUTOLINEFEED : lorsque ce signal est à 1, l'imprimante doit eectuer un saut de ligne à chaque caractère return reçu. En eet, certaines imprimantes se contentent d'eectuer un simple retour du chariot en présence de ce caractère. ERROR : indique à l'ordinateur que l'imprimante a détecté une erreur. INIT-RESET : l'ordinateur peut eectuer une initialisation de l'imprimante par l'intermédiaire de cette ligne. SELECT IN : l'ordinateur peut mettre l'imprimante hors ligne par l'intermédiaire de ce signal. GND : c'est la masse du PC. 61
CM_InfoIndus:version du mardi 25 octobre 2005 à 3 h 15
Chapitre 4. Port Parallèle
4.1.4 Protocole Voici un exemple de dialogue entre un PC et une imprimante :
gure 4.2: Dialogue avec une imprimante
gure 4.3: Handshake : timing
4.2 Modes de fonctionnement 4.2.1 Mode standard SPP Initialement, le port parallèle standard (SPP) se décompose en 3 registres : registre de données : le port conserve l'octet à écrire sur les sorties de données (D0 à D7). Dans les ports bidirectionnels, lorsque le port est conguré comme entrée, le registre de données conserve l'octet à lire sur les contacts de données du connecteur. registre d'état : il maintient les états logiques de cinq entrées (S3 àS7). Il fonctionne en lecture seule, sauf pour le signal S0 qui est un repère de n de séquence ( timeout ag) pour les ports acceptant des transferts en mode EPP et qui peut être annulé par logiciel. 62
CM_InfoIndus:version du mardi 25 octobre 2005 à 3 h 15
4.2. Modes de fonctionnement
registre de commande : il garde l'état de quatre bits (C0 à C3) qui sont habituellement utilisés comme sorties. L'adresse de base pour le port LPT1 est habituellement 0x378 (0x278 pour LPT2) Oset Reg. R/W bit fonc. Base+0 Données W 7 D7 6 D6 5 D5 4 D4 3 D3 2 D2 1 D1 0 D0
Oset Reg. R/W bit fonc. Base+1 Etat R 7 busy 6 ack 5 paper out 4 select in 3 error 2 IRQ 1 reservé 0 reservé
Oset Reg. R/W bit Base+2 Commande R/W 7 6 5 4 3 2 1 0
fonc. inutilisé inutilisé bidirectionnel IRQ via Ack selec printer reset printer auto linefeed strobe
tableau 4.3: Registres du 8255 Son protocole simplié est décrit par la gure 4.4 suivante :
gure 4.4: Protocole Centronics
les données sont appliquées sur le port (D0-D7) ; imprimante occupée ? (busy ?) le programme manipule la ligne nStrobe, attend 1 µs puis re-manipule la ligne ; les données sont lues sur front montant de nStrobe ; l'imprimante indique son état par la ligne Busy ; Une fois les données acceptées par l'imprimante, elle envoie un ACK (impulsion négative de 5 µs sur nAck).
4.2.2 Mode étendu EPP Pour gagner du temps au niveau du protocole, on a ignoré l'accusé de réception ACK. De plus, dans ce mode, c'est le hardware qui eectue la totalité du Handshaking a votre place. La seule chose qui incombe au programmeur est d'écrire l'octet de données sur le port. Ce mode permet des transferts rapides d'octets dans les deux directions. Les signaux de protocole d'accord font la distinction entre transfert de données et d'adresse. Il possède des registres supplémentaires (voir tableau ??). 63
CM_InfoIndus:version du mardi 25 octobre 2005 à 3 h 15
Chapitre 4. Port Parallèle
gure 4.5: Signaux et DB25 en mode étendu (EPP)
Le mode EPP permet des transferts à haute vitesse dans les deux sens. Comme il peut commuter rapidement le sens de transfert, le port EPP est utile pour des dispositifs qui échangent des petits blocs de données avec de fréquents changements de direction, tels que lecteurs de disques externes ou interfaces de réseaux. Un port EPP fait la distinction entre deux types d'informations, habituellement dénis comme données et adresses. Le mode EPP permet quatre opérations : écriture d'adresse (gure ??), écriture de données (gure ??), lecture d'adresses (gure ??), lecture de données (gure ??), chacune ayant un protocole d'accord diérent. Les transferts EPP dièrent du mode SPP par le fait que les circuits du port génèrent automatiquement des signaux de contrôle et détectent les réponses venant de l'autre extrémité. Il n'est donc pas nécessaire d'instructions par un logiciel pour charger l'état du signal de sortie Strobe ou pour lire une entrée occupée. Les opérations de donnée et d'adresse en mode EPP utilisent diérents signaux de contrôle pour verrouiller les octets dans le dispositif de réception. Écritures et lectures d'adresse utilisent nAStrobe (C3), lectures et écritures de données utilisent nDStrobe (C1) : ceci est un moyen simple pour que le récepteur fasse la distinction entre les deux types d'information. Un port EPP utilise 8 registres (tableau 5), cinq de plus que le port original SPP.
gure 4.6: Lecture et écriture d'une donnée en mode EPP 64
CM_InfoIndus:version du mardi 25 octobre 2005 à 3 h 15
4.2. Modes de fonctionnement
gure 4.7: Lecture et écriture d'une adresse en mode EPP
4.2.3 Mode étendu ECP Ce port possède aussi des registres supplémentaires (voir tableau ??).
gure 4.8: Signaux et DB25 en mode étendu (ECP) Le mode ECP permet également le transfert rapide de données dans les deux sens. Il comporte un tampon FIFO de 16 octets pour garder les données à envoyer et les données reçues. Pour les transferts les plus rapides, le port ECP peut compresser les données pour conditionner l'information en moins d'octets. L'accès direct à la mémoire (DMA) permet à l'unité centrale de faire d'autres actions pendant que les données sont transmises entre le tampon et la mémoire. En plus d'être rapide, les transferts en mode ECP sont exibles : ils peuvent s'accommoder à des périphériques plus lents, parce que le protocole d'accord n'a pas de timeout automatique. Les signaux de protocole d'accord font la distinction entre données et signaux de contrôle. Un octet de contrôle peut contenir une adresse ou une information de compression de données. Du côté de l'hôte, le port ECP contient un tampon FIFO de 16 octets qui stocke les données à envoyer et les données reçues. L'unité centrale (CPU) peut écrire une série d'octets dans le tampon et les circuits du port veillent à les écrire dans la même séquence sur les sorties Données du port. Dans le sens opposé, les tampons stockent une série d'octets reçus et la CPU lit chaque octet avant que le suivant n'arrive. Si le PC envoie des données vers un périphérique lent, le PC peut écrire jusqu'à 16 octets dans le tampon FIFO et faire d'autres choses ensuite. Le port ECP transférera les données automatiquement lorsque le périphérique sera prêt. De même, si un périphérique rapide veut envoyer des données vers un PC, le tampon FIFO du PC en stocke jusqu'à 16 octets de données reçus, que le PC pourra lire à son gré. 65
CM_InfoIndus:version du mardi 25 octobre 2005 à 3 h 15
Chapitre 4. Port Parallèle
gure 4.9: Commande et Data forward
gure 4.10: Commande et Data reverse
4.3 Programmation 4.3.1 Interruption logicielle Le paramétrage des ports parallèles est beaucoup plus simple que celui des ports sériels. En standard, le PC est équipé d'un seul port parallèle, mais il serait tout à fait possible d'en rajouter un second. Dans la plupart des BIOS, une interruption est d'ailleurs réservée d'oce à cet eet, que le port soit présent ou non. Dans de nombreux cas, le second port est désactivé et l'IRQ 5 est réutilisée pour un autre composant. 66
CM_InfoIndus:version du mardi 25 octobre 2005 à 3 h 15
4.3. Programmation
4.3.2 Tableau des registres pour tous les modes Adresse base
Type de Port
Fonction
SPP (W), EPP (W), ECP (mode 0 et 1) données ECP (mode 3) Adresse FIFO base+1 SPP, EPP, ECP état base+2 SPP, EPP, ECP commande base+3 EPP adresse base+4 EPP (R/W) données base+5 EPP autre fonction base+6 EPP autre fonction base+7 EPP autre fonction base+0x400 ECP (mode2 et 3) données FIFO ECP (mode 6) test FIFO ECP (mode 7) Cong reg. A base+0x401 ECP (mode 7) Cong reg. B base+0x402 ECP (tous modes) ECR (Extended Control Register)
67