Wyniki empiryczne!
Podczas gdy inne odpowiedzi są przemyślane i dobrze uzasadnione, wszystkie są niekompletne lub jedynie domysł. Tam, gdzie dokumentacja jest niejednoznaczna, musimy eksperymentować i testować każdy przypadek.
To pytanie zasługuje na rozstrzygającą odpowiedź, więc wyciągnijmy AVR i zacznijmy ustawiać trochę bitów!
Procedura
Aby przetestować, stworzyłem mały program Arduino (ATMEGA328P), który ...
- ustaw ISR, który nigdy nie zwróci (
while (1)
)
- przypisałem ISR do źródła, które mogłem uruchomić w oprogramowaniu (
INT0
niski poziom)
- wyłączone przerwania
- włącza i wyzwala przerwanie, aby było w toku
Użyłem łóżka testowego, które włączałoby diodę LED w pojedynczej instrukcji po włączeniu przerwań. Próbując różnych sposobów włączania przerwań w łóżku testowym i sprawdzania diody LED, mogłem stwierdzić, czy instrukcja po instrukcji aktywującej została wykonana, czy nie.
Jeśli dioda LED nie zapaliła się, to wiem, że ISR wykonał (i zablokował) natychmiast po włączeniu przerwań.
Jeśli dioda LED się zapaliła, to wiem, że następna instrukcja mogła zostać wykonana przed wywołaniem ISR.
Wyniki
SEI
instrukcja (skrzynka podstawowa)
Kod:
sei
Wynik: dioda LED włączona. Wykonano instrukcję.
OUT
instrukcja
Kod:
in r16,0x3f // Get SREG
ori r16,128 // Set I bit
out 0x3f,r16 // Save back to SREG
Wynik:
LED włączone. Wykonano instrukcję.
ST
instrukcja
Kod:
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
Wynik:
LED włączone. Wykonano instrukcję.
Wniosek!
P: Czy oczekiwanie jest funkcją instrukcji SEI lub rejestru statusu?
Odp .: Wygląda na to, że zmiana I
bitu in SREG
z a 0
na a 1
pozwoli następnej instrukcji na wykonanie następnej, nawet jeśli występuje oczekujące przerwanie, niezależnie od instrukcji użytej do ustawienia bitu.
Notatki
To faktycznie przerodziło się w bardzo interesujące pytanie z wieloma komplikacjami. Jeśli jesteś zainteresowany szczegółami, sprawdź ...
http://wp.josh.com/2016/01/05/different-ways-to-set-i-bit-in-avr-sreg-besides-sei/