mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupts und Atomic Blocks


Autor: Florian S. (tornado) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...).
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ß

Autor: Joachim K. (minifloat)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe Interrupt

Autor: Florian S. (tornado) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles klar, vielen Dank für die Antworten :)

Damit ist mein Problem schnell gelöst

Gruß

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.