Forum: Mikrocontroller und Digitale Elektronik rjmp aus Interrupt/Unterprogramm


von Dussel (Gast)


Lesenswert?

Moin,
habe mal wieder eine Frage:
Ich möchte bei einem Programm in einem Unterprogramm eine Bedingung 
testen und je nach Ergebnis mit ret zurückspringen oder mit rjmp bei 
einer Marke weitermachen. Im Programm gibt es damit keine Probleme, also 
es kann dadurch nichts Unvorhergesehenes eintreten. Was muss ich machen 
um nach dem rjmp wieder 'aufzuräumen', also zum Beispiel die 
Rücksprungadresse aus dem Stack zu löschen?
Was müsste ich machen, wenn ich das gleiche aus einem Interrupt mache, 
außer mit sei die Interrupts wieder zu aktivieren?
Dussel

von Benedikt K. (benedikt)


Lesenswert?

Du musst 2 Werte aus dem Stack löschen, im einfachsten Falls 2x pop oder 
den Stackpointer und 2 erhöhen. Beim Verlassen aus dem Interrupt 
zusätzlich noch die Interrupts einschalten.

von crazy horse (Gast)


Lesenswert?

man kan es hintricksen, sollte aber nicht.
Jede Funktion hat nur einen einzigen Ausgang, und der heisst return.
Niemand hindert dich, in einer Funktion eine andere aufzurufen (ok, 
irgendwann der stack), oder innerhalb der Funktion vor Rückkehr weiter 
innerhalb der Funktion zu verzweigen.
Konstrukte, die du da vor hast, funktionieren zwar, sind aber nicht 
wartbar/nach 1 Jahr unverständlich. Es bringt nichts, macht Probleme, 
warum sollte man es tun??

von Dussel (Gast)


Lesenswert?

Die Übersichtlichkeit ist kein Problem, weil das in einem Block des 
Programms vorkommt. Ist wie goto in Programmiersprachen, sollte man 
nicht verwenden, manchmal ist es aber praktisch.
Muss ich dann, um den Stackpointer zu erhöhen, SPH+SPL um zwei erhöhen?
Dussel

von Dussel (Gast)


Lesenswert?

PS: im ATMega8

von AVRFan (Gast)


Lesenswert?

Mein Rat: Verwende Deine Energie darauf, Dir eine "konventionelle" 
Lösung zu überlegen, und entscheide Dich für diese. Damit sparst Du Dir 
viele Nerven.

von Karl H. (kbuchegg)


Lesenswert?

Dussel wrote:
> Die Übersichtlichkeit ist kein Problem, weil das in einem Block des
> Programms vorkommt. Ist wie goto in Programmiersprachen, sollte man
> nicht verwenden, manchmal ist es aber praktisch.
> Muss ich dann, um den Stackpointer zu erhöhen, SPH+SPL um zwei erhöhen?
> Dussel

In der Zeit, die der Mega8 braucht um den Stackpointer manuell
zurpclzusetzen und zurückzuspringen, kann er genausogut deinen
(einzigen) ret anspringen, der dann den Stackpointer aufräumt.

Ergo: Da es zeitlich völlig egal ist, ist es besser sich an
die Konvention zu halten: Es gibt nur einen Ausstieg aus
einer Funktion. Will eine Programmteil vorzeitig einen
Ausstieg, dann hat es diesen einen Ausstieg anzuspringen.

Spätestens dann, wenn du mittels Push/Pop Register sicherst,
oder das SREG in einem anderen Register gesichert hast,
wirst du dir selbst dankbar dafür sein, dich an Konventionen
gehalten zu haben.


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
Noch kein Account? Hier anmelden.