www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik rjmp Sprungweite reicht nicht ?


Autor: Sirko Pöhlmann (Gast)
Datum:

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

Autor: crazy horse (Gast)
Datum:

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

Autor: m. merten (Gast)
Datum:

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

Autor: Poe (Gast)
Datum:

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

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.