Forum: Compiler & IDEs LPC1768 - Linker Script / Startupfile benötigt bzw. Error


von Philipp (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich möchte einen LPC1768 zum Laufen bringen und mit einer Eclipse 
Umgebung Debuggen.

Ich verwende OpenOCD, die arm-none-eabi Toolchain von Sourcery G++ 
(Lite) und den GDB Debugger.

Jedoch bekomme ich beim kompilieren im Startupfile in line 128 eine 
Errormeldung "non-constant expression in '.if' statement":

/* Reset Handler */
...
.if (RAM_MODE)   -> ERROR MELDUNG
    LDR     R0,=main
    BX      R0
.else
  LDR     R0,=_start
    BX      R0
.endif
    .pool
    .cantunwind
    .fnend
    .size   __cs3_reset_cortex_m,.-__cs3_reset_cortex_m

    .section ".text"

Die files habe ich aus der lpc17xx.cmsis.driver.library.zip Datei von 
NXP.

Ich habe auch schon mehrere Files probiert, jedoch war der program 
counter beim Debuggen dann an irgendwelchen abstrusen Adressen... sofern 
es compilierbar war.

Habt ihr eine Idee, was die Ursache dieses Problems sein könnte? Bzw. 
was ich dagegen tun kann / ändern kann?

Oder hat von euch vielleicht jemand ein Startupfile und ein Linker 
Script, welches für diese Konstellation passen könnte (Eclipse, 
arm-none-eabi Toolchain von Sourcery G++ Lite) ?

Liebe Grüße,
Philipp

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Philipp schrieb:
> Jedoch bekomme ich beim kompilieren im Startupfile in line 128 eine
> Errormeldung "non-constant expression in '.if' statement":
> /* Reset Handler */
> ...
> .if (RAM_MODE)   -> ERROR MELDUNG
RAM_MODE wird im gezeigten Code nicht definiert. Defintion (0 oder 
ungleich 0) soll wohl per Kommandozeilenparameter des Assemblers 
erfolgen. Zur Not kann man den Wert mit .equ am Beginn der Startup-Datei 
den Wert setzen.
>     LDR     R0,=main
>     BX      R0
Hmm, main wird also nur bei RAM_MODE direkt gerufen (vorher noch 
SystemInit)...
> .else
>   LDR     R0,=_start
>     BX      R0
...ansonsten wird die Funktion _start gerufen, deren Quellcode ich in 
den angehängten Dateien übersehen haben muss. _start müsste .data 
kopieren, .bss "nullen", evtl. noch irgendwelche herstellerspezifischen 
Initialiserungen der C-Library durchführen und dann ebenfalls main 
rufen.

>...
> Die files habe ich aus der lpc17xx.cmsis.driver.library.zip Datei von
> NXP.
Die Leute von NXP scheinen große Fans des CS3-Systems von Codesoucery. 
Was scheibt NXP zu den Beispielen? Keine Kurzanleitung wie und mit was 
man die zusammenbauen muss? Makefile(s) dabei?

> Ich habe auch schon mehrere Files probiert, jedoch war der program
> counter beim Debuggen dann an irgendwelchen abstrusen Adressen... sofern
> es compilierbar war.
Für Antwort/Vorschlag fehlen Details.

> Habt ihr eine Idee, was die Ursache dieses Problems sein könnte? Bzw.
> was ich dagegen tun kann / ändern kann?
- map-File erstellen, nachsehen, ob Vector-Table bei 0 beginnt
- nachesehen, wie erstes Element des Tables aussieht (Stack-Pointer), 
kann man sogar leicht im bin oder hex-file nachvollziehen, ansonsten 
Symbol-Tabelle oder Disassembly.
- Wert hat Symbol cs3_reset entspr. Adresse reset-handler?
- Quellcode SystemInit ansehen
- Quellcode _start ansehen

> Oder hat von euch vielleicht jemand ein Startupfile und ein Linker
> Script, welches für diese Konstellation passen könnte (Eclipse,
> arm-none-eabi Toolchain von Sourcery G++ Lite) ?
Für NXPs Cortex-M3 bin ich noch kein "jemand", da bisher keine Hardware 
einem solchen Controller in den Fingern gehabt. Man kann aber mit wenig 
Aufwand Linkerscripte und Startupcode aus Projekten für Cortex-M3 
anderer Hersteller (z.B. TI/LMI, STM) und GNU Toolchain an NXP LPC 
anpassen (Adressbereiche, Vektor-Table, evtl. remapping). Debugging dann 
im nächsten Schritt, wenn erstmal eine LED blinkt.

von Jaques (Gast)


Lesenswert?

Entchuldigung, aber ich spreche keine Deutch.

I found a simple solution to the same compiling error as you. Just add 
to your compiler flags the following:

  "-Wa,--defsym,RAM_MODE=0"  if you plan to run code from FLASH.

  "-Wa,--defsym,RAM_MODE=1"  if you plan to run code from RAM.

This passes the symbol "RAM_MODE" directly and only to the assembler and 
with the value specified.

I don't use eclipse, but Code::Blocks instead.
In Code::Blocks it is just a matter of opening the project build options 
-> compiler settings -> other options.

It must be a way to do exactly the same in your eclipse.

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.