Kleine Frage zum Uhr-Tutorial

Gast #3714365
Lesenswert?

Morgen,
ich habe mir mal das Uhr Tutorial durch gelesen.
Allerdings auch nun ne Frage dazu. Es werden ja die Taktzyklen
gezählt. Bei einer bestimmten Anzahl wird ein Interrupt (Overflow) 
ausgelöst.

Werden im Falle eines Interrupts die Taktzyklen weiter gezählt?
Ansonsten hätte man ja nach jedem Interrupt wider einen Zeitlichen 
Versatz.
Gast #3714428
Lesenswert?

Hagrid schrieb:
> Werden im Falle eines Interrupts die Taktzyklen weiter gezählt?
> Ansonsten hätte man ja nach jedem Interrupt wider einen Zeitlichen
> Versatz.

Wenn du den CTC-Modus des Timers nutzt, dann zählt der hardwaremäßig 
hoch, ohne durch irgendwas gestört zu werden. Die Auslösung des 
Interrupts passiert auch automatisch beim Compare. Das heißt, durch dein 
Programm gehen auf keinen Fall Takzyklen verloren.
Gast #3714441
Lesenswert?

Das klingt ja ziemlich cool.
Danke! Hat mir sehr geholfen!
Was ist allerdings wenn das Programm so lange braucht, dass während 
dessen der Interrupt noch mal ausgelöst wird?
Das sollte bei der Uhr zwar nicht der Fall sein sein, wie sähe es dann 
bei längeren Programmen aus?
#3714507
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren