PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Stören sich zwei Timer Interrupts gegenseitig?



12.06.2004, 16:26
Hallo

Folgende frage, ich habe zwei Timer (Timer0 und Timer1). Wenn z.B. die Interrupt-Routine von Timer0 gerade abgearbeitet wird und jetzt bei Timer1 ebenfalls ein Overflow auftritt, was passiert dann mit diesem Interrupt aufruf? Verfällt der Interrupt, oder wird die Interrupt-Routine von Timer0 unterbrochen.

Mir wäre es am liebsten, wenn man dem Timer1 eine Priorität zuweisen könnte, der Timer1 Overflow kann die Timer0 Interrupt-Routine unterbrechen umgekehrt aber nicht. Geht das?

Hintergrund, ich proge gerade eine Uhr. Der Timer0 ist für die Multiplexausgabe auf die Siebensegment Anzeige zuständig, Timer1 für die Zeitbasis. Jetzt sollte natürlich die Multiplexausgabe nicht die Zeitbasis stören.

Danke

Wolfgang

ads
13.06.2004, 14:32
Kommt ganz auf dein Betriebssystem an, würde ich sagen.

Es gibt unterbrechenbare Interrupts und nicht unterbrechenbare Interrupts.
Alles in allem ist dazu aber zu sagen: wenn der zweite Interrupt den ersten unterbricht, sollte der zweite abgearbeitet werden, danach beim ersten weiter gearbeitet werden, wo die Unterbrechung auftrat und wenn das Stück Code auch abgearbeitet ist, sollte zurück ins eigentliche Programm gesprungen werden.
Auf die Art und Weise kommen sich die Interrupts nicht ins Gehege.

Hinzuzufügen wäre noch, das man den Programmcode für Interrupt Routinen aus genau jenem Grund möglichst kurz halten sollte. Problematisch kann es nämlich werden, wenn der Interrupt wieder ansteht, während der letzte noch abgearbeitet wird.

Ansonsten: probiers einfach mit einem kurzen Programm aus ...
Warte in der ersten Interrupt Routine eine sehr lange Zeit, so das der zweite auch garantiert in dieser Zeit auftritt. Dann siehst du, was passieren wird.

13.06.2004, 22:37
am Bsp. ATMega16 (wobei ich mich gern korrigieren lassen, da ich mir bei dem Thema nicht sicher bin):

Wenn ich die Referenz dazu richtig verstehe, kann ein Interrupt einen anderen Interrupt der gleichen Priorität im Normalfall nicht unterbrechen. Prioritäten kann man zuweisen, aber das dient eher dazu bei 2 gleichzeitig auftretenden Interrupts dem einen den Vorzug zu geben. Der Interruptvektor, welcher zuerst in der Vektortabelle steht bzw. aufgerufen wird, hat die höhere Priorität. Wird dieser aufgerufen, wird die Interruptabhandlung deaktiviert und erst wieder beim Beenden des Interrupts aktiviert. Das Interrupt-Flag des zweiten Interrupts wurde derweilen gespeichert und dieser Interrupt wird erst nach Beenden des ersten Interrupts ausgeführt.

Will man einen Interrupt unterbrechen, muss man in diesem mittels Code das Bit für die Interruptabhandlung aktivieren. Wird ein zweiter Interrupt ausgelöst, wird der erste unterbrochen und der zweite ausgeführt. Danach der erste fortgesetzt.

mfg

lat
14.06.2004, 00:20
der letzte Eintrag ist von mir .. nicht von Gast
/lat