Forum: Mikrocontroller und Digitale Elektronik Interrupts und Atomic Blocks


von Florian S. (tornado) Benutzerseite


Lesenswert?

Hallo, alle zusammen!
hab eine kleine konzeptionelle Frage:
Angenommen, ich hab ein Signal, welches auf einem externen Interrupt 
hängt (also z.b. auf steigende Flanke reagiert). Dieser Interrupt soll 
nun auf eine 16-bit Variable zugreifen, auf die auch vom Hauptprogramm 
aus zugegriffen wird.

-> Problem.
Einfachste und wohl auch "angesehenste" Lösung dazu ist wohl ein Atomic 
Block (http://avr-libc.nongnu.org/user-manual/group__util__atomic.html).
Dieser Block macht es wenn ichs richtig verstanden hab genau wie viele 
andere mögliche Lösungen: Deaktivieren der Interrupts während des Atomic 
Blocks.

Was passiert jetzt aber, wenn meine Flanke genau in diesem Zeitraum 
auftritt? Meine Vermutung: Ich "verpasse" Sie, nachgeholt wird ja der 
Interrupt nicht (Das wäre für meine Anwendung sehr schlecht).

Stimmt das soweit, oder liege ich falsch? Wenn es nicht stimmt, was 
stimmt dann? Komm ich aus dem Dilemma raus ohne "aufwendig" einen Mutex 
zu progammieren?

Gruß

von Achim M. (minifloat)


Lesenswert?

Beim Sprung in die Interruptroutine wird das zugehörige Flag 
zurückgesetzt.
Tritt erneut ein Interrupt auf(auch während die zugehörige Routine noch 
läuft), wird das Flag gesetzt. Das Flagsetzen passiert auch, wenn die 
Interrupts abgeschaltet sind. Also wird die Routine abgearbeitet, die 
Interrupts wider angeschaltet und nun erneut in die Interruptroutine 
gesprungen, weil das Flag ja gesetzt ist.
mf

von Thomas (Gast)


Lesenswert?

Hi,
der Interrupt wird schon nachgeholt, er wird gespeichert und bei der 
nächsten Gelegenheit ausgeführt wenn es wieder erlaubt ist oder wenn die 
mit höherer Prio fertig sind.
Nur wenn es in der Zwischenzeit mehrerer Interrupts gab wird nur einer 
ausgeführt, die anderen werden dann in der Tat verpasst.

Gruß
Thomas

von Hc Z. (mizch)


Lesenswert?

Florian S. schrieb:
> nachgeholt wird ja der
> Interrupt nicht

Doch, wird er.  Der Interrupt setzt ein Flag (jede Interrupt-Quelle hat 
so eins).  Das bleibt gesetzt, und sobald das I-Flag im Statusregister 
wieder gesetzt ist, wird der Interrupt auch angesprungen.

von Peter D. (peda)


Lesenswert?

Florian S. schrieb:
> Meine Vermutung: Ich "verpasse" Sie, nachgeholt wird ja der
> Interrupt nicht (Das wäre für meine Anwendung sehr schlecht).

Diese "Vermutung" würde Interrupts generell unsinnig machen.
Interrupts dürfen nicht verloren gehen!

Wenn es schon wichtig ist, daß sie bevorzugt ausgeführt werden, ist es 
erst recht wichtig, daß sie überhaupt ausgeführt werden.

Und ein Blick ins Datenblatt verrät, daß Deine Vermutung falsch ist.
Alle Interruptquellen haben ein Interrupt-Pending-Bit.


Peter

von Falk B. (falk)


Lesenswert?

Siehe Interrupt

von Florian S. (tornado) Benutzerseite


Lesenswert?

Alles klar, vielen Dank für die Antworten :)

Damit ist mein Problem schnell gelöst

Gruß

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.