Index des articles > Programmation > Les interruptions

Les interruptions

Article posté par geogeo

Informations sur la programmation des interruptions


Vous trouverez la version originale ici.

Ce tutorial concerne la programmation en Assembleur et en C.


Introduction:

Prenons un exemple simple, vous regardez la télévision et le téléphone sonne, vous décrochez le téléphone et tout d'un coups, le four vous signal que votre plat est cuit, vous interrompez votre communication et vous arrêtez le four. Une fois votre communication terminée vous retournez devant la télévision mais il est l'heure de prendre votre médicament, vous prenez votre médicament et revenez regarder la télévision.

Ce petit exemple vous montre comment fonctionne les interruptions, nous allons distinguer le programme principal par le fait de regarder la télévision, les interruptions matériels par la sonnerie du four et le téléphone et enfin les interruptions logiciels qui ce produisent à des fréquences précises par le fait de prendre un médicament.

Sur les TIs nous avons 3 types d'interruptions (logiciels, matériel et programmable) et non 2 comme dans notre exemple, vous les découvrirez petit à petit dans ce tutorial.


Comment ça fonctionne?

Une interruption est une coupure temporaire du programme en cours d'exécution qui ce produit soit périodiquement ou encore par l'activation d'un périphérique câblé sur le processeur (comme le clavier ou la souris sur PC). Une fois l'interruption déclenchée, elle appel un sous-programme nommé ISR (Interrupt Service Routine) ou encore interrupt handler, ainsi le code du sous-programme est parcouru et informe qu'une interruption a eu lieu... Le sous-programme exécuté par l'interruption doit préserver le contenu de tous les flags (drapeaux) du processeur ainsi que le contenu des registres de tel sorte que lorsque le sous-programme de l'interruption soit terminé, le programme principal puisse retrouver les valeurs qu'il était en train de traiter...

En Assembleur pour terminer une ISR (le sous-programme employé par une interruption) on utilisera RTE au lieu de RTS qui a pour but restaurer les flags et mettre fin à l'interruption, quand au registres c'est à vous de les sauvegarder dans la pile et de les restaurer correctement à la fin de l'interruption.


Auto Interruptions (Auto interrupts):

Le premier type d'interruption est déclenché par une horloge (un timer) ou par un dispositif câblé, le programme n'a réellement aucun contrôle sur le déclenchement de ce genre d'interruption. Les niveaux de gris sont par exemple basés sur une interruption périodique qui s'exécute tout les 350 Hz (soit 350 fois par seconde!!!), pour le son avec PolySnd v2.0, 8192Hz!!! Il y a 7 de ses interruptions dans le processeur ce nommant auto interrupts 1-7. Quand une certaine de ses interruptions est déclenchée, elle exécute l'ISR où son adresse ce situe dans une zone précise de la mémoire, soit 4 octets pour une adresse de 32 Bits.

Voici la liste des adresses mémoire où sont stocké les adresses des différentes ISR de chacune des interruptions:

auto interrupt 1 - 0x64
auto interrupt 2 - 0x68
auto interrupt 3 - 0x6c
auto interrupt 4 - 0x70
auto interrupt 5 - 0x74
auto interrupt 6 - 0x78
auto interrupt 7 - 0x7c

Quand un programme en assembleur est exécuté, les interruptions du TIOS sont activées, pour changer n'importe quelles de ses dernières, il faut modifier à l'adresse voulu l'interruption en y mettant l'adresse du sous-programme que l'on veut exécuter. Cependant, puisque de 0x000 à 0x128 cette zone est protégée, pour enlever la protection vous devez tout d'abord mettre à zéro le bit 2 du port 0x600001, écrire l'adresse de votre ISR, et remettre à 1 le bit modifié. N'oubliez pas de sauvegarder l'adresse de l'ISR du TIOS que vous avez remplacer et de la restaurer à la fin de votre programme.


Voici les fonctions de chacunes de ses auto-interruptions:

Auto-interrupt 1: Le TIOS emploie cette interruption pour manipuler le getkey, la barre de statut, et l'indicateur busy entre autre. Cette interruption se produit à approximativement 350 Hz et est idéale pour l'exécution des niveaux de gris.

Auto-interrupt 2: Le TIOS utilise cette interruption dans le cas où une touche du clavier est pressée tel que 2nd, Diamant, Shift et alpha. Elle ce produit à une fréquence approximative de 600 Hz lorsqu'une touche du clavier autre que ON est pressée.

