Forum: Mikrocontroller und Digitale Elektronik g++ statt gcc


von sonstimmerc (Gast)


Angehängte Dateien:

Lesenswert?

Guten Morgen,

ich versuche gerade den g++ statt den gcc zu benutzen.
Kompilieren kann ich das Project weiterhin, flashen ebenso.
Auf dem stm32 läuft es aber dann einfach nicht an.

Ist möglicherweise mein Makefile falsch? Mit dem gcc und den CFLAGS 
läuft es einwandfrei.

Die Flags kommen von: https://www.mikrocontroller.net/articles/ARM_GCC

Beste Grüße.

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

sonstimmerc schrieb:
> Ist möglicherweise mein Makefile falsch? Mit dem gcc und den CFLAGS
> läuft es einwandfrei.

Hast Du mal einen Debugger ran gehalten? Wahrscheinlich liegt das 
Problem im Startup-Code. Die meisten IC-Hersteller liefern Startup-Code, 
der nicht so ganz gut mit C++ um kann (z.B. keine globalen Objekte 
initialisiert).

von Dr. Sommer (Gast)


Lesenswert?

Zeig mal deine .bin Datei.

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Was auch sein kann, ist dass Du Deine Interrupt handler nicht mit extern 
"C" deklariert hast und der Linker sie deshalb nicht in die Vector table 
eingetragen hat.

von sonstimmerc (Gast)


Angehängte Dateien:

Lesenswert?

Hier ist die .bin im Anhang.
Debugged habe ich noch nicht, mich aber auch noch gar nicht mit dem 
Thema beschäftigt.

von Dr. Sommer (Gast)


Lesenswert?

Der ISR-Vektor sieht ok aus. Dein initialier Stack Pointer zeigt aber in 
den CCM, wird der in deinem Startupcode aktiviert? Wenn nicht, stürzt 
der Controller beim Sprung in die main() ab. Zeig mal dein ganzes 
Projekt, inklusive .elf Datei.

von Drimer M. (qinomo)


Angehängte Dateien:

Lesenswert?

Hey danke dir!
Wie konntest du das anhand der .bin feststellen?

Das Projekt habe ich mal in den Anhang gepackt.

von Dr. Sommer (Gast)


Lesenswert?

Äh vergiss das mit dem CCM, ich hab mich vertan.
Das
1
#define USE_FULL_ASSERT    1
bringt gar nix, das muss in die stm32f4xx_conf.h .

Aber sonst seh ich grad kein Problem. Benutze mal den Debugger um 
festzustellen wo es stecken bleibt.

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Die HA-Library arbeitet auch mit callbacks, bei denen die Library C 
binding erwartet. An Deiner Stelle würde ich die C-Files von ST mit 
einem C compiler übersetzen und nur echte C++ sourcen dann mit dem C++ 
compiler.

von Vincent H. (vinci)


Lesenswert?

Torsten R. schrieb:
> Was auch sein kann, ist dass Du Deine Interrupt handler nicht mit extern
> "C" deklariert hast und der Linker sie deshalb nicht in die Vector table
> eingetragen hat.


Das kann nicht nur sein, das ist so. Ein C++ Compiler muss laut Standard 
als C++ deklarierte Funktionen name-mangeln. Ohne also via "extern C" 
ein linkbares Interface zu erzeugen werden sämtliche Interrupts 
vermutlich schlichtweg wegoptimiert und die leeren .weak 
Implementierungen aus dem Startup-Code herangezogen.

Soll heißen keine einzige von deinen Delay Funktionen usw. wird mehr 
funktionieren... Geschweigedenn von dem HAL-internen Zeug.

: Bearbeitet durch User
von Dr. Sommer (Gast)


Lesenswert?

Torsten R. schrieb:
> Die HA-Library arbeitet auch mit callbacks, bei denen die Library
> C
> binding erwartet.
Wenn der "g++" aber eine .c Datei sieht, kompiliert er die als "C". Es 
tritt hier also kein Problem auf. Dennoch würde ich die .c Dateien 
lieber mit "gcc" kompilieren...

von Rolf M. (rmagnus)


Lesenswert?

Dr. Sommer schrieb:
> Wenn der "g++" aber eine .c Datei sieht, kompiliert er die als "C".

Nein. Nur gcc sucht sich aus dem Dateinamen den Typ. g++ übersetzt es 
immer als C++, wenn man nicht explizit mit -x was anders angibt.

Vincent H. schrieb:
> Ein C++ Compiler muss laut Standard als C++ deklarierte Funktionen name-
> mangeln.

Hast du mal ein Zitat von der Stelle, die name-mangling vorschreibt? Mir 
wäre sowas nicht bekannt.

von Tiiiim (Gast)


Lesenswert?

>Das kann nicht nur sein, das ist so. Ein C++ Compiler muss laut Standard
>als C++ deklarierte Funktionen name-mangeln. Ohne also via "extern C"
>ein linkbares Interface zu erzeugen werden sämtliche Interrupts
>vermutlich schlichtweg wegoptimiert und die leeren .weak
>Implementierungen aus dem Startup-Code herangezogen.

Ich stehe vor einem ähnlichen Problem (nutze auch die STLib). Wohin 
genau kommt das extern C?

von The D. (thedaz)


Lesenswert?

Tiiiim schrieb:
>>Das kann nicht nur sein, das ist so. Ein C++ Compiler muss laut Standard
>>als C++ deklarierte Funktionen name-mangeln. Ohne also via "extern C"
>>ein linkbares Interface zu erzeugen werden sämtliche Interrupts
>>vermutlich schlichtweg wegoptimiert und die leeren .weak
>>Implementierungen aus dem Startup-Code herangezogen.
>
> Ich stehe vor einem ähnlichen Problem (nutze auch die STLib). Wohin
> genau kommt das extern C?

Vor den return type des function headers bzw vor ein Blockklammerpaar.

: Bearbeitet durch User
von Dieter Gräf (Gast)


Lesenswert?


von Tiiiim (Gast)


Lesenswert?

Danke.

Es reicht also aus den startup-part zu ersetzen? Sonst muss nichts 
geändert werden (abgesehen vom makefile)?

von g++iscool (Gast)


Lesenswert?

Startup + extern "C" { ... } um alle .c Dateien (stlib, etc.).

von Kaj (Gast)


Lesenswert?

1
// my_c_file.c/my_c_file.h
2
3
#ifdef __cplusplus
4
extern "C" {
5
#endif
6
7
8
// place your c-code here
9
10
11
12
#ifdef __cplusplus
13
}
14
#endif

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.