Hallo wie ist die Reihenfolge der ISR Interrupt routinen beim atmega8l definiert? Wird von oben nach unten abgearbeitet, also wenn in meinem programm die Interrupts so aufgebaut sind: ISR(ADC_vect) {...} ISR(TIMER0_OVF_vect ) {..} ISR(TIMER2_OVF_vect ) {..} main() dann wird doch mit dem ADC ISR zuerst angefangen, dann folgt T0 und zuletzt T2 oder? Oder hängt das wer von denen der schnellste ist? danke :)
Und für den Fall, dass mehrere Interrupts gleichzeitig auftreten wird es der Reihe nach gemacht, wie die Interruptvektoren im Datenblatt stehen.
Die Priorität beim Mega8 ist fest und nicht änderbar. Die Priorität steht im Datenblatt. Die Priorität ist nur dann wichtig, wenn zwei Interrupts gleichzeitig auftreten. Der mit der niedrigeren Priorität muss dann etwas warten. Die Reihenfolge von ISR()-Funktionen im Sourcecode ist völlig egal. Sie ändert nichts an der Priorität.
Glaubst Du tatsächlich, dass der Timer0-Overflow-Interrupt, wenn er auftritt, erst mal wartet, ob nicht vielleicht noch ein ADC-Interrupt vorbeikommt? Und wenn nicht, dann wartet er so lange, bis der ADC sich meldet? Macht eigentlich schon nach kurzem Überlegen sehr wenig Sinn, oder?
"The list also determines the priority levels of the different interrupts. The lower the address the higher is the priority level. RESET has the highest priority, and next is INT0." Mit "list" sind die Interrupt-Vektoren am Anfang des Flash gemeint.
D. W. wrote: > "The list also determines the priority levels of the different > interrupts. The lower the address the higher is the priority level. > RESET has the highest priority, and next is INT0." > > Mit "list" sind die Interrupt-Vektoren am Anfang des Flash gemeint. Jo, das sind aber keine "Prioritäten" im üblichen Sinn. Die hier angegebene Abarbeitungsreihenfolge greift nur dann, wenn mehrere Interrupt-Ereignisse zeitgleich anstehen!
also normalerweise ist das so geregelt (wahrscheinlich auch bei den AVRs), dass wenn ein interrupt geschieht, dieser abgearbeitet wird. folgt nun ein 2. interrupt und es gibt interrupt-prioritäten, so wird der erste interrupt vollständig fertig abgearbeitet falls dieser eine höhere priorität als interrupt 2 hat, und wenn dieser 1. interrupt fertig ist, wird gleich der 2. anschliessend abgearbeitet. sollte aber der 2. eine höhere priorität als der erste haben, der zum zeitpunkt des 2. im begriff des abarbeitens ist, so wird der 1. unterbrochen, der 2. vollständig abgearbeitet und dann in den 1. zurückgesprungen und dort weiter gemacht. alles klar?
Master Snowman wrote: > alles klar? Nein, du schaffst nur Verwirrung. Beim AVR gibt es nämlich keine echten Prioritäten. Läuft erstmal ein Interrupt, dann warten alle anderen.
Beim AVR gibt es keine Priorisierung von Interrupts. Es wird kein Interrupt für einen "hochwertigeren" unterbrochen. MfG Marius
aso. heisst wenn einer auftritt, müssen alle warten,. folglich wird der schnellste zuerst zum zeitpunkt 0 aufgerufen, danach der rest. mal angenommen der ADC ISR ist der schnellste, dann wird der abgearbeitet und nach dem abarbeiten folgt der zweit schnellste, das wäre zb der T0 ISR....ABER direkt danach folgt wieder ADC ISR, da er schneller als T2 ist oder? d.h. ist glückssache, ob der T2 ISR abgearbeitet wird oder nicht? sieh ich doch richtig so?
Benedikt K. wrote: > Master Snowman wrote: >> alles klar? > > Nein, du schaffst nur Verwirrung. Beim AVR gibt es nämlich keine echten > Prioritäten. Läuft erstmal ein Interrupt, dann warten alle anderen. Geschachtelte Interrupts sind aber dennoch moeglich. Man koennte weniger wichtige Interrupts wiederum unterbrechbar machen und wichtigere nicht. Echte Prioritaeten schafft man damit auch nicht, aber man koennte die Situation durchaus etwas verbessern. Man muss nur aufpassen, dass man sich keine schwer auffindbaren Fehler damit einhandelt.
Um es nochmal klar zu machen: läuft gerade ein Interrupt und es treten in dieser Zeit 2 oder mehrere andere Interruptanfragen auf, wird nach dem Abarbeiten des laufenden Interrupts mit genau dem Interrupt weitergemacht, der von den neu anstehenden Sprung-Adressen der Vektorentabelle die kleinste hat.
Gunter wrote: > aso. heisst wenn einer auftritt, müssen alle warten,. folglich wird der > schnellste zuerst zum zeitpunkt 0 aufgerufen, danach der rest. > mal angenommen der ADC ISR ist der schnellste, dann wird der > abgearbeitet und nach dem abarbeiten folgt der zweit schnellste, Nein, nicht unbedingt! Wenn während der Abarbeitung des ADC-Interrupts mehrere andere Interrupts auftreten, dann wird nach der Beendigung des Interrupt Handlers derjenige Interrupt abgearbeitet, der in der Vektortabelle am weitesten oben steht.
Jetzt kann er sich’s raussuchen. 50 Prozent der Antworten sind falsch oder an der Frage vorbei.
Michael G. wrote: > Geschachtelte Interrupts sind aber dennoch moeglich. Man koennte weniger > wichtige Interrupts wiederum unterbrechbar machen und wichtigere nicht. > Echte Prioritaeten schafft man damit auch nicht, aber man koennte die > Situation durchaus etwas verbessern. Man muss nur aufpassen, dass man > sich keine schwer auffindbaren Fehler damit einhandelt. Der OP hat das Interrupt-System an sich noch nicht verstanden, und Du kommst direkt mit unterbrechbaren Interrupts. Das verwirrt mindestens genauso wie das von Master Snowman. Lass es bitte. Übrigens: Hattest Du nicht letztens mal versprochen, Dich aus dem Forum zu verabschieden? Anders überlegt?
Johannes M. wrote: > Der OP hat das Interrupt-System an sich noch nicht verstanden, und Du > kommst direkt mit unterbrechbaren Interrupts. Das verwirrt mindestens > genauso wie das von Master Snowman. Lass es bitte. Du bitte auch - du haettest einfach Benedikts erste Antwort so stehen lassen koennen und alles waere gut gewesen :-(
Peter Stegemann wrote: > Du bitte auch - du haettest einfach Benedikts erste Antwort so stehen > lassen koennen und alles waere gut gewesen :-( Ich habe sie stehen gelassen (zumindest steht sie noch da!). Es gibt übrigens auch Dinge, die man durch einfaches Nachdenken selber lösen kann. Und mein erstes Posting sollte lediglich den OP dazu bringen, sich seine Frage noch mal durch den Kopf gehen zu lassen.
Gunter, nochmal ganz genau: 1) Es ist wurscht, in welcher Reihenfolge die Interrupts in Deinem Programm reingeschrieben sind. 2) Sobald eine ISR ausgeführt wird, wird das Global Interrupt Flag im Statusregister des Prozessors gelöscht, daher werden in der ISR, außer man erlaubt das ausdrücklich, keine weiteren Interrupts ausgeführt. 3) Tritt während des Ausführens einer ISR eine oder mehrere weitere Interruptbedingung/en auf, z.B. ein Timer Overflow, so merkt sich der µC das in entsprechenden Registern, für den Timer z.B. das Flag TOV im TIFR 4) Sobald die ISR verlassen wurde, werden anstehende Interrupts aus diesen Registern abgearbeitet. Wenn in mehreren Registern Interrupt Flags gesetzt sind, werden die entsprechenden Interrupts anhand ihrer Priorität laut Datenblatt abgearbeitet.
Johannes M. wrote: > Der OP hat das Interrupt-System an sich noch nicht verstanden, und Du > kommst direkt mit unterbrechbaren Interrupts. Das verwirrt mindestens > genauso wie das von Master Snowman. Lass es bitte. Du hast natuerlich recht. Indem wir ihn die Informationen verheimlichen kommt er deutlich besser weiter... Ausserdem hatte ich angemerkt dass man sich ueble Fehler einhandeln kann, wenn man dort nicht weiss, was man tut. In den meisten Faellen wird es auch kaum notwendig sein.
Eine Priorisierung von Interrupts beim AVR sind gesehen von der Hardware unmöglich. Der Kern beinhaltet eigentlich für die IRQs nicht mehr als die IRQ-Flags in den Registern + dem I-Flag im Status-Register. Wie MWS sagte, ist es unmöglich nach einer ISR zu sagen, welcher von zwei zusätzlich aufgetretenen Interrupts vorher ausgelöst wurde. Erstrecht hat man Probleme, wenn jeder Interrupt-Request wichtig ist. Denn wenn während einer langen ISR zwei Timer-Interrupts auftreten, erfährt man am Ende der ISR nur von einer. Das nur nebenbei. Das Post von MWS sollte alles geklärt haben.
D. W. wrote: > Wie MWS sagte, ist es unmöglich nach einer ISR zu sagen, welcher von > zwei zusätzlich aufgetretenen Interrupts vorher ausgelöst wurde. Das ist bei jedem Prozessor, den ich kenne, so. > Erstrecht hat man Probleme, wenn jeder Interrupt-Request wichtig ist. > Denn wenn während einer langen ISR zwei Timer-Interrupts auftreten, > erfährt man am Ende der ISR nur von einer. Das nur nebenbei. Wenn das 2 verschiedene Timer sind, dann bleiben beide erhalten. Nur dass eben die ISR mit der höheren Priorität vorher aufgerufen wird. Und warum glaubst Du, wird in diesem Forum immer wieder darauf hingewiesen, dass ISRs kurz sein sollen?
um die Verwirrung komplett zu machen kann man natürlich jeden Interrupt erstmal mit sofortigem RETI beenden. Sich eine Strukrur bauen wo alle Int. reingeschrieben und dann der Priorität entsprechen abgearbeitet werden. Wir bauen ein Interrupt Prioritätenregitser in Software. Oder man nimmt 8051, der kann das von Hause aus.
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.