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