mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik interrupt service routine


Autor: duron005 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: 3365 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In einer ISR sind Interrupts ueblicherweise gesperrt.

Autor: Haku (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 :-))

Autor: duron005 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wenn ich mich in der ISR der USART befinde, kommt ein ISR des Timers 
durch?

lg

Autor: duron005 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aha ok, ich muss also in der ISR der USART die interupts des timers 
wieder freigeben?

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: duron005 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok danke für eure antworten...ich denke ich weiß jetzt was ich zu tun 
habe:)

lg

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: duron005 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Rahul Der trollige (rahul)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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...

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du den Code dann hier wegen eines Fehlers reinstellst, kann es zur
Schelte kommen...

LOL... der war gut... X-D

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Jäger des gefährlichen Halbwissens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.