www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Was _genau_ macht wrap relative jump?


Autor: AxelR. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi leute,

mein programm ist nun größer als 8kByte (AtMega16) und mein AVR-Studio
meckert -zu Recht- dasss meine RJMP's in der Interrupttabelle ihr
"Ziel" nicht mehr erreichen, was beim UART-RX int. auch stimmt.
immer, wenn ein Zeichen auf der Schnittstelle eingeht, springt der AVR
an $0000. Ich habe die Warnhinweise vom AVR-Studio (4.09.338) gelesen
und die Option "Wrap relative Jump" ausgeschaltet und in der
Interrupttabelle aus dem "rjmp" ein "jmp" gemacht. Was passieert
aber nun mit den anderen, in meinem Projekt vorhandenen,
Rjmp-Befehlen?!?
Springt er jetzt nur noch -sagen wir- vorwärts? Verhalten sich die
RJMP's jetzt wie JMP's?
Wenn der rjmp +-2K springen kann, kann er bei abgeschalteter
Wrap-Option nur noch in eine Richtung, dafür aber 4K weit springen?
Vielleicht lasse ich die Option gesetzt und ändere nur den einen
relativen Sprung, der definitv nicht reicht, in einen JMP. Das andere
lasse ich so, wie es jetzt ist, oder?

Der Alttag hat mich wieder...
AxelR.
Gruß an MarioS.

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
rjmp:
Relative jump to an address within PC - 2K +1 and PC + 2K (words). In
the assembler, labels are used instead of relative
operands. For AVR microcontrollers with Program memory not exceeding 4K
words (8K bytes) this instruction can address
the entire memory from every address location.

jmp:
Jump to an address within the entire 4M (words) Program memory. See
also RJMP.

Autor: Henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn du am ende des speicher bist und dann einen rjmp in positiver
richtung unternimmst läuft der zähler über und beginnt bei 0. also beim
anfang deines speicherbereiches.

das ist wohl mit wrap gemeint. richtig?

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

oder der umgekehrte Weg. Du bist innerhalb der ersten 2k und springst
weit genug zurück. Dann landest du in den oberen 2k.

Matthias

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sozusagen ein a20 gate für avr's :)

das +/-2kwords ist ein fester befehl, das lässt sich nicht im avr
studio umschalten.

einfach jmp konsequent nehmen, dann gibts auch keinen ärger bei
programmumstrukturierungen wenn der rjmp plötzlich doch nicht mehr
reicht

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wozu ist dann rjmp überhaupt da? Speicherplatz sparen?

Sven

Der bisher nur r-ge-jumpt ist.

Autor: Henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
rjmp brauch weniger programmspeicher als jmp, erreicht jedoch nur +-2k
im programmspeicher. jmp gibt einen absoluten sprung an.

Aber: das kann man alles im datasheet finden... :)

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und hat einen takt weniger. wahrscheinlich hat es damals einfach
gereicht einen rjmp zu haben, der speicher war ja mal kleiner.

Autor: AxelR. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, Leute.
es geht mir ja garnicht darum, den Unterschied zwischen RJMP und JMP
erklärt zu bekommen, sondern die Konsequenzen, die sich aus dem Haken
"Wrap relative Jump" für mich und mein Programm ergeben. das Rjmp
+-2K springt und Jmp den gesamten Speicher erreicht, steht im
Datenblatt. Ist ja soweit klar.
Wird vielleicht das höherwertigste Bit für die Sprungweite als
Signed(mit aktivierter Option)/unsigned (ohne Häckchen) behandelt?
Gruß
Axel

Autor: Henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei rjmp wird die relative sprungweite immer per signed angegeben.

So, und jetz der Mördersatz: :)

Der Vorteil, der sich bei aktivierten "wrap relative jump" ergibt
ist, das du beim ausführen eines rjmp Befehls am Rande der oberen oder
unteren Speicherbereiche nicht an diese Speichergrenzen stößt, sondern
der Wirkungsbereich eben darüber hinaus geht und an der jeweils anderen
Speichergrenze fortgesetzt wird.

alles klar? Vorteil ist also: du kannst da, wo normalerweise ein jmp
nötig gewesen währe Takt und Speicherplatz sparen, weil manchmal (siehe
oben) nun ein rjmp reicht.

ich hoffe das hilft und ich hab´s nicht zu kompliziert ausgedrückt.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich das richtig erinnere, funktioniert "wrap relative jump"
ausschließlich bei AVRs mit 8kB Flash.

Der Assembler denkt dann, daß die Adresse 0x0000 an 0x2000 gespiegelt
wird usw.


Peter

Autor: AxelR. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
jetzt kommt langsam Licht ins Dunkle...
 - am Rande der oberen oder
unteren Speicherbereiche -

ich dachte, die ganze Sache sei linear adressiert?

Axel

Autor: m. merten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist ja auch linear adressiert, nur mit dem unterschied, daß ich bei
allen AVRs mit <= 8 kByte flash den kompletten programmspeicher mit
rjmp/rcall befehlen abdecken kann. Diesen Umstand teile ich dem
Assembler mit dieser Option mit. Ab Version 2.x des Assemblers wird
diese Option anhand der Flash-Grösse automatisch aktiviert/deaktiviert.

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.