www.mikrocontroller.net

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


Autor: Philipp (Gast)
Datum:
Angehängte Dateien:

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

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

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

Autor: Jaques (Gast)
Datum:

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

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.