Frage Interrupt-Prioritäten

OP #750138
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.
Persönliche Seite #750143
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 ;-)
#750146
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.
Persönliche Seite #750164
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.
Gast #750166
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren