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.
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.
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?
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
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
Wozu ist dann rjmp überhaupt da? Speicherplatz sparen? Sven Der bisher nur r-ge-jumpt ist.
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... :)
und hat einen takt weniger. wahrscheinlich hat es damals einfach gereicht einen rjmp zu haben, der speicher war ja mal kleiner.
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
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.
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
Hi, jetzt kommt langsam Licht ins Dunkle... - am Rande der oberen oder unteren Speicherbereiche - ich dachte, die ganze Sache sei linear adressiert? Axel
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.