Forum: Mikrocontroller und Digitale Elektronik Interrupt Reihenfolge? Atmega8L


von Gunter (Gast)


Lesenswert?

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

von MWS (Gast)


Lesenswert?

First come, first serve.

von Benedikt K. (benedikt)


Lesenswert?

Und für den Fall, dass mehrere Interrupts gleichzeitig auftreten wird es 
der Reihe nach gemacht, wie die Interruptvektoren im Datenblatt stehen.

von Norgan (Gast)


Lesenswert?

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.

von Johannes M. (johnny-m)


Lesenswert?

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?

von D. W. (dave) Benutzerseite


Lesenswert?

"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.

von Johannes M. (johnny-m)


Lesenswert?

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!

von Master S. (snowman)


Lesenswert?

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?

von Benedikt K. (benedikt)


Lesenswert?

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.

von Marius W. (mw1987)


Lesenswert?

Beim AVR gibt es keine Priorisierung von Interrupts. Es wird kein 
Interrupt für einen "hochwertigeren" unterbrochen.

MfG
Marius

von Master S. (snowman)


Lesenswert?

ok, wieder was dazu gelernt: danke.

von Gunter (Gast)


Lesenswert?

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?

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

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.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

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.

von Johannes M. (johnny-m)


Lesenswert?

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.

von Gast (Gast)


Lesenswert?

Jetzt kann er sich’s raussuchen. 50 Prozent der Antworten sind falsch 
oder an der Frage vorbei.

von Johannes M. (johnny-m)


Lesenswert?

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?

von P. S. (Gast)


Lesenswert?

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 :-(

von Johannes M. (johnny-m)


Lesenswert?

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.

von MWS (Gast)


Lesenswert?

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.

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

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.

von D. W. (dave) Benutzerseite


Lesenswert?

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.

von Klaus F. (kfalser)


Lesenswert?

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?

von Stephan H. (stephan-)


Lesenswert?

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
Noch kein Account? Hier anmelden.