mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik rjmp aus Interrupt/Unterprogramm


Autor: Dussel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: Dussel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dussel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS: im ATMega8

Autor: AVRFan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.


Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.