Empirische Ergebnisse!
Während die anderen Antworten nachdenklich und gut begründet sind, sind sie alle unvollständig oder nur Vermutungen. Wenn die Dokumentation nicht eindeutig ist, müssen wir experimentieren und jeden Fall testen.
Diese Frage verdient eine abschließende Antwort, also lasst uns einen AVR herausziehen und ein paar Bits setzen!
Verfahren
Zum Testen habe ich ein kleines Arduino (ATMEGA328P) -Programm erstellt, das ...
- Richten Sie einen ISR ein, der niemals zurückkehren würde (
while (1)
)
- wies den ISR einer Quelle zu, die ich in der Software auslösen konnte (
INT0
wird niedrig)
- deaktivierte Interrupts
- aktiviert und den Interrupt ausgelöst, damit er ansteht
Ich habe einen Prüfstand verwendet, der in der Einzelanweisung eine LED einschaltet, nachdem Interrupts aktiviert wurden. Durch Ausprobieren verschiedener Möglichkeiten zum Aktivieren von Interrupts im Prüfstand und Überprüfen der LED konnte ich feststellen, ob der Befehl nach dem Freigabebefehl ausgeführt wurde oder nicht.
Wenn die LED nicht aufleuchtet, weiß ich, dass der ISR sofort ausgeführt (und gesperrt) wurde, nachdem Interrupts aktiviert wurden.
Wenn die LED aufleuchtet, weiß ich, dass der nächste Befehl ausgeführt werden durfte, bevor der ISR aufgerufen wurde.
Ergebnisse
SEI
Anweisung (Basisfall)
Code:
sei
Ergebnis: LED an. Folgeanweisung ausgeführt.
OUT
Anweisung
Code:
in r16,0x3f // Get SREG
ori r16,128 // Set I bit
out 0x3f,r16 // Save back to SREG
Ergebnis:
LED leuchtet. Folgeanweisung ausgeführt.
ST
Anweisung
Code:
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
Ergebnis:
LED leuchtet. Folgeanweisung ausgeführt.
Fazit!
F: Ist das Warten ein Merkmal des SEI-Befehls oder des Statusregisters?
A: Es sieht so aus, als würde das I
Bit in SREG
von a 0
nach a geändert1
die nächste Ausführung des folgenden Befehls ermöglicht, selbst wenn ein Interrupt ansteht, unabhängig davon, welcher Befehl zum Setzen des Bits verwendet wird.
Anmerkungen
Dies wurde tatsächlich zu einer sehr interessanten Frage mit vielen Komplikationen. Wenn Sie sich für die Details interessieren, lesen Sie ...
http://wp.josh.com/2016/01/05/different-ways-to-set-i-bit-in-avr-sreg-besides-sei/