Forum: Mikrocontroller und Digitale Elektronik ARM GNU mit g++ benutzen - Erfahrungen?


von Alex (Gast)


Lesenswert?

Mein Umstieg auf Arm Cortex ist soweit erfolgt und ich bin sehr 
zufrieden mit dem Microcontroller.
Da ich eventuell einige komplexere Funktionen benutzen wollte die Frage, 
ob bereits jemand Erfahrungen mit C++ (konkret g++) Compilern gemacht 
hat.

Das letzte mal, zu AVR Zeiten, wurde mir davon abgeraten weil das 
Abstraktionslevel hardwareferner sei und der Code dadurch weniger 
kompakt, und auch allgemein nicht so gut funktioniere. Wie sieht das bei 
GNU-ARM aus?

Viele Grüße,
 Alex

von Oliver (Gast)


Lesenswert?

Alex schrieb:
> Das letzte mal, zu AVR Zeiten, wurde mir davon abgeraten weil das
> Abstraktionslevel hardwareferner sei und der Code dadurch weniger
> kompakt, und auch allgemein nicht so gut funktioniere.

Für den AVR-C++ gibt es halt keine C++-Standardlib, zum anderen sind 
virtuelle Funktionen etwas speicherintensiv implementiert. Funktionieren 
tut das, was da ist, aber völlig problemlos, und der erzeugte Code ist 
bei identischer(!!!) Funktionalität auch nicht größer als aus reinem C 
erzeugter Code.

Die AVR-Einschränkungen gibt es beim Arm nicht. Daher spricht da 
überhaupt nichts dagegen, C++ zu verwenden.

Oliver

von Dr. Sommer (Gast)


Lesenswert?

Der g++ aus dem GCC-ARM-Embedded funktioniert ganz wunderbar, wenn man 
ein paar Feinheiten beachtet. Die Behauptung, C++ sei ineffizient ist 
völliger Unsinn; sofern man richtig codet ist das Ergebnis (mindestens) 
so effizient wie das C-Äquivalent. Man kann immernoch genau so gut 
kontrollieren was wo im Speicher passiert, man sollte sich nur eben ein 
bisschen auskennen wie Automatic Storage funktioniert.
Es schadet aber auch nicht, sich den erzeugten Assembler-Code mal 
anzusehen.
Wichtig ist, aus dem Startup-Code vor dem Aufruf der main()-Funktion 
die Konstrukturen der globalen Objekt-Instanzen aufzurufen; die 
__libc_init_array Funktion aus der libc (wird automatisch dazugelinkt) 
macht das.

Man sollte irgendwo im Code folgendes unterbringen:
1
extern "C"
2
int atexit() {
3
  return 0;
4
}
5
extern "C" void __cxa_pure_virtual () {
6
  while(1);
7
}
Dies verhindet das dazulinken des riesigen Exception-Handling-Codes aus 
der libstdc++, falls man virtuelle Funktionen verwendet (stattdessen 
gibts halt eine Endlosschleife, falls man es irgendwie schafft eine rein 
virtuelle Funktion aufzurufen). Außerdem sollte man per "-fno-rtti 
-fno-exceptions" RTTI und Exceptions abschalten. "-ffunction-sections 
-fdata-sections" für den Compiler und "-Wl,--gc-sections" für den 
Linker, um unbenutzten Code/Variablen wegzuoptimieren.

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.