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.
:
Bearbeitet durch User
Eine ISR dauert sicher keine Sekunde, sondern nur ein paar Mikrosekunden.
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?
hey schrieb: > Eine ISR dauert sicher keine Sekunde, sondern nur ein paar > Mikrosekunden. Und die: ISR(Vector_x) { _delay_ms(1001); }
Gustav M. schrieb: > Was passiert jetzt aber, wenn die ISR selbst 1 s bis zum Durchlaufen > braucht. Dann machst Du grundsätzlich was falsch.
@ 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
bal schrieb: >@ Takao K.: >Was bist denn du fürn Vogel?..... Volle Zustimmung.
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 ;-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.