Forum: Mikrocontroller und Digitale Elektronik was passiert, wenn der Overflow schneller ist als seine eigen ISR?


von Gustav M. (Gast)


Lesenswert?

Hallo du smartes Forum,

Ich wette die Frage gab es nicht nur ein Mal bis jetzt: Unterbricht ein 
Timer sein eigenes Interrupt?

Mal angenommen der Timer läuft im Compare-Match-Mode. Der Timer ist so 
programmiert, dass er jede 0,5 s ein und den gleichen Interrupt auslöst. 
Was passiert jetzt aber, wenn die ISR selbst 1 s bis zum Durchlaufen 
braucht.

Wird die ISR jetzt alle 0,5 s durch sich selbst unterbrochen, weil der 
Overflow früher kommt als die ISR zum Ende kommt? Oder löst der Overflow 
erst erneut ein Interrupt aus sobald die IST vollendent ist?

FG
Gustav M.

von Takao K. (takao_k) Benutzerseite


Lesenswert?

Gustav M. schrieb:
> Hallo du smartes Forum,
>
> Ich wette die Frage gab es nicht nur ein Mal bis jetzt: Unterbricht ein
> Timer sein eigenes Interrupt?
>
> Mal angenommen der Timer läuft im Compare-Match-Mode. Der Timer ist so
> programmiert, dass er jede 0,5 s ein und den gleichen Interrupt auslöst.
> Was passiert jetzt aber, wenn die ISR selbst 1 s bis zum Durchlaufen
> braucht.
>
> Wird die ISR jetzt alle 0,5 s durch sich selbst unterbrochen, weil der
> Overflow früher kommt als die ISR zum Ende kommt? Oder löst der Overflow
> erst erneut ein Interrupt aus sobald die IST vollendent ist?
>
> FG
> Gustav M.

Lies dir doch mal dass Datenblatt 10 bis 20 mal durch, dann wirst du es 
wissen. Zumeist aber 2., also innerhalb des Interrupts bis ein 
IRET,RETFIE etc. erfolgt, gibt es keinen weiteren Interrupt. Nach einem 
IRET, RETFIE, etc. wird dann sofort wieder ein Interrupt ausgefuehrt und 
selbst wenn es funktionieren sollte, ist es grottenschlechte 
Programmierung.

Du kannst dies ja einmal mit einem Softwaresimulator ausprobieren. Was 
verwendest du denn so oder ist dies nur eine theoretische Frage?

von Takao K. (takao_k) Benutzerseite


Lesenswert?

Gustav M. schrieb:
> Hallo du smartes Forum,
>

Kannste dir sparen.

>Ich wette die Frage gab es nicht nur ein Mal bis jetzt:

Denk mal darueber nach wenn es alle so machen.
Und jetzt mal schoen nachlesen: 
http://de.wikipedia.org/wiki/Bairische_Dialekte

wehe die Aussprache stimmt nachher nicht. Dann bekommst du kein 
Paulaner.

>
> FG
> Gustav M.

Is ja total interessant wenn du das jedesmal ausschreibst. Kannste ja 
hier z.B. mal ne' Benutzerseite anlegen. Wer das lesen will, kann diese 
aufsuchen.

von Gustav M. (Gast)


Lesenswert?

Takao K. schrieb:
> Lies dir doch mal dass Datenblatt 10 bis 20 mal durch, dann wirst du es
> wissen. Zumeist aber 2., also innerhalb des Interrupts bis ein
> IRET,RETFIE etc. erfolgt, gibt es keinen weiteren Interrupt. Nach einem
> IRET, RETFIE, etc. wird dann sofort wieder ein Interrupt ausgefuehrt und
> selbst wenn es funktionieren sollte, ist es grottenschlechte
> Programmierung.

Zunächst danke für dein hilfreiche Antwort. Ich habe mal innerhalb 
meines PDF-Vierwer "IRET" UND "REFTIR" ins Suchfeld eingegeben. Dabei 
kam kein Ergebnis heraus.

