Resultados empíricos
Aunque las demás respuestas son reflexivas y están bien razonadas, todas son incompletas o sólo conjeturas. Cuando la documentación es ambigua, hay que experimentar y probar cada caso.
Esta pregunta merece una respuesta concluyente, así que saquemos un AVR y empecemos a configurar algunos bits.
Procedimiento
Para probar, hice un pequeño programa de Arduino (ATMEGA328P) que...
- configurar un ISR que nunca regrese (
while (1)
)
- asignó el ISR a una fuente que podía activar en el software (
INT0
bajando)
- interrupciones desactivadas
- activó y disparó la interrupción para que quedara pendiente
Utilicé un banco de pruebas que encendía un LED en la única instrucción después de habilitar las interrupciones. Probando diferentes formas de habilitar las interrupciones en el banco de pruebas y comprobando el LED, podía saber si la instrucción posterior a la habilitación se ejecutaba 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 la siguiente instrucción pudo ejecutarse antes de llamar al ISR.
Resultados
SEI
instrucción (caso base)
Código:
sei
Resultado: LED encendido. Se ejecuta la siguiente instrucción.
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. Se ejecuta la siguiente instrucción.
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. Se ejecuta la siguiente instrucción.
¡Conclusión!
P: ¿La espera es una característica de la instrucción SEI o del registro de estado?
R: Parece que el cambio de la I
bit en SREG
es de un 0
a un 1
permitirá que la siguiente instrucción se ejecute incluso si hay una interrupción pendiente, independientemente de la instrucción que se utilice para establecer el bit.
Notas
Esto 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/
0 votos
Esta es una gran pregunta, pero no debería ser demasiado difícil de probar y estar seguro.
1 votos
@Vorac ¿Puedes darme un ejemplo de cómo se podría probar esto? Esa sería mi respuesta aceptada con seguridad.
1 votos
Puede ser una característica de una implementación de la arquitectura AVR, y donde las interrupciones pueden ser manejadas. Según recuerdo, la arquitectura AVR utilizaba un pipeline de 3 etapas. Así que la siguiente instrucción puede estar ya "en vuelo" (es decir, en la primera etapa del pipeline, o más allá) antes de que el cambio de la bandera I pueda ser utilizado para comprobar las interrupciones. No he mirado durante mucho tiempo, pero no creo que los diseñadores de la arquitectura AVR se hayan limitado demasiado. Así que, comprobando la interrupción para una instrucción en la etapa 1 del pipeline, y no antes de la siguiente instrucción (en la etapa 2) les da cierta flexibilidad.