J'ai c code exécuté à partir de la RAM en faible puissance exécuter mode (donc l'interruption ne sont pas traitées). Ce mode activé par séquence de code:STM8 ASM exécuter en toute sécurité WFE
- saut vers la RAM
- SIM
- mise hors tension flash interne et régulateur de puissance, passer à la source d'horloge à faible vitesse (LSE)
- faire un travail avec le mode WFE (mode d'économie d'attente de puissance)
- interrupteur du régulateur de puissance et flash, source de restauration d'horloge
- RIM
- saut à flasher
Donc il n'y a pas de problème avec l'instruction WFE décrite dans la feuille d'errata. Problème avec cette construction, il peut être cause de verrouillage du processeur dans mode d'économie d'attente de puissance pour toujours:
while nbit(TIM1_SR1,CC3IF) asm("wfe");
qui est le démontage comme:
000035 720252B602 BTJT TIM1_SR1, #1, 0xB6
00003A 728F WFE
événement de minuterie a un caractère probabiliste, et ce le code ne garantit pas que cela se produira après l'exécution de l'instruction WFE:
- Instruction BTJT générée en 2 cycles, et longueur 5;
- code exécuté de RAM peut être pas continue parce que "fetch" états pause exécution sur quelques cycles
J'utilise PM0044 manuel et à la page 26, il jolie table de contenu:
Il y a 2 cas où l'exécution de code a calé à 3 cycles. Donc, je ne suis pas sûr que mon événement de réveil asynchrone ne se produira pas entre les instructions BTJT et WFE.
Existe-t-il des moyens d'assurer une séquence logique stricte (vérifier l'état> wfe> événement de réveil)?
Ce que vous demandez n'est pas clair. Après l'exécution de l'instruction WFE, la CPU a déjà été réveillée par un événement et l'instruction suivante est exécutée. L'instruction suivante doit être une instruction JRA qui revient à l'instruction BTJT. La séquence est 1) bit de test et boucle de sortie si définie 2) attendre l'événement de réveil 3) passer à l'étape 1. Si vous avez programmé correctement les registres de contrôle WFE, cela devrait être l'équivalent de la séquence 1) bit de test et sortie loop if set 2) passe à l'étape 1. L'instruction WFE économise simplement l'énergie. –
@ Ross, Est-ce vraiment comme tu penses? _Après que l'instruction WFE est exécutée, le CPU a déjà été réveillé par un événement et l'instruction suivante est exécutée._ Maintenant je crois que cette construction de code buggly, et la bonne façon est d'utiliser l'intrusion WFE seulement s'il y a une assez grande marge de temps. Et dans les cas plus complexes, ne l'utilisez pas après des événements de réveil concurrents. – imbearr
Je suis sûr que cela fonctionne comme je l'ai décrit. Pendant l'exécution de l'instruction WFE, la CPU est endormie et attend un événement. Une fois l'exécution de l'instruction WFE terminée, la CPU ne dort plus et n'attend plus un événement. Il passe ensuite à l'exécution de l'instruction suivante, comme ce qui se passe normalement lorsqu'une instruction termine l'exécution. Cependant, je ne vois toujours pas quel est votre problème. donc nous ne parlons peut-être pas des mêmes choses. Quel problème pourrait résoudre une grande marge de temps? –