Hagrid schrieb:
> Was ist allerdings wenn das Programm so lange braucht, dass während
> dessen der Interrupt noch mal ausgelöst wird?
Ein AVR sperrt Interrupts, wenn er in die ISR springt. Die ISR kann also
von keinem (auch nicht ihrem eigenen) Interrupt unterbrochen werden. Die
ISR läuft also bis zum Ende durch und sobald am Ende Interrupts wieder
zugelassen sind, wird sie durch den anstehenden Interrupt gleich wieder
ausgelöst. Falls während der Ausführung der ISR der Interrupt gleich
mehrmals auslösen sollte, dann werden alle diese Auslösungen zu einer
zusammengefaßt (es gibt nur ein Bit, das speichert ob ein Interrupt
ausgelöst hat, nicht mehrere, um die Anzahl mitzuzählen).
Prinzipiell kann man in einer ISR Interrupts wieder zulassen. Das ist
z.B. sinnvoll, wenn man mehrere ISR hat, manche davon selten aufgerufen
werden und lang sind, andere hingegen oft aufgerufen werden und kurz
sind. Dann kann man in der langen ISR Interrupts wieder erlauben (sei)
und sie so von anderen Interrupts unterbrechen lassen.
Wenn in dieser Konstellation die ISR von ihrem eigenen Interrupt
unterbrochen wird, dann können alle möglichen schlimmen Dinge geschehen.
Z.B. wird sie sich ihre eigenen statischen Variablen zerschießen. Und
wenn das oft genug hintereinander passiert (z.B. wenn das der
Timer-Überlauf Interrupt ist) dann wird früher oder später der Stack
überlaufen, die Variablen überschreiben und am Ende alles abstürzen.
XL