Forum: Mikrocontroller und Digitale Elektronik Interrupt- Abarbeitung


von Jonas (Gast)


Lesenswert?

Hallo, mal eine kurze frage, ich habe hier schon viel mitgelesen und das 
Tutorial durchgeabreiten und es so mitbekommen, dass es sinnvoll ist 
wenn man sich in einem Interrupt befindet die Interrupts global zu 
deaktivieren, was psssiert allerdings wenn ich sie dann wieder Global 
aktiviere, werden dann die Interrupts abgearbeitet die während der 
globalen- Deaktivierung eingegangen sind, oder sind diese dann quasi 
"übersehen" worden?

Kurze Erklärung warum ich es mir so vorstelle, dass sie dann nach dem 
Aktivieren abgearbeitet werden: Es gibt dieses Global Interrupt- Flag, 
nur wenn dieses gesetzt ist, sind andere Interrupts möglich, tritt ein 
Interrupt ein wird dann noch das spezielle Flag gesetzt z.B. das 
OutputCompare-Flag, nun setzte ich nach dem Verlassen der 
Interruptroutine wieder das Globale- Flag, jetzt sieht der Controller, 
dass das Output Compare-Flag inzwischen gesetzt ist und will dieses 
erstmal abarbeiten.

Ist das so richtig, oder alles quatsch ;-)

Jonny

von Matthias (Gast)


Lesenswert?

Ja, Du liegst vollkommen richtig.

von Johannes M. (johnny-m)


Lesenswert?

> dass es sinnvoll ist wenn man sich in einem Interrupt befindet die
> Interrupts global zu deaktivieren
Wenn Du von AVR-Controllern redest (was ich aus dem Zusammenhang 
schließe), dann ist das Deaktivieren überflüssig. Das macht die Hardware 
automatisch. Beim Sprung in den Interrupt-Vektor wird automatisch das 
I-Bit im SREG gelöscht und beim reti wieder gesetzt.

von PICer (Gast)


Lesenswert?

>Wenn Du von AVR-Controllern redest ..

bei PIC´s ebenfalls

von Johannes M. (johnny-m)


Lesenswert?

Genereller Ablauf bei Interrupt-Bearbeitung:
Wenn ein Hardware-Ereignis das dazugehörige Interrupt-Flag setzt und der 
betreffende Interrupt lokal (Interrupt Enable) freigegeben ist und das 
I-Bit im SREG (globale Interrupt-Freigabe) gesetzt ist, dann wird der 
Befehl, der gerade in Arbeit ist, zuende abgearbeitet. Anschließend wird 
der Stand des Programmzählers auf den Stack gerettet, das I-Bit gelöscht 
(von jetzt an keine Bearbeitung weiterer Interrupts möglich), das 
auslösende Flag gelöscht (Ausnahme: RXC-Flag des USART wird erst beim 
lesen von UDR gelöscht) und der betreffende Interrupt-Vektor 
angesprungen. Ist der Interrupt-Handler abgearbeitet und mit reti 
abgeschlossen, dann wird die um eins erhöhte Rücksprungadresse vom Stack 
geholt und in den Programmzählers geschrieben und das I-Bit wieder 
gesetzt. Im Hauptprogramm wird nach dem Rücksprung aus einem 
Interrupt-Handler zunächst mindestens ein Befehl ausgeführt, bevor 
weitere Interrupts bearbeitet werden (das gilt auch für 
Interrupt-Ereignisse, die während der Abarbeitung des vorhergehenden 
Interrupt Handlers aufgetreten sind). Treten während einer 
Interrupt-Sperrphase (I-Bit gelöscht) mehrere Interrupt-Ereignisse auf, 
dann werden diese nach erneutem Setzen des I-Bits in der Reihenfolge 
ihrer Vektoradressen abgearbeitet, also unabhängig von der Reihenfolge 
ihres Auftretens.

von Peter D. (peda)


Lesenswert?

Jonas wrote:
> Hallo, mal eine kurze frage, ich habe hier schon viel mitgelesen und das
> Tutorial durchgeabreiten und es so mitbekommen, dass es sinnvoll ist
> wenn man sich in einem Interrupt befindet die Interrupts global zu
> deaktivieren
...
> Ist das so richtig, oder alles quatsch ;-)

Ja, das ist quatsch.

Je nach Architektur werden zumindest Interrupts gleicher oder niederer 
Priorität automatisch gesperrt und nach dem RETI wieder freigegeben.

Es wäre nämlich ziemlich fatal, wenn sich Interrupts selber unterbrechen 
könnten.
Z.B. der externe Level getriggerte Interrupt wäre dann völlig 
unbenutzbar.


Peter

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.