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


von AxelR. (Gast)


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.

von Tobi (Gast)


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.

von Henning (Gast)


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?

von Matthias (Gast)


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

von Tobi (Gast)


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

von Sven (Gast)


Lesenswert?

Wozu ist dann rjmp überhaupt da? Speicherplatz sparen?

Sven

Der bisher nur r-ge-jumpt ist.

von Henning (Gast)


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

von Tobi (Gast)


Lesenswert?

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

von AxelR. (Gast)


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

von Henning (Gast)


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.

von Peter D. (peda)


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

von AxelR. (Gast)


Lesenswert?

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

ich dachte, die ganze Sache sei linear adressiert?

Axel

von m. merten (Gast)


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.

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.