Hallo allerseits,
ich hätte da eine kleine Verständlinsfrage zur Atmel-Architektur:
Wenn ich mit cli die Interrupts deaktiviere und z.B. ein Timer-Overflow passiert (Timer läuft ja weiter), wird kein Interrupt gefeuert. Eigentlich wird doch aber das Interrupt-Flag gesetzt, oder?
Wenn ich dann nach einigen (zeitkritschen) Schritten die Interrupts mit sei wieder aktiviere, wird dann der Timerx_Overflow gefeuert, oder "verpufft" der Interrupt, wenn ich ihn nicht manuell prüfe?
Wo ich schon dabei bin: Bei der alten 8051-Reihe war es noch so, dass der Interrupt bis zu 8 Maschienzyklen versetzt gefeuert wurde. Kann das bei den Megas auch passieren oder wird der Spung in den Interrupt-Vektor beim nächsten Takt ausgeführt?
MfG
Christian
Nix puff. Mit sei() wird die Kiste wieder scharf und holt alle interrupts (in ihrer Priorität) nach.
Die laufende Instruktion wird immer fertig gemacht. Dann wird der Prog-Counter gepusht (4 Cyclen) und die Instruktion am Iterrrupt Vector wird ausgeführt. Da das meist ein far-jump ist, sind es wohl nochmal 2 cyclen.
Diese "verlorenen" Cyclen sind aber immer gleich, du kannst sie (bei Timern) einrechnen.
Ungewiss ist nur, ob die laufende Instruktion einen zweiten Fetch drinnen hat.
Bei einem Neumann-Prozessor ist das immer etwas unsicherer, da jeder Befehl eine verschiedene Anzahl Takten braucht.
Steht aber klitzeklein im Datasheet.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Lesezeichen