Interrupts und Atomic Blocks

OP Persönliche Seite #1925048
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ß
#1925057
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
Gast #1925058
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
#1925062
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.