AVR: Mehrere IRQs während einer ISR

OP #1245084
Lesenswert?

Hi!
Es geht um Atmel AVRs...
Klar ist mir bisher (man möge mich korrigieren):
1. Wird während der Abarbeitung einer ISR ein IRQ ausgelöst, so wird 
dieser nach Verlassen der ISR abgearbeitet, weil die ISR weitere IRQs 
sperrt und erst bei Ende wieder freigibt (I-Flag)
2. Treten  2 IRQs absolut gleichzeitig auf, so werden sie entsprechend 
ihrer Priorität abgearbeitet
3. Der AVR kann sich immer nur einen IRQ "merken" während er mit einer 
ISR beschäftigt ist.

Frage:
Wenn innerhalb einer ISR zunächst einer und dann ein weiterer IRQ 
auftritt, welcher der beiden wird im Anschluss ausgeführt? Der letzte 
oder der mit höherer Priorität?

Danke schonmal,
Gruß


Infos gibt es unter anderem hier:
http://www.mikrocontroller.net/articles/Interrupt
Beitrag "AVR ASM Interrupt Priorität"
Moderator Persönliche Seite #1245090
Lesenswert?

Hut Schugh wrote:

> 2. Treten  2 IRQs absolut gleichzeitig auf, so werden sie entsprechend
> ihrer Priorität abgearbeitet

Die Priorität wirkt auch dann, wenn während einer Interruptsperre
(durch CLI, oder weil gerade eine ISR aktiv ist) beim erneuten
Freigeben der Sperre mehrere Interrupts anhängig sind.  Sie müssen
dann nicht exakt gleichzeitig auftreten.

> 3. Der AVR kann sich immer nur einen IRQ "merken" während er mit einer
> ISR beschäftigt ist.

Einen für jede Interruptquelle.  Zu jeder Quelle gehört intern ein
Signal, das den anhängigen Interrupt kennzeichnet, und ein Signal
kann natürlich immer nur entweder aktiv sein oder nicht.

Manche Interruptquellen können sich dann auch noch mehr als eine
Anforderung merken, bspw. sind manche UARTs doppelt gepuffert.  Damit
kann es passieren, dass das UART-RXC-Interrupt-Flag selbst dann noch
aktiv bleibt, wenn man ein Byte aus dem UDR gelesen hat.  Wenn man
das nicht innerhalb der ISR selbst testet, würde nach dem Verlassen
der ISR dann sofort wieder ein Interrupt ausgelöst.
Gast #1245091
Lesenswert?

wenn man einfach mal logisch rangeht:

Es gibt für jeden IRQ ein Flag der anzeigt ob diese IRQ Aufgetreten ist.

Sobalt das I-Flag gesetzt ist wird in der Reihenfolge der IRQ-Adresse 
die Liste der Flags durchgegangen und in dieser Reihenfolge die passende 
ISR aufgerufen.

Wo sollte sich jetzt der Atmel die Reihenfolge der IRQ merken könnne?
OP #1245128
Lesenswert?

Sehr hilfreich, für jeden Vektor also nur einer, nicht insgesamt. Das 
war mein Missverständinis. Dann wird natürlich auch der Rest logisch...
Allerdings ist hier in älteren Threads immer mal wieder zu lesen, AVRs 
hätten keine Priorisierung, was mich wundert.
Danke
Persönliche Seite #1245325
Lesenswert?

Die Priorität ergibt sich durch die Position in der 
Interrupttvektortabelle, soweit ich weiß. Der Interrupt, der direkt 
hinter dem Reset Vektor liegt hat dabei die höchste Priorität.

Der "Interruptspeicher" ist nichts anderes als das jeweilige Flag des 
jeweiligen Moduls. Zum Beispiel gibt es beim Timer ein OVFIF (Overflow 
Interrupt flag). Ist das gesetzt, wird der Interrupt so bald wie möglich 
ausgeführt. Kommt aber in der Zwischenzeit ein neuer Interruptrequest, 
dann wird das Flag wieder gesetzt. Wenn das Flag aber zu dem Zeitpunkt 
schon 1 war, dann bleibt es 1 und der erste Interrupt geht verloren.

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