--== DEVLYNX ==--

 
 
|
 
 
 
 
Accueil
News
Doc
Mémoire
Recrutement
Faq
Liens
Pseudo :

Mot de passe :


Pas de compte ?

S'inscrire...


Statistiques

Documentation


Rootretour à l'arborescence des catégories » Documentation techniqueEnsemble des informations pouvant être utiles au développement » Lynx docRestranscription de la documentation d'origine » Annexe 2 : Interruptions et mode veille CPU » Interruptions de Handy
«««« ( /^\ ) »»»»
INFOS SUR LA CATEGORIE

Créée le : 2009-10-07 10:30:00
Par : vince





INFOS SUR LA PAGE

Titre : Interruptions de Handy
Sous Titre :
Langue : FRA
Source : http://www.monlynx.de/lynx/irq.html#irq
Auteur : vince
Posté par : vince

Interruptions de Handy

Quand une interruption matérielle survient ou que le CPU exécute l'instruction BRK, la routine logicielle pointée par le vecteur BREAK est appelée après que l'octet de statut du processeur et l'adresse de retour aient été poussés sur la pile. Le drapeau Interruption Désactivée est positionné avant que l'exécution du code de l'interruption de démarre, ce qui veut dire qu'à moins de rabaisser le drapeau dans notre code d'interruption nous ne serons pas interrompus par une interruption matérielle tant que nous n'aurons pas rencontré l'instruction RTI (sauf bien entendu pour NMI qui surpasse tout).

La routine qui gère l'arrêt doit d'abord vérifier si le bit B est levé dans l'octet de statu et ensuite si un BRK a été exécuté dans quel cas la routine d'arrêt pourrait être appelée. Dans l'environnement de débogage de Handy, BRK nous fait stopper le moniteur ce qui indique au programme hôte sur l'Amiga que nous avons stoppé l'exécution et que nous attendons sa commande.

D'un autre coté, si la routine qui gère l'arrêt trouve que le drapeau B n'est pas levé, c'est qu'il s'agit d'une interruption générée par le matériel. Le logiciel lit alors soit le registre INTSET soit le registre INTRST (ils contiennent des informations dupliquées) et alors vérifier chaque bit pour savoir quel horloge (ou quelles horloges) a déclenché l'interruption. Si un bit est positionné alors la routine associée à cette horloge est appelée. Pour confirmer que nous avons traité l'interruption nous devons réinitialiser les bits en écrivant dans le registre INTRST. Si nous écrivons dans INTRST la valeur que nous venons de lire dans INTSET alors ça va effacer les bits que nous étions sur le point de traiter. De plus, ça ne perturbe pas les autres bits qui peuvent avoir été positionné depuis le moment où nous avons lu le rgistre INTSET.

Voilà maintenant un point intéressant au sujet des registres de drapeaux des interruptions : la présence de bits qui ne sont pas à "0" dans le registre des drapeaux d'interruption est ce qui déclenche une interruption. L'implication la plus simple est que si on positionne tous ce registre à "0" (en écrivant 0xFF dans INTRST) alors on ne sera plus interrompu à nouveau jusqu' à ce qu'une nouvelle interruption se déclenche. Une implication plus intéressantes est que l'on peut forcer une interruption à se déclencher en écrivant autre chose que "0" dans le registre INTSET ! Mais comme la présence de bits non nuls dans le registre de statut des interruption déclenche une interruption, si un timer arrive en fin de comptage pendant le traitement du code de l'interruption, après que vous ayez lu les bits d'interruoption et les avoir effacé en écrivant dans INTRST alors le bit sera positionné dans le registre de statut et immédiatement après la sortie de votre traitement du code d'interruption vous serez interrompus à nouveau, ce qui est le comportement souhaité in fine.

Si vous voulez désactiver une interruption, vous effacez son bit d'activation. Si vous voulez être sûr de ne plus être interrompu par cette interruption, vous devez alors effacer ses bits dans les registres INTRST et INTSET.

Les horloges et le port série sont les seuls éléments qui génèrenet des interruptions (autres que NMI)

Quand vous êtes dans le code d'une interruption :
¤ N'utilisez pas les fonctions mathématiques sans au préalable laisser les calculs en court se finir, sauver le résultat, faire vos calculs et enfin restaurer le résultat sauvegardé.
¤ N'utilisez pas de fonction matériel d'affichage sans vérifier sa complétion (vous pouvez aussi positionner un bit qui demande au moteur de sprite de s'arrêter à la fin du sprite en cours).
¤ En général, on peut lire ou écrire seulement les octet sans contrainte de lecture ou écriture et seulement après avoir vérifié le bit de statut qui contrôle ces champs.

Vous activez les horloges en positionnant le bit d'activation de l'octet statique de contrôle de l'horloge. Vous activez le port série en paramétrant soit le bit Activer l'Interruption d'Emission (TXINTEN) soit le bit Activer l'Interruption de Réception (RXINTEN) dans le registre de contrôle du port série (SERCTL).

(Source : http://www.monlynx.de/lynx/irq.html#irq)
«««« ( /^\ ) »»»»

générée en 5 ms
-= DevLynx, un site par vince pour vous =-