mikrocontroller.net

Forum: Compiler & IDEs Yagarto + C++


Autor: Roland (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich nutze seit einer Weile die Yagarto-Toolchain (arm-elf-gcc) mit einem 
SAM7XC-EK-Board. Das läuft mit C soweit auch ganz gut, allerdings möchte 
ich nun auch C++-Code auf dem Board zum Laufen bringen.

Um das zu erreichen habe ich zunächst in meiner Makefile folgende 
Anpassungen vorgenommen:
AS=$(CROSS_COMPILE)gcc
CC=$(CROSS_COMPILE)gcc
LD=$(CROSS_COMPILE)gcc
geändert zu:
AS=$(CROSS_COMPILE)gcc
CC=$(CROSS_COMPILE)gcc
CPP=$(CROSS_COMPILE)g++
LD=$(CROSS_COMPILE)g++
mit diesen Flags:
CPPFLAGS=-g -mcpu=arm7tdmi $(OPTIM) -Wall -I$(INCL) -D $(TARGET)
LDFLAGS+=-nostartfiles -Wl,--cref
LDFLAGS+=-lc -lgcc
LDFLAGS+=-T elf32-littlearm.lds

Wenn ich den Code nach diesen Änderungen kompiliere erhalte ich folgende 
Fehlermeldungen:
ld.exe: section .data [0022b19c -> 0022da43] overlaps section .gcc_except_table [0022b19c -> 0022b2fb]
ld.exe: section .text._ZN8ListElemC1Ev [0022b2fc -> 0022b2ff] overlaps section .data [0022b19c -> 0022da43]

Ich nehme an, ich hab schon bei den Änderungen der Makefile Fehler 
gemacht, allerdings hab ich noch ein wenig rumprobiert und mein 
LinkerScript:
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(reset_handler)

SECTIONS
{
  .text : { 
    _stext = .;
    *(.text)
    *(.rodata)                 /* read-only data (constants) */
    *(.rodata*)
    . = ALIGN(4);
     _etext = . ;
  }
  /* collect all initialized .data sections that go into FLASH  */
  .data : AT ( ADDR (.text) + SIZEOF (.text)) { 
    _sdata = .;
    *(.vectors)
    *(.data)
    _edata = .;
  }
  /* collect all uninitialized .bss sections that go into FLASH  */
  .bss (NOLOAD) : { 
    . = ALIGN(4);
    _sbss = .;
    *(.bss)
    _ebss = .;
  }
}
end = .;
angepasst:
.data : AT ( ADDR (.text) + SIZEOF (.text) + 1780)
(Den Wert 1780 hab ich nach rumprobieren ausgewählt).

Mir ist bewusst, dass das ein ziemlich hässlicher Workaround ist. 
Jedenfalls kompiliert das Programm nach diesen Änderungen und lässt sich 
auf das Board flashen. Allerdings funktionieren nun teilweise selbst 
einfachste Wertzuweisungen innerhalb des Programms nicht. Da ich vorher 
nie C++ auf einem Mikrokontroller genutzt habe werd ich also (abgesehn 
von dem hässlichen Workaround) wahrscheinlich einige Anfängerfehler 
gemacht haben. Hoffe mir kann jmd dabei helfen.

Danke, Roland

Autor: klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde dir zum Thema Linker Scripte folgenden Link an die Hand geben 
wollen:

http://www.delorie.com/gnu/docs/binutils/ld_toc.ht...

Es wird imho vieles besser wenn du mit MEMORY deine Speicherbereiche 
definierst und im SECTIONS Bereich explizit zuweist.

Üblicherweise macht man dann bei Sektionen bei denen die VMA von der LMA 
abweicht (wie beu der .data Section der Fall ) das ganze dann so:
.data : {

} >RAM AT >FLASH

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

Bewertung
0 lesenswert
nicht lesenswert
Linkerscript scheint mir etwas arg einfach. Habe das ein wenig mehr 
einbauen müssen für C++-Unterstützung. Falls im Startup-Code keine 
Aufrufe für statische Objekte drin ist, sollte man diese ergänzen. 
Selbst habe ich bisher C++ Projekte für "kleine" Controller ohne 
Unterstützung für RTTI und excpetions compliert (siehe Optionen in den 
Makefiles der im Folgenden verlinkten Beispiele).

Mglw. hilft das etwas weiter: 
http://www.siwawi.arubi.uni-kl.de/avr_projects/arm...
Folgendes ist aber zu beachten:
- Es ist mit einer arm-eabi toolchain getested. Codesourcery G++ lite 
for ARM-EABI ist eine solche (kost' nix). Die neuste Version von Yagarto 
ist ebenfalls für Target arm-eabi (weiss aber nicht, ob die schon 
offiziell ist.)
- Code ist getestet mit STM32. Die Besonderheiten betr. 
C++-Unterstützung ist aber unabhängig vom verwendeten Controller, 
Beispiel sollte sich also recht einfach auf andere Controller anpassen 
lassen.

Dann hätte ich noch das:
http://www.siwawi.arubi.uni-kl.de/avr_projects/arm...
Das Beispiel ist schon etwas älter und wurde seinerzeit mit einer 
arm-elf Toolchain getestet (mein inzwischen "uraltens" WinARM 6/2006). 
Test mit Yagarto arm-elf ist aber übersichtlicher Zeitaufwand.

Autor: Roland (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gut danke erstmal, ich werd mir die Beispiele mal angucken

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.