Forum: Mikrocontroller und Digitale Elektronik Keil C51 Startaddresse festsetzen


von Christoph (Gast)


Lesenswert?

Hallo

Ich schreibe einen Bootloader in C für einen ADuC842. Dieser unterstützt 
Bootcode ab E000. Nun möchte ich dem Keil C51 compiler sagen, dass er 
den Code ab E000 produzieren soll und nicht ab 0000 - der komplette 
Bootloader soll ab E000 beginnend stehen. Wie kann ich das 
bewerkstelligen?

Vielen Dank

Christoph

von R. W. (quakeman)


Lesenswert?

Grundsätzlich gibt es nur im Assemblercode die Möglichkeit per Befehl 
die Startadresse festzulegen.

Aber damit man das in C ebenfalls machen kann, mußt du eine Einstellung 
in den "Options for Target" in µVision vornehmen. Dieses Fenster findest 
du unter dem Menüpunkt "Project".
Dort gibt es in dem Karteireiter "Target" den Bereich "Off-chip Code 
memory". In diesem trägst du als Start Adresse dann 0xE000 ein.

Sobald du dein Projekt jetzt compilierst erstellt der Compiler an der 
Startadresse 0x0000 einen LJMP Befehl an die Adresse 0xE000, an welchem 
der Rest des Programms steht.
Sämtliche eventuell verwendeten ISR werden ebenfalls per LJMP an die 
Adressen 0xE000+ISR Adresse verwiesen.

Ciao,
     Rainer

von Christoph (Gast)


Lesenswert?

Danke für deine prompte Antwort!
Damit wird aller nötiger Code in die E000 Section gespeichert, die beim 
Power-On angesprungen wird (Bootloader-Modus). Der LJMP auf 0 wird beim 
ersten Bootload dann eh überschrieben ;)

Schöne Grüße
Christoph

von Ralf (Gast)


Lesenswert?

> Grundsätzlich gibt es nur im Assemblercode die Möglichkeit per Befehl
> die Startadresse festzulegen.
Stimmt nicht, der Keil C-Compiler kann das auch :)

Handbuch lesen -> gibts auch online auf www.keil.com

Ralf

von R. W. (quakeman)


Lesenswert?

Ralf dann klär uns mal bitte auf.
Denn ich habe mir vorhin das C51 Handbuch als PDF angeschaut und es 
nicht gefunden. Aber ich bin ja gerne bereit dazuzulernen. :)

von Christoph (Gast)


Lesenswert?

oh ja. es Problem ist wieder up to date.
ich hab mir grad die Ausgabe von BL51 angeschaut:

            TYPE    BASE      LENGTH    RELOCATION   SEGMENT NAME
            -----------------------------------------------------

              *   *    D A T A   M E M O R Y    *   *  
            REG     0000H     0008H     ABSOLUTE     "REG BANK 0"
            DATA    0008H     0020H     UNIT         ?DT?BOOTLOAD
            DATA    0028H     0005H     UNIT         DATA_GROUP
            IDATA   002DH     0001H     UNIT         ?STACK

              *   *   X D A T A   M E M O R Y   *   *  
            XDATA   0000H     0200H     ABSOLUTE
                    0200H     FD03H                  *** GAP ***
            XDATA   FF03H     0001H     ABSOLUTE

              *   *    C O D E   M E M O R Y    *   *  
            CODE    0000H     E000H     ABSOLUTE
 OVERLAP  CODE    0000H     0003H     ABSOLUTE
            CODE    E000H     0250H     UNIT         ?PR?MAIN?BOOTLOAD
            CODE    E250H     008CH     UNIT         ?C_C51STARTUP
            CODE    E2DCH     005FH     UNIT 
?PR?_CRC_UPDATE?BOOTLOAD
            CODE    E33BH     0026H     UNIT         ?C?LIB_CODE
            CODE    E361H     0024H     UNIT         ?C_INITSEG
            CODE    E385H     0010H     UNIT 
?PR?_WR_RS232?BOOTLOAD
            CODE    E395H     0008H     UNIT 
?PR?RD_RS232?BOOTLOAD


von CODE 0000-0003 steht ein LJMP auf E250h, also den Startup-code.
Springt der Chip nach Power-Up nun direkt auf E000, wird dieser 
startup-code gar nicht ausgeführt sondern direkt mit der Hauptschleife 
begonnen.

Bitte verratet mir das kleine Häkchen, dass Keil den "Entry Point" nach 
Reset bei E000 und nicht bei 0000 wähnt.

Danke.

von Petrus (Gast)


Lesenswert?

Hallo Christoph,
trage unter "Options for Target" --> "BL51 Locate" --> "Code"

?C_C51STARTUP(0xE000)

ein. Damit zwingst Du den Startupcode auf die Adresse 0xE000.

INK MAP OF MODULE:  HELLO (HELLO)


            TYPE    BASE      LENGTH    RELOCATION   SEGMENT NAME
            -----------------------------------------------------

              *   *    D A T A   M E M O R Y    *   *  
            REG     0000H     0008H     ABSOLUTE     "REG BANK 0"
            DATA    0008H     0014H     UNIT         DATA_GROUP
                    001CH     0004H                  *** GAP ***
            BIT     0020H.0   0001H.1   UNIT         BIT_GROUP
                    0021H.1   0000H.7                *** GAP ***
            IDATA   0022H     0001H     UNIT         ?STACK

              *   *    C O D E   M E M O R Y    *   *  
            CODE    0000H     0003H     ABSOLUTE
                    0003H     DFFDH                  *** GAP ***
 ----->     CODE    E000H     000CH     UNIT         ?C_C51STARTUP
            CODE    E00CH     035CH     UNIT         ?PR?PRINTF?PRINTF
            CODE    E368H     008EH     UNIT         ?C?LIB_CODE
            CODE    E3F6H     0027H     UNIT         ?PR?PUTCHAR?PUTCHAR
            CODE    E41DH     001BH     UNIT         ?PR?MAIN?HELLO
            CODE    E438H     000DH     UNIT         ?CO?HELLO

Gruß
Peter

von Christoph (Gast)


Lesenswert?

Tausend Dank, Peter!

Damit springt der LJMP von 0x0000 nun auch auf 0xE000, was einem Reset 
von 0xE000 entspricht!

Schöne Grüße,
Christoph

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.