Hallo zusammen, Bevor ich da anfangen testprogramme zu schreiben. kann mir jemand sagen, was passiert wenn sich der kontroler in der ISR befindet und ein erneuter interrupt (der gleiche interupt, der in die ISR führte) ausgeloest wird? Startet die ISR dann wieder von anfang der ISR? danke und lg
Kommt drauf an... der AVR wird nach Betreten einer ISR sofort alle Interrupts (alle!) sperren. Wenn du die von Hand in der ISR wieder freigibst, kannste natürlich sofort wieder in irgendwelche ISRs reinlaufen (und evtl. auch Stacküberläufe produzieren :-))
Und wenn ich mich in der ISR der USART befinde, kommt ein ISR des Timers durch? lg
aha ok, ich muss also in der ISR der USART die interupts des timers wieder freigeben?
nein, nicht die des Timers, sondern das (globale) I-flag im PSW. Bei UART-Interrupt ist zumindest zeitlich ziemlich unkritisch, aber du solltest schon verstehen, was du tust.
ok danke für eure antworten...ich denke ich weiß jetzt was ich zu tun habe:) lg
Na, dann viel Erfolg. Denk aber hauptsächlich an den Stack, insbesondere, wenn du in C (oder einer anderen Hochsprache) programmierst. Je nachdem, was alles gesichert wird beim Eintritt in eine ISR (manche Compiler gehen da blind mit dem grossen Besen drüber) kann das insbesondere bei wenig freiem RAM ins Auge gehen, und der Compiler gibt nicht mal ne Warnung aus, weiss ja nicht, dass doppelt gesichert wird. Und immer vom worst-case ausgehen, also beide Interrupts in max. Schachtelungstiefe des Hauptprogramms - was passieren kann, passiert auch irgendwann. Schwer zu finden, so eine Fehlfunktion, die alle paar Tage oder Wochen auftritt. Schiebt man dann meist erstmal der Stromversorgung und/oder ESD-Einflüssen zu.
jetzt ist mir aber doh noch etwas eingefallen. wenn ich in der ISR der USART bin, und erneut ein solcher interrupt ausgeloest wird? was passiert dann eigentlich?
>was passiert dann eigentlich? Er wird ignoriert. Das sollte aber nie passieren, weil man in ISR nicht so viel Programm stehen haben sollte, dass die ISR zu lange braucht. >was passiert dann eigentlich? Wenn du den Code dann hier wegen eines Fehlers reinstellst, kann es zur Schelte kommen...
Wenn du den Code dann hier wegen eines Fehlers reinstellst, kann es zur Schelte kommen... LOL... der war gut... X-D
duron005 wrote: > aha ok, ich muss also in der ISR der USART die interupts des timers > wieder freigeben? Kawoum und schon hast Du Deinen Stack abgeschossen. Der UART-Interrupt löscht nicht das Interruptflag! Du mußt also erstmal den UART-Interrupt disablen, ehe Du den globalen Interrupt wieder freigeben kannst. In der Regel ist es aber günstiger, wenn der UART-Interrupt die Bytes erstmal schnell in einen FIFO schreibt. Dann kann das Main die Bytes in Ruhe auswerten und andere Interrupts werden nicht verzögert. Beitrag "AVR-GCC: UART mit FIFO" Peter
Seid ihr wahnsinnig? Man empfielt einsteigern nicht, in irgendeiner ISR die interrupts wieder freizugeben, man sollte diese Möglichkeit gar nicht erst erwähnen! Das scheint einfach zu verlockend, und ist für Anfänger aber kaum zu durchblicken was da passiert. In 99,9% der Fälle ist es auch gar nicht nötig, verschachtelte Interrupts zu konstruieren.
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.