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
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
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
> 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
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. :)
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.