rjmp Sprungweite reicht nicht ?

Gast #106003
Hallo!

Mein Program beginnt rumzuspinnen sobald ich weiteren - beliebigen-
Code hinzufüge. Es kommt reproduzierbar an bestimmten Stellen im
Programmablauf zum Reset.

Zunächst standen fehlerhafte push/pop oder rjmp/rcall/ret im Verdacht
einen Stacküberlauf auszulösen. Ich konnte jedoch keinen
diesbezüglichen Fehler finden. Außerdem war komisch das es bereits
auftrat wenn man nur ein nop an beliebiger Stelle einfügte.

Nach einigen Probieren vermute ich jetzt das auf Grund der Codegröße
die Sprungweite des rjmp / rcall nicht mehr ausreicht. ( PC +/- 2k
Worte). Leider gibt es scheinbar im Gegensatz zu Verzweigungen ( Branch
if...) keine Fehlermeldung wenn die Sprungadresse außerhalb des
Bereiches liegt.

Auf Grund der Unmengen von rjmps und rcalls ist es sehr schwierig
rauszubekommen welcher Befehl nun genau die Hänger verursacht. Das
Studio kann ich nicht nutzen..

Ich habe - zunächst wahllos- einige rjmps und rcalls durch jmp und call
ersetzt, das hat aber das Problem nicht beseitigt.

Wie kann ich das Problem beheben? Ist es problemlos möglich alle rjmps
und rcalls durch die absoluten Befehle call und jmp zu ersetzen?

Ich verwende einen mega32, die Codegröße liegt im Moment bei ca 3200
Worten, es wird aber noch deutlich mehr...
Gast #106004
Warum kannst du AVR-Studio nicht nutzen? Welchen Assembler verwendest du
denn? Normalerweise sollte schon eine Fehlermeldung kommen.
Vom 8051-Assembler kenne ich noch das nette Spielchen, dass man einfach
jmp schreibt, und der Assembler sich je nach Sprungweite ajmp oder ljmp
selbst aussuchte...
Gast #106005
AVR Studio erzeugt bei Sprüngen bzw. Unterprogrammaufrufen > +- 2k
Worte auch eine Fehlermeldung. Bei älteren Studioversionen kann es
jedoch sein, daß die Option Wrap relativ jmp/call ausgwählt ist, was
nur sinnvoll bei Controllern mit max. 8k Flash ist. Bei mehr wie 8k
führt diese Option zu Fehlern bei der Adressberechnung während der
Asssemblierung. Bei der aktuellen Studio Version wird diese Option
aber automatisch entsprechend Flash-Grösse gewählt.
Gast #106006
Hm, das wrap ist ausgewählt, mache ich also besser mal weg....danke..
AVR Studio nutze ich schon, nur Simulation geht nicht wegen
Parameterübergaben von außerhalb, ext. Interrupts usw...

ich hab jetzt alle wait Befehle von rcall auf call umgestellt
(offensichtlich lagen die weit "außen"), und jetzt geht es erst mal
wieder... bis die nächsten Routinen zu weit weg sind...

Ich hab Studio 4.07. Und es sollte wirklich Fehlermeldungen kommen? Hm.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.