Ich arbeite nur gerade mit dem Visual studio etwas. Noch ist nichts 
vernünftiges dabei entstanden. Außer ein paar Einsichten und Fragen.


Meine Begrüßung war zwar etwas locker, aber nicht ironische oder anders 
böswillig. Ich wollte damit nur zum Ausdruck bringen, wie ich das Forum 
finde.

Ich finde es lustig, dass du mir ein Link aus wikipedia schickst über 
bayrische Dialekte.


Ich nehme also an, dass "smart" vlt. ein Schimpfwort in Bayern ist? Oder 
warum schickst du mir so einen Artikel. Nicht gegen Bayern, ich finde es 
dort unten wirklich schön.

Ich bleib dabei:

FG
Guszav M.

von Takao K. (takao_k) Benutzerseite


Lesenswert?

Ja klar kannste schreiben was du willst. Ist nur meine Meinung.

Visual Studio aha, da gibt es keine sog. ISR
Aber vielleicht kannst Du ja schon Windows programmieren.

Timer gibt es schon. Und richtiges Multitasking. Wenn die Verarbeitung 
zu lange dauert, macht es keinen Sinn an sich.

Ja klar, einfach mal im PDF viewer eingeben, vielleich informierst du 
das smarte Forum noch, was fuer einen Kontroller du denn verwendest bzw. 
welches Betriebssystem/Programmiersprache.

Auf dem 8085 oder vielleicht Z80, gibt es z.B. EI und DI (Enable 
Interrupt und Disable Interrupt). Dieser wird in bestimmten Routinen 
einfach mal kurzerhand abgestellt.

Mikrokontroller, ist es aehnlich, gibt es z.B. ein GIE (Global Interrupt 
Flag), welches du auf 0 oder 1 setzen kannst.

u.U. sind Interrupts sehr nervig, jedesmal muss "Zeugs" (in Bayern 
heisst das glaube ich Geraffel) abgespeichert werden und dass kostet 
viel Zeit.

Am besten ist es, den Interrup sofort wieder zu verlassen, und die 
Nachricht dass dieser ausgeloest wurde, an ein Zeitscheibensystem 
weiterzuleiten.

Geht schon mit ca. 30 Zeilen C ohne weiteres.

Dann kann es zwar sein, dass die Nachricht nicht schnell genug 
verarbeitet wird, aber die Interrupts kommen nicht durcheinander.

Wenn du einen LED matrix refresh betreibst, kannst du dann u.U. sehen, 
dass es zu flackern beginnt, weil der Prozessor nicht mehr schnell genug 
nachkommt.

: Bearbeitet durch User
von hey (Gast)


Lesenswert?

Eine ISR dauert sicher keine Sekunde, sondern nur ein paar 
Mikrosekunden.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

hey schrieb:
> Eine ISR dauert sicher keine Sekunde
Garantiert. Höchstens es hätte einer zwei delay_ms(500) 
reingeschrieben...

Gustav M. schrieb:
> Unterbricht ein Timer sein eigenes Interrupt?
Das kann man erst beantworten, wenn man folgendes weiß:
Welcher uC? Kann man bei diesem Controller die Interruptprioritäten 
ändern? Wird in der ISR an den Interruptprioritäten gedreht? Wird in der 
ISR am Interrupt-Enable herumgemacht?

von Sitterbüss (Gast)


Lesenswert?

hey schrieb:
> Eine ISR dauert sicher keine Sekunde, sondern nur ein paar
> Mikrosekunden.

Und die:

ISR(Vector_x)
{
    _delay_ms(1001);
}

von Rudolph (Gast)


Lesenswert?

Gustav M. schrieb:
> Was passiert jetzt aber, wenn die ISR selbst 1 s bis zum Durchlaufen
> braucht.

