¡Resultados empíricos!
Mientras que las otras respuestas son reflexivas y están bien razonadas, todas están incompletas o son solo una conjetura. 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 devolvería (
while (1)
)
- asignó el ISR a una fuente que podría desencadenar en el software (
INT0
bajando)
- interrupciones inhabilitadas
- habilitó y desencadenó la interrupción por lo que estaría pendiente
Utilicé un banco de pruebas que encendería un LED en la instrucción única después de que se habilitaran las interrupciones. Al probar diferentes formas de habilitar 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 se bloqueó) inmediatamente después de que se habilitaran las interrupciones.
Si el LED se encendió, entonces sé que se permitió que se ejecutara la siguiente instrucción antes de llamar al ISR.
Resultados
SEI
instrucción (caso base)
Código:
sei
Resultado:
Llevado en. Siguiendo las 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:
LED encendido. Siguiendo las 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:
LED encendido. Siguiendo las instrucciones ejecutadas.
Conclusión!
P: ¿La espera es una característica de la instrucción SEI o del registro de estado?
A: Parece que cambiar el I
bit en SREG
es de 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 sea utilizado para establecer el bit.
Notas
Esto realmente se convirtió en una pregunta muy interesante con muchas complicaciones. Si te interesan los detalles, echa un vistazo ...
enlace