Forum: Mikrocontroller und Digitale Elektronik Frage Interrupt-Prioritäten


von Micha R. (michaavr)


Lesenswert?

Hallo,

ich habe eine grundsätzliche Frage zu Interrupts.

In welcher Prioritätsfolge werden Interrupts abgearbeitet?

Kann ich mich da an der Interrupt-Vektor-Tabelle (Datenblatt) 
orientieren?
Also Interrupt-Vektor 1 hat eine höhere Prio als beispielsweise 2 oder 
7?

Und bedeutet das dann auch, wenn ich z.B. beim ATmega8 den Timer 
1-Overflow (Vector 9) und RS232-RxC-Interrupt (Vector 12) verwende, dass 
dann auch der die ISR-Routine des UART unterbrochen wird, wenn Timer1 
Interrupt ausgelöst wird?

Also eine ISR-Routine, die gerade abgearbeitet wird durch einen 
Interrupt mit niedrigerer Vector.Nr unterbrochen werden kann?

Würde mich freuen, eine klare Antwort zu erhalten.

Gruß Mitch.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Micha R. wrote:
> In welcher Prioritätsfolge werden Interrupts abgearbeitet?
> Kann ich mich da an der Interrupt-Vektor-Tabelle (Datenblatt)
> orientieren?
> Also Interrupt-Vektor 1 hat eine höhere Prio als beispielsweise 2 oder
> 7?

Kann man so sagen. Bei zeitgleich auftretenden Interrupts wird bei den 
AVRs derjenige zuerst aufgerufen, der in der Interrupt-Vektor-Tabelle 
weiter vorne steht.

> Und bedeutet das dann auch, wenn ich z.B. beim ATmega8 den Timer
> 1-Overflow (Vector 9) und RS232-RxC-Interrupt (Vector 12) verwende, dass
> dann auch der die ISR-Routine des UART unterbrochen wird, wenn Timer1
> Interrupt ausgelöst wird?
>
> Also eine ISR-Routine, die gerade abgearbeitet wird durch einen
> Interrupt mit niedrigerer Vector.Nr unterbrochen werden kann?

Kann man so nicht sagen. Beim Anspringen der Interruptroutine werden bei 
den AVRs alle Interrupts gesperrt und erst beim RETI wieder freigegeben. 
Ausser der Code in der Interruptroutine gibt selbst die Interrupts 
wieder frei, dann kann sie auch unterbrochen werden. Man sollte aber 
wissen, was man macht, wenn man das macht ;-)

von Falk B. (falk)


Lesenswert?


von Johannes M. (johnny-m)


Lesenswert?

Es gibt bei den AVRs (anders als bei einigen anderen µCs) keine 
Prioritäten i.e.S., weil im Normalfall kein Interrupt die Abarbeitung 
eines anderen unterbrechen kann. Es gibt nur eine 
Abarbeitungsreihenfolge für gleichzeitig auftretende Ereignisse, und 
die ist wiederum durch die Reihenfolge der Vektoren in der Vektortabelle 
gegeben. Dabei werden die anstehenden Ereignisse von der niedrigsten 
Vektoradresse an abgearbeitet.

von Micha R. (michaavr)


Lesenswert?

Klingt ja irgendwie soweit klar und einleuchtend.

Aber was passiert denn dann wenn ein interrupt ausgelöst wird, wärend 
ein anderer gerade ausgeführt wird. Wird der spätere Interrupt dann 
unter den Tisch gekehrt (vergessen) oder dann nachgeholt?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Micha R. wrote:
> Aber was passiert denn dann wenn ein interrupt ausgelöst wird, wärend
> ein anderer gerade ausgeführt wird. Wird der spätere Interrupt dann
> unter den Tisch gekehrt (vergessen) oder dann nachgeholt?

Er wird nachgeholt. Stauen sich jedoch mehrere Interrupts aus gleicher 
Quelle, gehen welche verloren. Es wird nur ein Interrupt aus der 
gleichen Quelle in der "Warteposition" gehalten.

von STK500-Besitzer (Gast)


Lesenswert?

>Wird der spätere Interrupt dann unter den Tisch gekehrt (vergessen) oder >dann 
nachgeholt?

Sobald die aktuelle ISR verlassen wird, stellt der Controller anhand der 
Interrupt-Flags fest, dass ein (oder sogar mehrere) neuer Interrupt 
aufgetreten ist, und springt in die Interrupt-Vektor-Tabelle.

Das lässt sich übrigens alles wunderbar in dem von Falk geposteten 
Wiki-Artikel nachlesen...

von Micha R. (michaavr)


Lesenswert?

Ja da habe ich gerade gelesen. Jetzt ist es klar!

Danke für eure Hilfe!

Mitch.

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.