Notes pour le TP Répertoire des exemples : G:\ISAIP.DOC\tregouet\Irt PESO Timer Timer2 Win_scrt Serie2 Incrémentation d’un compteur par interruption + mise à jour de l’horloge système grâce à l’ancien gestionnaire d’interruption d’horloge Incrémentation d’un compteur par interruption Sans mise à jour de l’horloge système (l’ancien gestionnaire d’interruption d’horloge n’est pas appelé) Gestion de communication sur liaison série en mode scrutation Communication sur liaison série en mode interruption Comment compiler ? Créer un dossier d:\temp\rs232 Taper les commandes suivantes : C: Cd d:\temp\rs232 X:tc (échap pour passer la page d’information) Ouvrir le fichier Timer.c Changer de répertoire actif (File/changedir : d:\temp\rs232) Compiler Exécuter dans une fenêtre de commande : d:\temp\rs232\timer.exe TP / Programmation des Entrées / sorties sur PC (voir notes à la fin du document) Objectif 1 : Modifier timer.c pour vérifier que le compteur est incrémenté 18,5 fois par seconde Modifier timer.c pour que la fonction activée par l’interruption d’horloge ne fasse plus appel à l’ancien gestionnaire de l’événement d’horloge (fonctionnement identique à Timer2.exe) Modifier timer.c pour que la fonction activée par l’interruption d’horloge n’indique plus au contrôleur d’interruption 8259 la fin du traitement de l’évènement (résultat ?) Objectif 2 : 1- Comme chaque demande d'interruption peut provenir de plusieurs interfaces, quel est l'élément qui gère ces demandes et les transmet au processeur ? 2- Dessiner un schéma représentant cet élément, le processeur et l'interface 8250, avec leurs principales connexions. 3- Comment peut-on interdire la prise en compte de nouvelles interruptions pendant l'exécution d'un gestionnaire d'interruption ? 4- Que se passe-t-il si une demande d'interruption est faite alors que le processeur a masqué les interruptions ? 5- Comment le PIC connaît-il le numéro de l'interruption reçue ? Comment ce numéro est-il transmis au processeur ? Modifier timer .c pour afficher l’adresse de l’ancien gestionnaire d’interruption d’horloge : utiliser le format printf ("\t%8.8lx") et vérifier que l’adresse de ce gestionnaire affichée par x:mft.exe est identique (Mft : afficher FirstMeg + Interrupt + F3 pour trier par N° INT) En utilisant MFT, répondre aux questions suivantes : Combien y a-t-il de vecteurs d’interruptions ? Combien sont utilisés pour les IRQ (interruptions matérielles gérées par un 8259) Un PC AT dispose de 2 circuits 8259 « liés » par un numéro d’interruption : Compléter le tableau suivant Processeur Premier INT Périphérique 8259 connecté IRQ0 IRQ1 Deuxième 8259 IRQ8 IRQ7 IRQ15 Objectif 3 : Notion d’interruption logicielle Une interruption logicielle est une fonction du système que l’on peut appeler en connaissant non pas son nom mais son adresse mémorisée dans un vecteur d’interruption. int86x permet en langage C d’appeler une fonction dont on connaît le vecteur d’interruption associé. Int86x sert normalement à appeler une fonction du bios ou du DOS par exemple pour écrire sur l’écran (0x10) ou lire au clavier (0x16) etc… mais on peut aussi grâce à int86x faire exécuter une fonction associée à un événement matériel comme dans l’exemple suivant avec « division par zéro », ce qui revient à simuler l’événement matériel. Quelle est l’interruption qui traite l’événement division par zéro ? En utilisant et modifiant le programme interr2.c o Provoquer l’affichage du message « divide by zero » en appelant explicitement la fonction associée au vecteur 0x00 (simulation de l’événement, méthode de l’interruption logicielle) o Provoquer l’affichage du message « divide by zero » en appelant indirectement la fonction associée au vecteur 0x00 : programmer une division par zéro (méthode de l’interruption matérielle) Changer le message « divide by zero » par le message « Erreur : division par zéro ». o Quelle méthode utiliser ? o Le mettre en œuvre et comparer avec la solution de interrup.c Objectif 4 : Créer un programme de gestion de l’interruption clavier En s’inspirant de timer.c, créer un programme qui permet de compter les caractères tapés au clavier Comment pourrait-on faire pour que la nouvelle fonction de gestion du clavier convertisse systématiquement les caractères en majuscules ? Notes complémentaires : 1234- Créer un dossier c:\temp\rs232 Recopier les fichiers *. de G:\ISAIP.DOC\etudiant\RS232 sur c:\temp\rs232 Ouvrir une fenêtre de commande DOS Et taper les commandes suivantes pour lancer Turbo C X:tc (échap pour passer la page d’information) Ouvrir le fichier Timer.c sur c:\temp\rs232 Changer de répertoire actif (File/changedir : c:\temp\rs232) Compiler Exécuter dans une fenêtre de commande : c:\temp\rs232\timer.exe