Dann machst Du grundsätzlich was falsch.

von bal (Gast)


Lesenswert?

@ den TE:
Da du keinen konkreten Prozessor nennst kann man das so pauschal nicht 
sagen.

Beispiel ATmega:
Wenn ein Interrupt auftritt während ein anderer noch läuft so wird der 
aktuelle noch fertig abgearbeitet (im Normalfall, findige Programmierer 
können dies auch umgehen). Erst danach wird der neue Interrupt 
ausgeführt, wobei aber noch genau 1 Takt der Hauptschleife abgearbeitet 
wird.
Das ist erstmal in Ordnung soweit. Multiplexing-Anwendungen oder 
Soft-PWMs werden kurz flimmern.
Schlimmer wirds, wenn eine Timer-ISR, so wie in deinem Beispiel, länger 
dauert als ihre Zykluszeit. Dann geht nämlich ein Interrupt verloren. 
Das kann unter Umständen die ganze Programmlogik durcheinander bringen.

@ Takao K.:
Was bist denn du fürn Vogel?
Seid du in diesem Forum aufgeschlagen bist sonderst du nur Müll oder 
gefährliches Halbwissen ab. (z.B. "Mainloop-Thread").
Was soll dein zeilenweises zitieren und Text auseinanderpflücken? Soll 
das cool kommen? Willst einen auf Falk Brunner machen? Bei dem kommen 
aber wenigstens brauchbare Infos raus.
Mein Tipp: du hast grad fertig studiert, darfst jetzt irgendwo bisl 
Embedded spielen und hälst dich für den Oberprogrammierer.

von Mr.T (Gast)


Lesenswert?

Hallo Gustav M.,

wenn du alle 0,5 sec ein Programmabschnitt ausführen willst, welches 
1sec braucht ist dein µC zu langsam.
Sollte man sich also vorher überlegen ob das was man will so auch 
machbar ist.

Bei Controllern gibt es auch für die verschiedenen Interrupts sogenannte 
Prioritäten, wobei eine laufende ISR nur von einem Interrupt höherer 
Priorität unterbrochen werden kann.

So ist es jedenfalls bei dem µC mit dem ich mich im Moment beschäftige.

Wählt man sich einen Controller für ein Projekt aus sollte man das 
Datenblatt gründlich lesen bis man es verstanden hat.
Ich lese mir desweiteren auch die Dokus zu IDE, Assembler, Linker und 
Compiler durch allerdings nicht so gründlich wie das Datenblatt.

Ich mags auch nich wenn mein Prog funktioniert, ich aber nicht weiß 
warum.

Mfg
Mr.T

von Big Endian (Dickes Ende) (Gast)


Lesenswert?

bal schrieb:
>@ Takao K.:
>Was bist denn du fürn Vogel?.....

Volle Zustimmung.

von Udo S. (urschmitt)


Lesenswert?

Wenn du eine ISR mit einer Sekunde Dauer programmierst, dann ist das so, 
als ob dein Arbeitgeber dir eine 500 Stunden Schicht zuweist.
Das ist Schwachsinn!
Also schmeiss die delay() aus deiner ISR und lerne mit Timern umzugehen.

von fgd (Gast)


Lesenswert?

meine güte hängt euch doch nicht so an der einen Sekunde auf, das war 
offensichtlich als Beispiel genannt. Nehmt halt 1µs Abarbeitungszeit und 
ein Aufrufintervall von 0.5µS

von Peter D. (peda)


Lesenswert?

Ganz allgemein, Interrupts können sich nicht selber unterbrechen. Dazu 
braucht es je nach MC-Typ spezielle Hacks.

Falls Interrupts zu schnell kommen, wird er eben nach dem RETI sofort 
wieder angesprungen.
Einige MCs (AVR, 8051) machen aber mindestens einen Main-Befehl 
dazwischen, d.h. das Main ist nicht ganz tot, es wird nur sehr langsam.

