www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt Reihenfolge? Atmega8L


Autor: Gunter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
First come, first serve.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

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

Autor: Norgan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: D. W. (dave) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Master Snowman (snowman)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marius Wensing (mw1987)
Datum:

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

MfG
Marius

Autor: Master Snowman (snowman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, wieder was dazu gelernt: danke.

Autor: Gunter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-(

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: D. W. (dave) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.