Was passiert, wenn z.B. beim ATmega8 ein RETI aufgerufen wird, ohne daß vorher ein Interrupt ausgelöst wurde?
F. P. schrieb: > Was passiert, wenn z.B. beim ATmega8 ein RETI aufgerufen wird, ohne daß > vorher ein Interrupt ausgelöst wurde? Es werden 2 Bytes vom Stack geholt, als Rücksprungadresse interpretiert und dort hingesprungen. Zusätzlich wird noch das I-Flag im Statusregister gesetzt, also Interrupts global freigegeben. Da ohne Interrupt oder (R)Call keine Rücksprungadresse auf den Stack gelegt wurde, dauert es nicht lange, bis der Stackpointer den Stack-Bereich verlässt und Unfug macht. Es ist also nicht zu empfehlen, ein RET(oder RETI) aufzurufen, ohne vorher ein (R)CALL oder Interrupt zu haben. ...
ohne vorbereitungen schießt du den controller programmtechnisch direkt ins nirvana. das ding crasht einfach. ansonsten wie schon gesagt wurde, wenn du ihm eine (gültige) adresse vom programm auf den stack packst und den RETI ausführst springt der controller an diese adresse und setzt das interruptflag. ein SEI und JMP sind aber der kürzere code als zwei PUSH und ein RETI.
Alles klar, danke. Es ist schön, daß es auch Leute gibt, die sinnvolle Antworten geben können. So ein lapidares "Versuchs einfach" finde ich arrogant. Wenn ich also zu Beginn eines Programms (Interrupts sind noch gesperrt) direkt per RCALL die ISR aufrufe, ist das ja so, als wenn ein Interrupt ausgelöst wurde. Das RETI am Ende der ISR läßt lt. Simulator das Programm anschließend wieder ganz normal nach dem RCALL fortsetzen und gibt gleichzeitig auch noch die Interrupts frei. So wie ich es verstanden habe, wird also das RETI in diesem Falle als normales RET "interpretiert" und man spart sich gleichzeitig noch das SEI.
> So wie ich es verstanden habe, wird also das RETI in diesem Falle als > normales RET "interpretiert" und man spart sich gleichzeitig noch das > SEI. Das ist richtig. Sowas sollte man aber erst tun, wenn man einen Wissensstand erreicht hat, der Deine Frage überflüssig macht. Denn bevor man mit solchen Tricks das Programm auf Kosten der Lesbarkeit des Quelltextes optimiert, sollte man die Basics souverän beherrschen. Leute, die die Welt mit ein paar Tricks blenden und beeindrucken, ohne die Grundlagen ihres Gewerbes zu kennen, gibt s bereits mehr als genug auf dieser Welt. Ich hoffe, Du willst nicht zu Denen gehören. ...
in diesem fall ist ein "versuchs einfach" gar nicht sooo abwegig. du kannst das programm ja beispielsweise im AVR studio simulieren, da siehst du ja was passiert. der test mit einem realen µC sagt dir nur, daß das ding abstürzt. nur warum weißt du dann nicht. ich denke mal sinnvoll nutzen kann man das nicht - außer zum beenden einer ISR. ich würde mit sowas erst anfangen wenn es die letzte möglichkeit ist den code in den flash zu quetschen indem man das byte für SEI einspart.
Ganz so unerfahren bin ich nun auch nicht mehr in Assembler. Es gibt halt trotzdem immer mal Sachen, die man so noch nicht kennt oder noch nicht ausprobiert hat. Meine Frage hatte sich daraus ergeben, daß ich bei einem Programm gerne nach dem Einschalten/Reset direkt die ISR aufgerufen haben wollte und nicht erst auf einen Interrupt warten wollte. Manuell ließ sich der Interrupt durch OCF1A nicht auslösen, sonst hätte ich es einfach so gelöst. Na gut, man hätte den Match-Wert zu Beginn direkt in das Zählregister schreiben können, aber das wären wieder ein paar Bytes mehr. Controller läuft so, wie er soll. Also alles in Butter. :)
Na denn ist's ja gut, Du musst Dir ja die Jacke nicht anziehen, wenn sie Dir nicht passt. Ich halte es aufgrund der Lesbarkeit des Quelltextes trotzdem für besser, die Initialisierung mit SEI abzuschließen. Aber Jeder hat eben seinen eigenen Stil (und wenn's nur Copy&Paste ist) und muss damit klar kommen. ...
du kannst eine ISR auch mit einem (r)call anspringen wenn du damit leben kannst, daß beim beenden das globale interruptflag gesetzt wird.
Hi
> Manuell ließ sich der Interrupt durch OCF1A nicht auslösen,...
Muss es ein Interrupt sein? Unter bestimmten Umständen könnte man das
'Force Output Compare-Bit' benutzen.
MfG Spess
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.