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"
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.
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?
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
das der Atmel kein Zufallsgenerator hat und damit immer das gleiche macht, ergibt sich eine Priorisierung die man aber nicht beeinflussen kann.
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.
Ja gut, also eine eingeschränkte Priorisierung. Danke nochmal an alle!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.