interrupt service routine

Gast #924604
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
Gast #924608
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 :-))
Gast #924614
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.
Gast #924619
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.
Gast #924627
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?
#924751
>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...
#925304
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
Gast #925315
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.