Forum: Mikrocontroller und Digitale Elektronik STM32CubeIDE C++


von Johann (Gast)


Lesenswert?

Moin,

wenn ich in meinem Projekt unter Properties -> C/C++ Build -> Settings 
-> Tool Settings -> MCU GCC Compiler -> Command von "gcc" auf "g++" 
umstelle, wird mein Code ohne Probleme mit dem g++ übersetzt.

Das heißt ich kann nun auch Klassen anlegen. Zwei Fragen:

a) wird mein Code trotzdem ausführbar sein?
b) Der Code wird zwar fehlerfrei übersetzt, es werden mir aber dennch 
Syntaxfehler angezeigt. Kann ich dem das irgendwie beibringen?

Danke euch allen!

von Johann (Gast)


Lesenswert?

Nachtrag: Dateien in .cpp umbenennen behebt schonmal die Syntaxfehler.

von adib (Gast)


Lesenswert?

Warum willst du ein C Programm mit einem C++ Compiler übersetzen.?

Es reicht, wenn die C++ Quellen per g++ übersetzt werden.


Hth, Adib.

von Johann (Gast)


Lesenswert?

Ja, ich sehe dass man ja inzwischen C++ Projekte anlegen kann. Wenn ich 
alles mit .hpp, .cpp und .sx Dateien programmiere kann der auch C++ Code 
direkt übersetzen.

Beim debuggen lande ich jedoch immer in einer infinite loop :(.

von Axel S. (a-za-z0-9)


Lesenswert?

Johann schrieb:
> Ja, ich sehe dass man ja inzwischen C++ Projekte anlegen kann.
> Wenn ich
> alles mit .hpp, .cpp und .sx Dateien programmiere kann der auch C++ Code
> direkt übersetzen.

Was dir die Leute durch die Blume sagen wollten: deine IDE weiß schon, 
wie man C++ Code übersetzt. Und du kannst auch C und C++ in einem 
Projekt mischen. Die Unterscheidung zwischen C und C++ (und welchen 
Compiler die IDE aufruft) geht über den Dateinamen (die Endung). Deine 
Änderung an den Einstellungen bewirkt nun aber, daß alles mit dem C++ 
Compiler übersetzt wird, auch C. Und das ergibt keinen Sinn.

> Beim debuggen lande ich jedoch immer in einer infinite loop :(.

Das ist eine derart grandiose Fehlerbeschreibung, daß bestimmt gleich 
Hunderte Antworten eintreffen, die dir alle ganz genau und detailliert 
darlegen, was du falsch machst.

Angesichts deiner obigen "Leistungen" würde ich dir vorschlagen, 
einfach mal das Handbuch zur IDE zu lesen und die Tutorials 
durchzuarbeiten. Ohne Plan drauf los zu wursteln, bringt dich 
nirgendwohin.

von Johann (Gast)


Lesenswert?

Hat sich geklärt. Ich muss die Interrupts in einer .c platzieren, 
sondern werden diese nicht angesprungen.

von Vincent H. (vinci)


Lesenswert?

Johann schrieb:
> Hat sich geklärt. Ich muss die Interrupts in einer .c platzieren,
> sondern werden diese nicht angesprungen.

Das hat mit name mangling zu tun:
https://en.wikipedia.org/wiki/Name_mangling#C++

Infos bezüglich C und C++ mixen gibts hier:
https://isocpp.org/wiki/faq/mixing-c-and-cpp

von Johann (Gast)


Lesenswert?

Ich kann also vermutlich keine Methode einer Klasse aus einer .c Datei 
aufrufen. Wie stelle ich das am besten an z.B. im TIM3 Interrupt? Oder 
wie umgehe ich das Problem, dass die Funktion TIM3_IRQHandler nicht 
afgerufen wird?

von NochNichtCubeUser (Gast)


Lesenswert?

im h und cpp-File

extern "c" void InterruptFunction ()
{
}

von Johannes S. (Gast)


Angehängte Dateien:

Lesenswert?

dafür würde ich Mbed empfehlen, da hast du OS mit C++ API und einem 
komfortablen Buildsystem.
Mit NVIC_SetVector() kannst du Interruptvectoren selber setzen und das 
schwache WEAK Konzept umgehen. Die Int Vectortable muss dazu in das Ram 
verschoben werden, das macht Mbed selber.
Um mit über den Interrupt eine Methode aus einer Klasse aufzurufen 
brauchst du ein Trampolin. In Mbed gibt es die Klasse CThunk die das 
komfortabel erledigt.

Eine Timerklasse für die F4 habe ich auch gerade gebaut:
https://github.com/JojoS62/Test-lvgl/blob/master/libs/util/HWTimer.h
https://github.com/JojoS62/Test-lvgl/blob/master/libs/util/TARGET_STM32F4/HWTimer.cpp

Interrupt setzen ist hier:
https://github.com/JojoS62/Test-lvgl/blob/355ed756d6a7b593739e382e1d06d4a4309cded9/libs/util/TARGET_STM32F4/HWTimer.cpp#L101

als Anwendungsbeispiel habe ich einen quick & dirty test mit 
Schrittmotoransteuerung reingepackt.

von Johann (Gast)


Lesenswert?

NochNichtCubeUser schrieb:
> im h und cpp-File
>
> extern "c" void InterruptFunction ()
> {
> }

Danke, das hat geholfen!

von Axel S. (a-za-z0-9)


Lesenswert?

Johann schrieb:
> Ich kann also vermutlich keine Methode einer Klasse aus einer .c
> Datei aufrufen.

Doch. Nicht direkt, aber über einen Wrapper.

> Wie stelle ich das am besten an z.B. im TIM3 Interrupt?

Indem du den gegebenen Links folgst und liest !

> wie umgehe ich das Problem, dass die Funktion TIM3_IRQHandler nicht
> afgerufen wird?

Indem du den gegebenen Links folgst und liest !

Der IRQ-Handler muß eine C-Funktion sein. Er darf sich zwar in einem 
C++ File befinden, muß dann aber entsprechend gekennzeichnet sein. Das 
hat alles schon mal jemand aufgeschrieben, du mußt es nur lesen. Und 
nein, weder kopieren wir es für dich in diesen Thread noch lesen wir es 
dir vor.

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.