von Axel S. (a-za-z0-9)


Lesenswert?

Peter Dannegger schrieb:
> Ganz allgemein, Interrupts können sich nicht selber unterbrechen. Dazu
> braucht es je nach MC-Typ spezielle Hacks.

Das würde ich so nicht sagen, das hängt nämlich arg von der Architektur 
ab. Bei der Haus-und-Hof-Architektur dieses Forums, den AVR 8-Bittern 
ist es in der Tat so, daß beim Einsprung in eine ISR die CPU das globale 
Interrupt-Enable Flag löscht und so weitere Interrupts verbietet. Der 
"Hack" besteht dann aus einem simplen sei() innerhalb der ISR. Und das 
ist hin und wieder auch nötig, weil das globale Sperren von Interrupts 
eine Holzhammermethode ist.

Was man nämlich eigentlich will, ist zu verhindern daß die ISR durch 
ihren eigenen Interrupt nochmal unterbrochen wird. Das führt im 
günstigsten Fall dazu, daß der Stack überläuft und das Programm 
abstürzt. Ich nenne diesen Fall günstig, weil der Fehler hier sehr 
offensichtliche Auswirkungen hat. Im ungünstigen Fall passiert das nur 
ab und zu. Dann läuft zwar der Stack nicht über, aber die ISR wird 
vermutlich argen Mist bauen, weil ISR in aller Regel nicht reentrant 
sind (diesen Begriff notfalls bei Wikipedia nachschlagen).

@TE: bei den AVRs ist das Standardverhalten im von dir beschriebenen 
Fall, daß Interrupts "verschluckt" werden. Wenn nur ein Interrupt 
während der Laufzeit der ISR kommt, wird nach der normalen Beendigung 
der ISR die ISR gleich wieder (verspätet) ausgeführt. Wenn während der 
Laufzeit der ISR zwei oder noch mehr Interrupts kommen, was wegen der 
verspäteten Ausführung schon beim 3. Interrupt passieren kann, dann 
werden alle bis auf einen einfach ignoriert.

Ein weiterer Nebeneffekt ist, daß außer der ISR praktisch kein weiterer 
Code ausgeführt wird. Es sieht dann von außen so aus, als würde main() 
gar nicht ausgeführt werden.


HTH, XL

von Takao K. (takao_k) Benutzerseite


Lesenswert?

bal schrieb:

> @ Takao K.:
> Was bist denn du fürn Vogel?
> Seid du in diesem Forum aufgeschlagen bist sonderst du nur Müll oder
> gefährliches Halbwissen ab. (z.B. "Mainloop-Thread").
> Was soll dein zeilenweises zitieren und Text auseinanderpflücken? Soll
> das cool kommen? Willst einen auf Falk Brunner machen? Bei dem kommen
> aber wenigstens brauchbare Infos raus.
> Mein Tipp: du hast grad fertig studiert, darfst jetzt irgendwo bisl
> Embedded spielen und hälst dich für den Oberprogrammierer.

Du hast doch nichtmal eine Website z.B. mit source codes.

Ausserdem habe ich bereits vielen geholfen Zeit und Geld zu sparen.

Am besten ist es noch bereits vorhandene Antworten nochmal zu schreiben, 
vielleicht ist es ja besser lesbar. DU machst sowas natuerlich nicht...

von Ich (Gast)


Lesenswert?

Takao K. schrieb:
> Du hast doch nichtmal eine Website z.B. mit source codes.

Hihi, ist das jetzt Voraussetzung hier was schreiben zu dürfen?

Der Umgangston hier ist eh schon grenzwertig aber manche schießen den 
Vodel ab.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Takao K. schrieb:
> Du hast doch nichtmal eine Website z.B. mit source codes.

Also ich fürchte, einem dermaßen geballten Kompetenzbeweis müssen wir 
uns einfach geschlagen geben ;-)

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.