Gast
#1797906
Hallo,
ich möchte meine Firmware (Hex-file) über einen Bootloader auf das Gerät
laden. Deshalb muss mein Programm ab 0x1200 beginnen, darunter befindet
sich der Bootloader, der nach erfolgreichem Download auf diese Adresse
springt. Dafür habe ich im Linker-file "lnk51ew.xcl" den Codestart wie
folgt definiert:
// CODE
//
-D_CODE_START=0x001200 // First address for code.
-D_CODE_END=0xFFFFFF // Last address for code.
Nun startet der eigentliche Code auch ab 0x1200, jedoch befinden sich
vor dieser Startadresse noch eine Zeilen im Hex-file, die dort nicht
stehen darf. Es handelt sich dabei um einen Jumpbefehl zum
Programmstart. Zum veranschaulichen hier die ersten paar Zeilen des
Hex-files (intel standart):
:0300000002125792 <--- Jumpbefehl zum Programmstart
:0312030002219332
:03120E0002226A4F
:031212000221F3C3
:1012540002220E75D0007581BF751000751102024F
:10126400127153D9BF79012200000080FB1212666B
:10127400B900030212B3E490020078C67901800237
Wenn ich die Datei per Hand editiere und die Adresse von 0000 auf 1200
änder und die Checksumme neu berechne (letztes Byte), dann funktioniert
das Ganze.
Also habe ich versucht den Resetvektor in der "lnk_base.xcl" von 0x00
auf 0x1200 zu setzen:
// Top of memory
//
-Z(CODE)INTVEC=1200
-Z(CODE)CSTART=_CODE_START-_CODE_END
Ergebnis ist aber folgender Fehler:
Error[e18]: Range error, The INTVEC segment must begin at address zero
Where $ = ?reset_vector [0x1200]
in module "CSTARTUP" (C:\...[Pfad
entfernt]...\cstartup.r51),
offset 0x0 in segment part 5, segment INTVEC
What: 0 + SFB(INTVEC) [0x1200]
Allowed range: 0x0 - 0x0
Operand: ?reset_vector [0x1200]
in module CSTARTUP (C:\...[Pfad entfernt]...\cstartup.r51),
Offset 0x0 in segment part 5, segment INTVEC
Error while running Linker
In der cstartup.r51 wird auch ausdrücklich daruf hingewiesen, dass der
Resetvektor 0 sein MUSS. Ich frage mich nur warum und wie ich das
Problem lösen kann. Danke für eure Vorschläge :)
Grüße