| DocumentationRootretour à 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 CPULa 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 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: ouais, c'est indigeste, c'est de l'assembleur 65C02 (Source : http://www.monlynx.de/lynx/irq.html#sleep) «««« ( /^\ ) »»»» | ||||||||||||||||||||||||
-= DevLynx, un site par vince pour vous =- |