www.mikrocontroller.net

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


Autor: Nico (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias K. (matthiask)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Nico (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias K. (matthiask)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Nico (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias K. (matthiask)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann mach auf 1200H einen Jump zu Deiner Firmware.

Autor: Nico (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias K. (matthiask)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kuck mal ob es sowas wie NO-INT-VECTOR gibt.

Autor: Nico (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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"

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.