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
das ist in Keil genauso. Bei Keil gibt es ein Startup.asm Durt steht ein CSEG at 0 LJMP Startup das muss dann in CSEG at 1200h LJMP Startup geändert werden dann geht es. Vermutlich hat IAR was ähnliches Thomas
Der Resetvector ist bei 8051ern mW immer 0000H. (Möglicherweise gibt es auch Derivate, wo das anders ist.) Du musst also selber dafür sorgen, ob nach Reset der Bootloader gestartet werden soll, oder Deine Firmware. Dazu gibt es viele Möglichkeiten. zB. PORT-Pin legt das fest oder zuerst immer den Bootloader starten und einige ms auf Kommunikation (wie auch immer) warten, falls negativ dann Firmware starten usw.
Danke für die Antworten, er soll im Prinzip auch bei einem Reset zu 0x00 springen, denn dort liegt der Bootloader, der dann je nach gesetztem Flag im Flash zur Firmware verzweigt oder nicht. Problem ist einfach, dass diese besagte Zeile im Hex-file nicht bei Adresse 0x00 starten darf, sondern bei 0x1200 weil der Bootloader sonst sich selbst versucht zu überschreiben (er startet bei 0x00) und das in einem Abbruch des Downloads endet. Also die bessere Frage ist vllt. nicht wie ich den Resetvector ändere, sondern den Eintrag im Hexfile von 0x00 auf 0x1200 umbiege. Per Hand funktioniert es dann nämlich wunderbar.
Dein Anliegen ist immer noch nicht klar verstanden wurden. Wenn der Linker was falsches auf 0000H bringt, so hast Du das auch irgendwo in Deiner Software/Einstellungen definiert. Auf Adresse 0000H wird eigentlich immer der Sprung zur Startadresse gelinkt. Man kann in den Einstellungen meist auch was in der Art NO-RESETVECTROR angeben. Wie das bei IAR genau geht, weiß ich nicht. Der eigentliche Einsprung in das Programm muss nicht unmittelbar am Beginn des reservierten Codebereiches (1200H) liegen. Die genaue Adresse legt der Linker fest. Was steht im Hexfile genau noch davor?
Das steht an Adresse 0h und muss irgendwie auf die Adresse 1200h verbogen werden, weil der Bootloader genau auf die Adresse 1200h springt, wenn die Firmware ausgeführt werden soll. :0300000002125792 <--- Jumpbefehl zum Programmstart :0312030002219332 :03120E0002226A4F :031212000221F3C3 :1012540002220E75D0007581BF751000751102024F :10126400127153D9BF79012200000080FB1212666B :10127400B900030212B3E490020078C67901800237 So eine Einstellung habe ich schon ausgiebig gesucht, aber mehr als die im ersten Posting angegebenen Einstellungsmöglichkeiten habe ich nicht finden können.
Das ist mein Ziel, aber wie soll ich das machen, wenn der Linker mir immer diese Ausgabe erzeugt? Ich glaub ich steh auf dem Schlauch.
Ok ich hab das Problem gelöst. Man muss die cstartup.s51 wie folgt modifizieren: COMMON INTVEC:CODE:ROOT(0) ASEG ORG 0x1200 // The reset vector must be located at address zero, the reset // vector is located first in the INTVEC segment. This segment // must thus be located at address zero. Be carefull if using // assembler sequences located with the ASEG directive, which may // prevent the INTVEC segment from being located at address zero. LIMIT SFB(INTVEC),0,0xFFFF,"The INTVEC segment must begin at address zero"
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.