Auto-interrupt 3: Cette interruption est de précisément 1 Hz sur les HW2, elle s'occupe de l'horloge.

Auto-interrupt 4: Cette interruption est déclenchée par la détection des données reçu par le port I/O.

Auto-interrupt 5: Cette interruption est déclenché lorsque la valeur du générateur programmable déborde soit atteint 0xFF. Ce générateur est décroissant, ça valeur de réinitialisation peut être modifiée via le port 0x600016, Le TIOS emploie cette interruption pour l'APD (Automatic Power Down), cette interruption est parfaite pour la synchronisation des jeux. A savoir que ça fréquence maximum est de 8192 Hz sur HW2 et 11000 Hz sur HW1 (vous trouverez plus amples informations dans un autre article).

Auto-interrupt 6: Cette interruption est déclenchée lors d'un appuie sur la touche ON.

Auto-interrupt 7: Cette interruption ce déclenche lors d'un accès en écriture à la zone de mémoire de 0x000 0x120. Cette interruption peut être désactiver en mettant le bit 2 du port 0x600001 à zéro.


Trap interrupts:

Le deuxième genre d'interruption est dite logiciel. Il y a 16 interruptions de ce genre noté traps 0-15, elle sont appelé via l'instruction trap #x (où x est le numéro de l'interruption à exécuter). Sur 68000 ce sont habituellement les programmes en mode superviseur qui exécutent les fonctions qui ne peuvent pas être faite en mode utilisateur. Les traps sont utilisés pour par exemple changer le contraste, désactiver toutes les interruptions... ceci sont des traps par défaut du TIOS, vous pouvez les modifier en changeant le pointeur de votre routine de trap dans la RAM où ce trouve la table de traps, n'oubliez pas de désactiver la protection en écriture en mettant le bit 2 du port 0x600001 à 0.

trap 0 - $80
trap 1 - $84
trap 2 - $88
trap 3 - $8c
trap 4 - $90
trap 5 - $94
trap 6 - $98
trap 7 - $9c
trap 8 - $a0
trap 9 - $a4
trap 10 - $a8
trap 11 - $ac
trap 12 - $b0
trap 13 - $b4
trap 14 - $b8
trap 15 - $bc

Le TIOS utilise ses routines de traps, les autres sont inutilisés:

trap 0: Ce trap appel un sous programme n'importe où dans les 64 premiers Ko de la ROM pointé par d0.w. Littéralement, il fait ce qui suit : jsr ($400000+d0.w)

trap 1: Ceci change les 16 Bits du registre de statut avec d0.w. La valeur d0.l retourné correspond à la valeur du registre de statut avant modification.

trap 2: Fait un reset de la calculatrice.

trap 3: Inconnu.

trap 4: Ceci éteindra la calculatrice et attendra l'appuie de la touche ON pour la rallumer.

trap 5: Inconnu.

trap 6: Inconnu.

trap 7: Inconnu.

trap 8: Inconnu.

trap 9: Prend la valeur de d0.w et retourne le pointeur d'un certain sous-programme dans a0.l situé en RAM déterminé par une table de sauts. Sur la ROM 1.00 cette table ce situe à l'adresse 0x4004f8.

trap 10: Entrer dans le self test.


Désactiver toutes les auto interruptions:

Toutes les auto interruptions peuvent être désactivées en utilisant le registre de statut et le trap 1. Les bits 10, 9 et 8 de SR (Status Register) représente les priorités les plus basse des interruptions (l'auto interruption 1 à la plus haute priorité, l'auto interruption 7 a la plus basse priorité). Par conséquent ses bits sous le forme 0b011 (%011) (4) respectivement, activera seulement les interruption 5, 6 et 7. Par exemple pour désactiver toutes les interruptions nous devrons exécuter:


move.w #$0700,d0 ;set bits 8,9 and 10
trap #1 ;put d0.w into SR
move.w d0,oldSR ;save old SR



Les autres interruptions:

Il y a un autre type d'interruption ce sont les exceptions. Elles surviennent lorsqu'une instruction a effectuée une opération illégale, tel que l'accès à une adresse impaire, division par zéro ou encore exécution d'une opcode inconnu.

Toutes ses interruptions sont placées dans une table d'interruptions vectorielles, voici la table de ses ISR:

http://perso.wanadoo.fr/tisofts/tigen/images/interrupts.jpg


Bonne programmation. ;)

Copyright 2004 by ANNEHEIM Geoffrey

>> Vos commentaires [0]

Pas de commentaires

Poster un commentaire


Seuls les membres peuvent poster des commentaires