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.
 Thread beobachten
 Thread beobachten Seitenaufteilung abschalten
 Seitenaufteilung abschalten