www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt- Abarbeitung


Autor: Jonas (Gast)
Datum:

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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, Du liegst vollkommen richtig.

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: PICer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wenn Du von AVR-Controllern redest ..

bei PIC´s ebenfalls

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

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.