Forum: Mikrocontroller und Digitale Elektronik rjmp Sprungweite reicht nicht ?


von Sirko Pöhlmann (Gast)


Lesenswert?

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...

von crazy horse (Gast)


Lesenswert?

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...

von m. merten (Gast)


Lesenswert?

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.

von Poe (Gast)


Lesenswert?

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.

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.