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ß
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
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.