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.
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?
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.
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.
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.
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?
@ 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.
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
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.
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
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.
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
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...
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.
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 ;-)