L'instruction AVR SEI ( http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_SEI.html ) attend la fin de l'instruction suivante avant d'activer les interruptions.
Si j'utilise une autre instruction pour définir le drapeau I dans SREG, cela attendra-t-il également 1 instruction?
En d'autres termes: l'attente est-elle une caractéristique de l'instruction SEI ou du registre d'état?
S'il s'agit d'une caractéristique de l'instruction SEI, à quel moment le drapeau est-il réellement défini, dans le cycle qui exécute SEI ou avec l'instruction suivante?
avr
interrupts
assembly
Jay Jay
la source
la source
Réponses:
Résultats empiriques!
Bien que les autres réponses soient réfléchies et bien motivées, elles sont toutes incomplètes ou simplement des conjectures. Lorsque la documentation est ambiguë, nous devons expérimenter et tester chaque cas.
Cette question mérite une réponse concluante, alors sortons un AVR et commençons à régler quelques bits!
Procédure
Pour tester, j'ai fait un petit programme Arduino (ATMEGA328P) qui serait ...
while (1)
)INT0
en baisse)J'ai utilisé un banc d'essai qui allumait une LED dans l'instruction unique après l'activation des interruptions. En essayant différentes façons d'activer les interruptions dans le banc d'essai et de vérifier la LED, je pourrais dire si l'instruction après l'exécution de l'instruction d'activation a été exécutée ou non.
Si la LED ne s'est pas allumée, je sais que l'ISR a été exécuté (et verrouillé) immédiatement après l'activation des interruptions.
Si la LED s'est allumée, je sais que l'instruction suivante a été autorisée à s'exécuter avant l'appel de l'ISR.
Résultats
SEI
instruction (cas de base)Code:
sei
Résultat: LED allumée. Instruction suivante exécutée.
OUT
instructionCode:
Résultat:
Conduit sur. Instruction suivante exécutée.
ST
instructionCode:
Résultat:
Conduit sur. Instruction suivante exécutée.
Conclusion!
Q: L'attente est-elle une caractéristique de l'instruction SEI ou du registre d'état?
R: Il semble que changer le
I
bit enSREG
soit de a0
à a1
permettra à l'instruction suivante de s'exécuter ensuite même s'il y a une interruption en attente, quelle que soit l'instruction utilisée pour régler le bit.Remarques
Cela s'est en fait transformé en une question très intéressante avec beaucoup de complications. Si vous êtes intéressé par les détails, consultez ...
http://wp.josh.com/2016/01/05/different-ways-to-set-i-bit-in-avr-sreg-besides-sei/
la source
D'après ma documentation, l'exécution de l'
sei
instruction n'est pas différente de l'écriture directe d'un 1 sur le bit I du SREG. L'avantage de l'instruction est que vous n'avez pas besoin de charger d'abord une valeur de1<<I
dans un registre de travail pour changer le SREG, ce qui permet de gagner du temps.Pour élaborer, en utilisant
sei
:Définir le bit en utilisant
sbi
(ne fonctionnerait que si SREG était dans les 32 octets inférieurs de la mappe de registre, mais il semble que sur la plupart sinon la totalité, il ne l'est pas.)J'écris directement dans SREG:
Le
I
bit doit être positionné dans SREG dès que l'sei
instruction (ousbi
ouout
) se termine. Cependant, toutes les interruptions en attente ne seront traitées qu'après la fin de l' instruction suivante - le bit sera activé, mais il faudra un cycle supplémentaire pour que les interruptions soient activées. Étant donné qu'une interruption ne peut pas être gérée à mi-instruction et que certaines instructions prennent plus d'un cycle à exécuter, elles spécifient le temps nécessaire pour devenir activé en tant qu'une instruction. Cela devrait être le cas pour toutes les versions du code - c'est-à-dire que chacune des réponses ci-dessus entraînera le retard d'une instruction.Après un peu de recherche, j'ai trouvé ce fil sur le forum Arduino dans lequel plusieurs tests différents ont été effectués pour vérifier le comportement. Il semble être d'accord avec ce que j'ai dit ci-dessus.
En outre, selon ce thread, si l'
I
indicateur est déjà défini, il n'y a pas de réponse retardée d'une interruption causée parsei
ce qui implique que la réponse retardée n'est pas causée par l'instruction elle-même, mais plutôt par le matériel interne contrôlé par l'I
indicateur - donc toute opération qui change le drapeau dans SREG, que cesei
soitout
ou ousts
aura exactement le même comportement.la source
SBI
cela ne peut pas être utilisé pour définir leI
bit,SREG
donc tout code qui fait cela n'a probablement pas été testé dans la vie réelle car il ne s'assemblera même pas.SBI
ne peut fonctionner que sur les 32 registres inférieurs et SREG est à l'emplacement 63.out
était celui que j'utilisais à l'origine. Je pensais avoir rencontré un AVR (peut-être un ATTiny) qui a le SREG dans les 32 registres inférieurs, mais je l'imagine peut-être.À mon humble avis, l'écriture dans SREG retarde encore 1 instruction peut être testée comme ceci (pseudocode):
Malheureusement, je n'ai pas le temps de le faire :(
la source
Ce n'est pas ce qu'il dit. La documentation dit
pas qu'il attend la prochaine instruction. J'ai lu ceci car l'indicateur est défini immédiatement mais même s'il est activé, aucune interruption ne sera gérée jusqu'à ce que la prochaine instruction ait été exécutée.
la source