Risultati empirici!
Mentre le altre risposte sono ponderate e ben ragionate, sono tutte incomplete o solo congetture. Laddove la documentazione è ambigua, dobbiamo sperimentare e testare ogni caso.
Questa domanda merita una risposta conclusiva, quindi estraiamo un AVR e iniziamo a impostare alcuni bit!
Procedura
Per testare, ho realizzato un piccolo programma Arduino (ATMEGA328P) che avrebbe ...
- imposta un ISR che non restituirebbe mai (
while (1)
)
- assegnato l'ISR a una fonte che potrei innescare nel software (
INT0
andando in basso)
- interruzioni disabilitate
- abilitato e attivato l'interrupt in modo che sia in sospeso
Ho usato un banco di prova che accendeva un LED nella singola istruzione dopo l'attivazione degli interrupt. Provando diversi modi per abilitare gli interrupt nel banco di prova e controllare il LED, sono riuscito a capire se l'istruzione dopo l'istruzione di abilitazione è stata eseguita o meno.
Se il LED non si accende, allora so che l'ISR è stato eseguito (e bloccato) immediatamente dopo l'attivazione degli interrupt.
Se il LED si è acceso, allora so che è stata eseguita l'esecuzione dell'istruzione successiva prima che fosse chiamato l'ISR.
risultati
SEI
istruzione (caso base)
Codice:
sei
Risultato: LED acceso. Seguite le istruzioni eseguite.
OUT
istruzione
Codice:
in r16,0x3f // Get SREG
ori r16,128 // Set I bit
out 0x3f,r16 // Save back to SREG
Risultato:
LED acceso. Seguite le istruzioni eseguite.
ST
istruzione
Codice:
clr r29 // Clear Y high byte
ldi r28,0x5f // Set Y low byte to point to SREG
ld r16, Y // Get SREG
ori r16,128 // Set I bit
st Y,r16 // Put SREG
Risultato:
LED acceso. Seguite le istruzioni eseguite.
Conclusione!
D: L'attesa è una caratteristica dell'istruzione SEI o del registro di stato?
A: Sembra che la modifica del I
bit in SREG
sia da a 0
a a 1
consentirà l'esecuzione successiva delle seguenti istruzioni anche in presenza di un interrupt in sospeso, indipendentemente dall'istruzione utilizzata per impostare il bit.
Appunti
Questo in realtà si è trasformato in una domanda molto interessante con molte complicazioni. Se sei interessato ai dettagli, dai un'occhiata ...
http://wp.josh.com/2016/01/05/different-ways-to-set-i-bit-in-avr-sreg-besides-sei/