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 :)
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.
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.
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.