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