Forum: Mikrocontroller und Digitale Elektronik Resetvector in IAR 8051 ändern


von Nico (Gast)


Lesenswert?

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

von Thomas (Gast)


Lesenswert?

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

von Matthias K. (matthiask)


Lesenswert?

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.

von Nico (Gast)


Lesenswert?

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.

von Matthias K. (matthiask)


Lesenswert?

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?

von Nico (Gast)


Lesenswert?

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.

von Matthias K. (matthiask)


Lesenswert?

Dann mach auf 1200H einen Jump zu Deiner Firmware.

von Nico (Gast)


Lesenswert?

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.

von Matthias K. (matthiask)


Lesenswert?

Kuck mal ob es sowas wie NO-INT-VECTOR gibt.

von Nico (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.