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