mikrocontroller.net

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


Autor: Hut Schugh (gock)
Datum:

Bewertung
0 lesenswert
nicht 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"

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Hut Schugh (gock)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hut Schugh (gock)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja gut, also eine eingeschränkte Priorisierung.
Danke nochmal an alle!

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.