¡Resultados empíricos!
Si bien las otras respuestas son reflexivas y bien razonadas, todas son incompletas o solo conjeturas. Cuando la documentación es ambigua, debemos experimentar y probar cada caso.
Esta pregunta merece una respuesta concluyente, ¡así que saquemos un AVR y comencemos a configurar algunos bits!
Procedimiento
Para probar, hice un pequeño programa Arduino (ATMEGA328P) que ...
- configurar un ISR que nunca volvería (
while (1)
)
- asigné el ISR a una fuente que podría activar en el software (
INT0
bajando)
- interrupciones deshabilitadas
- habilitó y activó la interrupción por lo que estaría pendiente
Utilicé un banco de pruebas que encendía un LED en la única instrucción después de que se habilitaran las interrupciones. Al probar diferentes formas de habilitar las interrupciones en el banco de pruebas y verificar el LED, podría decir si la instrucción después de la instrucción de habilitación se ejecutó o no.
Si el LED no se encendió, entonces sé que el ISR se ejecutó (y bloqueó) inmediatamente después de que se habilitaran las interrupciones.
Si el LED se encendió, sé que se permitió ejecutar la siguiente instrucción antes de que se llamara al ISR.
Resultados
SEI
instrucción (caso base)
Código:
sei
Resultado: LED encendido. Siguiendo instrucciones ejecutadas.
OUT
instrucción
Código:
in r16,0x3f // Get SREG
ori r16,128 // Set I bit
out 0x3f,r16 // Save back to SREG
Resultado:
Llevado en. Siguiendo instrucciones ejecutadas.
ST
instrucción
Código:
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
Resultado:
Llevado en. Siguiendo instrucciones ejecutadas.
¡Conclusión!
P: ¿La espera es una característica de la instrucción SEI o del registro de estado?
R: Parece que cambiar el I
bit en SREG
de a 0
a 1
permitirá que la siguiente instrucción se ejecute a continuación, incluso si hay una interrupción pendiente, independientemente de qué instrucción se use para establecer el bit.
Notas
Esto en realidad se convirtió en una pregunta muy interesante con muchas complicaciones. Si está interesado en los detalles, consulte ...
http://wp.josh.com/2016/01/05/different-ways-to-set-i-bit-in-avr-sreg-besides-sei/