Forum: Mikrocontroller und Digitale Elektronik STM32 mit Atollic und Cube


von Johnny S. (sgt_johnny)


Lesenswert?

Hi,


Mein Ziel ist es für ein bestehendes Projekt den Mikrocontroller zu 
wechseln. Hierbei ist STM32 die Wahl. Zum Programmieren habe ich mich 
aktuell für Atollic True Studio entschieden, da es von ST selbst kommt, 
und wie die meisten anderen IDE's auch auf Eclipse basiert.

Da im Projekt bereits div. C++ Klassen existieren, wäre es ein 
unlohnender Aufwand diese alle in C neu zu entwickeln und dann noch den 
Main von classname.function() zu bereinigen. Wird mit C++ weitergemacht, 
müssen nur die Hardwarefunktionen ersetzt werden.

Hierzu ging ich also wiefolgt vor:


1.) Projekt über STM32Cube generieren und speichern
2.) In Atollic öffnen
3.) File->New-> Convert to C/C++
4.) Main.c in Main.cpp umbenennen
5.) im Main.h die Zeile "#define __cplusplus" ergänzen
6.) Im Project unter C++ die Pfade angeben, welche bei C drinne stehn.


Nun versuchte ich zu builden.
Ich erhalte immer wieder die drei Fehler x mal:

1.) "exoected identifer or '(' before ... token
2.) "expected identifert or '(' before string constant
3.)  unknown type name 'uint32_t'

Interessanter Weise erscheint Fehler 1 und 2 immer bei diesen Zeilen
1
#ifdef __cplusplus
2
 extern "C" {
3
#endif

Kann mir jemand hier vielleicht aus Erfahrung sagen was ich tun muss, um 
die Fehler zu korrigieren und ein Funktionierendes C++ Projekt zu 
erhalten.

von Jim M. (turboj)


Lesenswert?

Häng mal komplette Files hier an, die Forensoftware kennt C, CPP und .H 
Dateien.


Normalerweise braucht man das 'extern "C" { }' nur in speziellen Fällen, 
wie z.B. IRQHandler() Funktionen.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Johnny S. schrieb:
> 5.) im Main.h die Zeile "#define __cplusplus" ergänzen

Das ist verkehrt. Das macht der C++ Compiler automatisch.

Johnny S. schrieb:
> Kann mir jemand hier vielleicht aus Erfahrung sagen was ich tun muss, um
> die Fehler zu korrigieren und ein Funktionierendes C++ Projekt zu
> erhalten.
In den Source Code gucken und schauen was falsch ist.

von Harry L. (mysth)


Lesenswert?

Johnny S. schrieb:
> 3.) File->New-> Convert to C/C++

Keine gute Idee.
Laß die main.c in C und bau deinen Code in C++ dazu. (deparate Files)

Johnny S. schrieb:
> 5.) im Main.h die Zeile "#define __cplusplus" ergänzen

auch keine gute Idee.
__cplusplus wird vom Compiler erzeugt, und alle HAL-Header haben am 
Anfang bereits ein
1
#ifdef __cplusplus
2
extern "C"
3
{
4
#endif
Die kannst du also prolemlos in deinem C++-Code nutzen.

von Johnny S. (sgt_johnny)


Lesenswert?

Harry L. schrieb:
> Keine gute Idee.
> Laß die main.c in C und bau deinen Code in C++ dazu. (deparate Files)

Also du meinst prinzipell im "main.c" beim User-Code "while(1) {})" dann 
zb. eine Funktion einfügen?
1
app.crsc();

Einfügen und dann in einer Separaten Datei (app.cpp) den kompletten 
Ablauf implementieren?

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Johnny S. schrieb:
> Also du meinst prinzipell im "main.c" beim User-Code "while(1) {})" dann
> zb. eine Funktion einfügen?
> app.crsc();

Das klappt nicht, das ist C++!

Ändere einfach alles auf C++, außer den Bibliotheken.

von Johnny S. (sgt_johnny)


Lesenswert?

Niklas G. schrieb:
> Johnny S. schrieb:
>> Also du meinst prinzipell im "main.c" beim User-Code "while(1) {})" dann
>> zb. eine Funktion einfügen?
>> app.crsc();
>
> Das klappt nicht, das ist C++!
>
> Ändere einfach alles auf C++, außer den Bibliotheken.

Ja, aber im Main.c unter "while(1)" muss ja der User-Code eingefügt 
werden, also das was der MCU machen soll, wenn main.c eine C Datei ist, 
kann man kein C++ nutzen, also muss man ja irgendwie aus dem Main auf 
eine C++ Datei umbiegen

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Johnny S. schrieb:
> wenn main.c eine C Datei ist,
> kann man kein C++ nutzen, also muss man ja irgendwie aus dem Main auf
> eine C++ Datei umbiegen

Ja, daher machst du da eine C++ Datei draus. Das hast du doch sogar 
schon:

Johnny S. schrieb:
> 4.) Main.c in Main.cpp umbenennen

Dann wird sie mit dem C++ Compiler kompiliert, und du kannst ganz normal 
C++ darin verwenden.

von Vincent H. (vinci)


Lesenswert?

Johnny S. schrieb:
> Ja, aber im Main.c unter "while(1)" muss ja der User-Code eingefügt
> werden, also das was der MCU machen soll, wenn main.c eine C Datei ist,
> kann man kein C++ nutzen, also muss man ja irgendwie aus dem Main auf
> eine C++ Datei umbiegen

main.c -> main.cpp

Problem solved?

/edit
Ah, da war wer schneller...

: Bearbeitet durch User
von Harry L. (mysth)


Lesenswert?


von Johnny S. (sgt_johnny)


Lesenswert?

Vincent H. schrieb:
> Johnny S. schrieb:
>> Ja, aber im Main.c unter "while(1)" muss ja der User-Code eingefügt
>> werden, also das was der MCU machen soll, wenn main.c eine C Datei ist,
>> kann man kein C++ nutzen, also muss man ja irgendwie aus dem Main auf
>> eine C++ Datei umbiegen
>
> main.c -> main.cpp
>
> Problem solved?
>
> /edit
> Ah, da war wer schneller...
Nein das ist ja genau was ich getan habe...

Ich hatte das File umbenannt udn dann kamen die Errors, nenne ich es 
wieder ".c" dann verschwinden die Errors :)

von Vincent H. (vinci)


Lesenswert?

Dein unknown type Fehler verschwindet wenn du <cstdint> inkludierst... 
für die anderen beiden würde ich dich bitten main.cpp hier raufzuladn.

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.