Interrupt Reihenfolge? Atmega8L

Gast #1198941
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 :)
Gast
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?
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?
Gast
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?
Persönliche Seite
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.
(Firma: TravelRec.) Persönliche Seite
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?
Gast
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.
Gast
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.
Persönliche Seite
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.
Persönliche Seite
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.