Forum: Mikrocontroller und Digitale Elektronik AVR: Mehrere IRQs während einer ISR


von Hut S. (gock)


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"

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Peter (Gast)


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?

von Hut S. (gock)


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

von Peter (Gast)


Lesenswert?

das der Atmel kein Zufallsgenerator hat und damit immer das gleiche 
macht, ergibt sich eine Priorisierung die man aber nicht beeinflussen 
kann.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Hut Schugh wrote:

> Allerdings ist hier in älteren Threads immer mal wieder zu lesen, AVRs
> hätten keine Priorisierung, was mich wundert.

Das ist auch richtig, wenn man eine ,,klassische'' Priorisierung
meint, bei der ein höher priorisierter Interrupt die ISR eines
niedriger priorisierten Interrupts unterbrechen kann.

von Hut S. (gock)


Lesenswert?

Ja gut, also eine eingeschränkte Priorisierung.
Danke nochmal an alle!

von Simon K. (simon) Benutzerseite


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.

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.