Was _genau_ macht wrap relative jump?

Gast #106830
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.
Gast #106831
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.
Gast #106832
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?
Gast #106834
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
Gast #106838
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
Gast #106839
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.
Gast #106842
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren