Was passiert ohne sei(), wenn dies im Programm gesetzt wird

Gast #2824801
Lesenswert?

Hallo,

Prozessor AVR Atmega8

ich habe eine Frage.
Angenommen ich habe ein ICP Interrupt, schalte aber die globalen 
Interrupts nicht frei, also schreibe im Code kein sei();
Interrupt Vektor ist konfiguriert auf eine Flanke.

Was passiert im Prozessor? Wird das Interrupt Flag im Interrupt Status 
Register für das Input Capture gesetzt?

Konkreter:
Im Programm treten ICP Interrupts auf, aber globale Interrupts sind 
nicht freigeschaltet. Nun schaltet das Programm aber die globalen 
Interrupts irgendwann frei. Wird das Interrupt dann direkt ausgeführt 
(weil evtl. im Status Register das Flag gesetzt wurde) oder erst beim 
nächsten Interrupt-Auftritt?
#2824839
Lesenswert?

Daniel schrieb:
> Wird das Interrupt Flag im Interrupt Status
> Register für das Input Capture gesetzt?
Ja.
Das bleibt dann solange stehen, bis es gelöscht wird. Also üblicherweise 
beim Sprung auf den Interruptvektor.

> Wird das Interrupt dann direkt ausgeführt
> (weil evtl. im Status Register das Flag gesetzt wurde)
Ja.
Wenn du das verhindern willst, musst du das Flag vor dem Aufruf von 
sei() löschen(1 reinschreiben).

mfg.
#2825203
Lesenswert?

Überlege mal logisch.
Interrupts sind in der Regel nicht nur höllisch eilig, sondern auch 
höllisch wichtig.
Und da wäre es doch saublöd, wenn bei zeitweiliger Interruptsperre (z.B. 
atomarer Zugriff) alle Interrupts verloren gingen.

Auch muß man Interruptereignisse nicht unbedingt in einem Interrupt 
behandeln. Man kann auch das Interrupt-Pending-Flag per Code testen, 
rücksetzen und behandeln. Das nennt sich dann Polling.


Peter

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren