moin was passiert eigentlich mit dem Programmablauf des µC (mega8) wenn ein interrupt ausgelöst wird, während ein anderes noch behandelt wird (vor reti..) wird das sofort ausgeführt oder direkt nach dem anderen oder gar nicht wahrgenommen? Vielen Dank für Antworten, Felix
Das hatten wir schon einige Male hier, die Suche hilft dir sicher weiter...
Da hatter recht! - Aber sieh's wie der Highländer: "Es kann nur Einen geben"... Denkanstoß: Der ISR-Aufruf löscht das I-Flag im SREG, RETI ist wie RET, setzt aber zusätzlich das I-Flag im SREG. Jeder Interrupt hat ein Freigabebit (Maske) und ein Ereignis-Flag. ~
>wenn ein interrupt ausgelöst wird, während ein anderes noch behandelt wird >(vor reti..) Du wirst lachen: das läuft dann tatsächlich genau so, wie es im Datenblatt auf Seite 12 (reset and interrupt handling) detailliert beschrieben ist.
>Aber sieh's wie der Highländer: "Es kann nur Einen geben"...
Jawoll, Du paßt in die Welt! :-)
gez. Katapulski
>Da hatter recht! - Aber sieh's wie der Highländer: "Es kann nur Einen >geben"... quatsch in der ISR: sei .. und die ISR lässt sich durch eine anderen Int. unterbrechen! mfg Jens
Katpaulski wrote:
> Jawoll, Du paßt in die Welt! :-)
Stimmt, wie'n Schwein auf's Sofa...
~
> quatsch in der ISR: > sei > .. und die ISR lässt sich durch eine anderen Int. unterbrechen! Das machen nur Dumme und Leute, die wirklich durchblicken, und Letztere machen das auch nur im Ausnahmefall. Einem Anfänger sollte man Sowas nicht empfehlen, wenn man nicht bereit ist, das damit zerschlagene Geschirr zu ersetzen. ~
Jens wrote: > quatsch in der ISR: > > sei > > .. und die ISR lässt sich durch eine anderen Int. unterbrechen! Aber dann wenigstens ganz zu Anfang des UART-Interrupts, dann weiß man gleich, wie ein Stackoverflow wirkt. Peter
@ Sinusgeek >Das machen nur Dumme und Leute ... um das nicht aus dem Ruder laufen zu lassen. warum nicht? auch Anfänger nicht? wenn jede ISR, selbst die benutzten Register selbst sichert, MUß es doch gehen! Wenn nicht der µC an der max Rechenleistung angekommen ist! auch auf einem AVR Mega gez U880
Hi >Das machen nur Dumme und Leute, die wirklich durchblicken, und Letztere >machen das auch nur im Ausnahmefall. Einem Anfänger sollte man Sowas... Damit war ich als Anfänger vor über 25 Jahren auch konfrontiert. AVRs haben keine priorisierten Interrupts. Deswegen mag es hier einigen, die nichts anderes kennen, komisch vorkommen einen Interrupt durch einen Anderen zu unterbrechen. Bei anderen Architekturen ist das durchaus normal (z.B. Z80). Allerdings wird das das dann in die Hose gehen, wenn, wie hier im Tutorial favorisiert, ein Register zur Sicherung von SREG verwendet wird. Das wird dann gnadenlos überschrieben. Bei einer Sicherung aller verwendeten Register, incl. SREG auf den Stack gibt es mit geschachtelten Interrupts keine prinzipiellen Probleme. Timing ist eine andere Sache. MfG Spess
Spess, die Frage bezog sich eindeutig auf den Mega8 (siehe ersten Beitrag), daher bezog sich meine Aussage ausschließlich auf AVRs. Ja, ich habe das auch schon gemacht (Tiny15, Software-ICP mit Int0 und Timer1, Timer0-ISR gab Interrupt sofort wieder frei), aber das will auf dem AVR recht genau durchdacht sein. ~
Hi >die Frage bezog sich eindeutig auf den Mega8 > aber das will auf dem AVR recht genau durchdacht sein. Ich weiss nicht, was man durchdenken muss, wenn man zu Beginn einer Routine alle Register, die verwendet werden sichert, und am Ende wieder zurückschreibt. MfG Spess
Hallo! Die Assemblerprogrammierer der alten Schule können da nur lächeln. Schließlich sind sie zu jeder Zeit "Herr" über den Prozessor und damit der Situation. Jeder Gedanke: was könnte meine Variante des Compilers xyz aus dem Quellcode zaubern, oder hat gerade die Variante 14.5.7.3b einen Bug ? - erübrigt sich. Es ist sicher nicht die feine englische Art, Interrupts durch Interrupts gewollt zu unterbrechen, den Profiprogrammierer läßt das aber kalt. Schließlich kann jener auch gekonnt "ungeplante" INTs z.B. von Spannungsüberwachungen (Brown Out) oder externen Wachhunden (wofür auch immer) jederzeit ohne Systemversagen beherrschen. Zusammengefasst: Der Programmierer hat es in den (Hard- und Software-)Grenzen des Systems in der Hand. Aber VORSICHT !!! [Beispiel Z80 ist gut!!!]
Maximal ein Interrupt wird per Flag vorgemerkt, dann wird mindestens ein Befehl des Hauptprogramms ausgefuehrt und sodann der vorgemerkte Interrupt ausgeloest. Treten mehr als ein Interrupt auf, so gehen diese verloren (es kann nur einer vorgemerkt werden). Nested Interrupts zu programmieren ist eher nicht empfehlenswert.
>es kann nur einer vorgemerkt werden
Man sollte vielleicht noch dazusagen: Einer der gleichen Art. Dagegen
kann problemlos ein ADC-Complete- und ein Ext-Int-0- und ein Ext-Int-1-
und ein EEPROM-Ready- und ein Timer0-Overlow-Interrupt gleichzeitig
"pending" sein. Als erstes ausgeführt nach der I-Freigabe wird dann
übrigens der Ext-Int-0, weil er in der Interruptvektor-Liste am
weitesten oben steht.
> 2 interrupts gleichzeitig
Auf so einem Prozessor passiert immer nur 1 Befehl gleichzeitig. Alle
anderen Befehle haben sich hinten anzustellen.
Soviel zum Thema gleichzeitig.
>Auf so einem Prozessor passiert immer nur 1 Befehl gleichzeitig.
Auf so einem Prozessor können in seinen I/O-Registern problemlos mehrere
Bits gleichzeitig gesetzt sein, und das ist der Fall, wenn mehrere
Interrupts vorgemerkt sind. Z. B. Bit ADIF im Register ADCSRA, und Bit
TOV0 im TIFR, und Bit WDIF im WDTCSR.
Dass Interrupthandler nicht parallel ausgeführt werden, war dem
Fragesteller glaube ich schon klar :-)
Hi >Auf so einem Prozessor passiert immer nur 1 Befehl gleichzeitig. Alle >anderen Befehle haben sich hinten anzustellen. >Soviel zum Thema gleichzeitig. Entschuldige mal. Dieses Wissen setze ich voraus. MfG Spess
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.