--== 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 » Veille CPU
«««« ( /^\ ) »»»»
INFOS SUR LA CATEGORIE

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





INFOS SUR LA PAGE

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

Veille CPU

La veille CPU, c'est bien. La mise en veille du CPU est ce que vous devriez faire quand vous n'attendez rien de lui ou qu'un événement préalable à la poursuite du traitement est attendu. Quand vous n'avez rien à faire, passer le CPU en veille signifie que vous allez prolonger la vie des piles et d'autres améliorations... Les deux principales raisons pour passer le CPU en veille sont : vous avez effectué toutes vos tâches jusqu'au prochain début d'image, donc mise en veille jusque là; vous n'avez rien à faire jusqu'à ce que Suzy a fini de dessiner les sprites, donc mise en veille jusque là.

Quelque soit l'état de CPUSLEEP, et même si le CPU a positionné le drapeau pour désactiver les interruptions dans l'octet du statut du processeur, vous sortirez de veille pour une interruption.

Dans cet exemple de code, on veut passer en veille jusqu'à ce que Suzy ait fini, cependant on veut continuer à traiter les interruption qui surviendraient. Ce dont nous avons besoin c'est d'une méthode pour sortir de veille après l'interruption, réaliser que Suzy n'a pas encore fini et se remettre en veille le cas échéant. On suppose ceci : la routne d'interruption va décrémenter l'octet nommé Interruptus. On initialise cet octet avec 0x00 et on passe en veille. Si on sort de veille pour une interruption, le code de l'interruption va décrémenter Interruptus, le faisant ainsi passer à 0xFF avant qu'on aille le vérifier. On peut alors tester si l'octet est toujours à zéro et dans le cas contraire on sait qu'on a été éveillé par au moins une interruption. Ce qu'on ignore est si Suzy a fini ou pas aussi. Mais on peut trouver cette information : si Suzy nous a réveillé alors à chaque fois qu'on va essayer de repasser en veille alors on n'y parviendra pas tant qu'on aura pas écrit sur le registre de validation de réveil de Suzy. Ce sont les règles de Suzy, donc suivez les ! Donc pendant qu'on continue de boucler, bientôt ou plus tard, on finira par rencontrer la veille, rencontrer la prochaine instruction, trouver que Interruptus vaut toujours zéro parce qu'aucune interruption n'a eu lieu auquel cas on peut supposer que c'est Suzy qui est à l'origine du réveil. Finalement, on érit dans le registre de validation de réveil de Suzy afin que Suzy arrête de nous réveiller jusqu'à ce qu'il y ait à nouveau une bonne raison pour ce faire. Le seul point qui me rende encore nerveux est de savoir s'il faut ou pas au moins une instruction NOP après le STZ CPUSLEEP. Glenn pense qu'on a la garantie que le code d'interruption prendra le contrôle immédiatement, avant que la toute prochaine instruction du CPU puisse s'exécuter. DaveN n'était pas sûr et moi je reste entre les deux. Merci de m'éclaircir.

        SuzySleepyTime 
;---- SuzySleepyTime attends que Suzy ait fini mais autorise les
;---- interruption et les traite.
;---- Notez que cette routine ne perturbe aucun registre !

STZ Interruptus
STZ CPUSLEEP ;Lorsqu'on écrit là(0xFD91), on passe en veille

;---- Quand on sort de veille, qu'il s'agisse d'une interruption qui
;---- survienne ou Suzy qui ait finit son travail sur les sprites,
;---- on vérifie si nous sommes sortis de veille en testant le champ
;---- Interruptus : si c'est négatif, une interruption est survenue
;---- donc on peut repasser en veille pour laisser Suzy continuer
;---- sans être accompagné d'interruptions
BIT Interruptus
BMI SuzySleepyTime

;---- Si on est rendu ici, on n'a pas été réveillé par une
;---- interruption et par conséquent, ça doit être Suzy !
STZ SDONEACK ; On dit à Suzy qu'on a bien reçu la demande(0xFD90)

RTS

On a ici un bout de code qui se mette en attente tant que Suzy n'a pas fini. Ce n'est pas une façon recommandé vu que la charge des piles est consommée pendant l'attente mais si vous savez que l'attente sera courte, ça peut être la meilleure solution dans ce cas là.
        WaitForSuzyDone:
LDA SPRSYS
AND #SPRITE_DONE
BNE WaitForSuzyDone

ouais, c'est indigeste, c'est de l'assembleur 65C02

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

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