Forum: Mikrocontroller und Digitale Elektronik FreeRtos C++


von Janosch (Gast)


Lesenswert?

Hallo,

habe angefangen mich mit freeRtos zu beschäftigen und das klappt soweit 
ganz gut wenn ich in der C Welt bleibe. Da ist es soweit mein Einblick, 
ein Gewinn.

Sobald ich aber C++ Klassen erstelle und das kompilieren will, fangen 
die Problemchen an.

Nun geht das scheinbar nicht so ohne weiteres C++ Klassen in C zu 
verwenden.
Im Internet liest man einiges über wrapper Lösungsansätze um C++ in C 
Compilern nutzen zu können.
Da freeRtos in C geschrieben ist, ist das nun wohl etwas unglücklich für 
mein Vorhaben, da ich bei C++ bleiben will. In C kenne ich mich gut aus. 
C++ will ich vertiefen.

Muss man bei freeRtos wirklich diese weniger vorteilhaften Klimmzüge 
machen um C++ nutzen zu können?

Gibt es ein freies RTOS das in C++ geschrieben ist?

von Sebastian V. (sebi_s)


Lesenswert?

Janosch schrieb:
> Sobald ich aber C++ Klassen erstelle und das kompilieren will, fangen
> die Problemchen an.

Die da genau wären? Ich hab zwar bisher noch kein FreeRtos benutzt aber 
wüsste jetzt auf Anhieb nicht was dort groß für Probleme auftreten 
sollen (falls man mal Exceptions und so Zeug weglässt). Höchstens das 
irgendwelche Destruktoren nicht aufgerufen werden.

von Noch einer (Gast)


Lesenswert?

Diese "Klimmzüge" sind bei C++ die ganz normale Routine.

Wenn du VisualStudio oder QtDesigner benutzt, bekommst du von diesen 
Klimmzügen nichts mit. Das machen alles die mitgelieferten Libraries von 
alleine.

Alls Übungsaufgabe ist freeRtos ideal! Du lernst die ganzen 
Low-Level-Wrapper kennen.

von PittyJ (Gast)


Lesenswert?

Verstehe ich nicht. Ich benutze FreeRtos in einem C++ Projekt. Ich habe 
keine Probleme damit, die Tasks funktionieren wunderbar. Objekte 
erzeugen und benutzen .. geht wunderbar. Ok, delete mach ich nicht, muss 
ja endlos laufen.

Was geht konkret nicht?

von janosch (Gast)


Lesenswert?

Was nicht geht..

Die ide liefert ein freertos.c Beispiel und ein ledblink.cpp ohne 
freertos Beispiel.

Im ledblink.cpp kann ich wunderbar meine eigene ctest.cpp datei mit 
ctest.h includen, ein Objekt der Klasse ctest erzeugen.... alles super 
und wie erwartet.

Wenn ich nun gleiches in dem freertos.c Beispiel versuche, bekomme ich 
den Fehler das class nicht bekannt ist.
Liegt nicht am includen. Da hat das c Projekt Schwierigkeiten mit der 
cpp.

 Vielleicht sollte ich den Weg gehen, dass ich ein cpp Projekt anlege 
und dann die ganzen freertos Ordner und Dateien da reinkopiere.

Wie gesagt .... mit reinem c funktioniert das mit freertos bei mir 
wunderbar. Mit cpp und freertos habe ich Schwierigkeiten. Es liegt aber 
nicht an den schmalen cpp Kentnissen.

Dennoch liest man im Netz dass freertos geschrieben in  c und cpp nicht 
so ohne weiteres tut.
Mit ifdef __cplusplus habe ich auch schon erfolglos herumexperimentiert.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Wahrscheinlich versuchst du c++ mit c zu kompilieren.

von janosch (Gast)


Lesenswert?

Möglich. Compiler ist gcc.
Habe in der ide noch keinen schalter gefunden wo ich zwischen c und cpp 
wählen kann.
Muss ich da was im make file anpassen?

von Sebastian V. (sebi_s)


Lesenswert?

janosch schrieb:
> Dennoch liest man im Netz dass freertos geschrieben in  c und cpp nicht
> so ohne weiteres tut.
> Mit ifdef __cplusplus habe ich auch schon erfolglos herumexperimentiert.

Man muss halt wissen was man tut. Das __cplusplus define z.B. ist etwas 
das C-Entwickler beachten müssen, wenn sie wollen das ihre C Library 
auch aus C++ heraus benutzbar ist. Ein kurzer Blick in den FreeRTOS.h 
Header zeigt das dort dieses Define benutzt wird, also sollte das 
schonmal passen.

von Carl D. (jcw2)


Lesenswert?

janosch schrieb:
> Möglich. Compiler ist gcc.
> Habe in der ide noch keinen schalter gefunden wo ich zwischen c und cpp
> wählen kann.
> Muss ich da was im make file anpassen?

Die Source-Files mit Extension .cpp und unter Linux mit .C. (groß!) 
ausstatten, dann "übersetzt GCC mit G++"

von S. R. (svenska)


Lesenswert?

janosch schrieb:
> Compiler ist gcc.

Für C++ musst du g++ verwenden, alles andere ist ein Hack.
Da gibt es in deiner unbekannten IDE sicherlich einen Schalter für.

von Rolf M. (rmagnus)


Lesenswert?

S. R. schrieb:
> janosch schrieb:
>> Compiler ist gcc.
>
> Für C++ musst du g++ verwenden, alles andere ist ein Hack.

Beim Compilieren ist es egal, solange die Dateiendung korrekt ist, aber 
beim Linken sollte man auf jeden Fall g++ verwenden.

von PittyJ (Gast)


Lesenswert?

Ich benutze eigene Makefiles.
FreeRtos übersetze ich mit gcc:
/opt/gcc/bin/LPCXpresso_8.1.4_606-gcc -O3 -fno-common -Wall -c 
-fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections 
-fno-exceptions -mcpu=cortex-m0 -mthumb                       -MMD -MP 
-D_REENTRANT -D_BSD_SOURCE -D_GNU_SOURCE -DDEBUG -D__CODE_RED 
-D__USE_LPCOPEN -DCORE_M0PLUS -D__USE_ROMDIVIDE -nostdinc -isystem 
/opt/LPCXpresso_8.1.4_606/lpcxpresso/tools/lib/gcc/arm-none-eabi/5.2.1/i 
nclude  -isystem 
/opt/LPCXpresso_8.1.4_606/lpcxpresso/tools/arm-none-eabi/include 
-isystem 
/opt/LPCXpresso_8.1.4_606/lpcxpresso/tools/arm-none-eabi/include/c++/5.2 
.1  -isystem 
/opt/LPCXpresso_8.1.4_606/lpcxpresso/tools/arm-none-eabi/include/c++/5.2 
.1/arm-none-eabi  -I.  -O3  -c FreeRTOSCommonHooks.c -o 
/home/objs/freertos/FreeRTOSCommonHooks.o


Meine Sourcen dann mit C++
/opt/gcc/bin/LPCXpresso_8.1.4_606-g++ -O3 -fno-common -Wall -c 
-fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections 
-fno-exceptions -mcpu=cortex-m0 -mthumb                       -MMD -MP 
-D_REENTRANT -D_BSD_SOURCE -D_GNU_SOURCE -DDEBUG -D__CODE_RED 
-D__USE_LPCOPEN -DCORE_M0PLUS -D__USE_ROMDIVIDE -nostdinc -isystem 
/opt/LPCXpresso_8.1.4_606/lpcxpresso/tools/lib/gcc/arm-none-eabi/5.2.1/i 
nclude  -isystem 
/opt/LPCXpresso_8.1.4_606/lpcxpresso/tools/arm-none-eabi/include 
-isystem 
/opt/LPCXpresso_8.1.4_606/lpcxpresso/tools/arm-none-eabi/include/c++/5.2 
.1  -isystem 
/opt/LPCXpresso_8.1.4_606/lpcxpresso/tools/arm-none-eabi/include/c++/5.2 
.1/arm-none-eabi   -O3 -fno-rtti -c ADC.cpp -o /home/user/ADC.o


Und gelinkt wird auch alles mit C++
/opt/gcc/bin/LPCXpresso_8.1.4_606-g++ -o 
/home/user/home/nxp/bin/q.axf.bin_static  ... usw.

Das geht prima.
Vielleicht sollte man aus der IDE erst mal zu make gehen, damit man 
genau einstellen kann, was überhaupt passiert.

von Markus (Gast)


Lesenswert?

extern "C" ist das Stichwort:

https://isocpp.org/wiki/faq/mixing-c-and-cpp

von janosch (Gast)


Lesenswert?

Was stimmt den nun?

Ich habe die Erfahrung gemacht dass ich in einem von der ide 
bereitgestellten freertos Beispiel wunderbar mit c weitermachen kann.

Will aber c++ nurzen. Hier habe ich noch keinen Erfolg. Eigene cpp 
Klassen die in einem
eienen Projekt c++ projekt genutzt werden funktionieren. Will ich die in 
freertos nutzen, geht es nicht.

Im Netz finde ich vieles was dafür spricht, das das mit freertos und c++ 
nicht so ohne weiteres geht.

http://www.stf12.org/developers/FreeRTOS_EC.html

Hier gibt es auch unterschiedliche Aussagen.
Was stimmt denn nun?

FreeRtos ist jetzt nicht das mega Betriebssystem.
Gibt es Gründe warum das nicht einfach in einer c++ taugliche Variante 
angeboten wird?

von S. R. (svenska)


Lesenswert?

janosch schrieb:
> Was stimmt den nun?

FreeRTOS ist in C geschrieben, sollte demnach mit einem C-Compiler (gcc) 
gebaut werden und ergibt dann ganz normale Objektdateien.

Dein Code ist in C++ geschrieben, muss(!) also mit einem C++-Compiler 
(g++) gebaut werden und ergibt dann ganz normale Objektdateien mit Name 
Mangling.

Die Objektdateien nimmt der Linker und baut sie zusammen. Welche 
Programmiersprache dafür mal verwendet wurde, interessiert ihn nicht. 
Kann auch Pascal sein, oder eine konvertierte Bilddatei.

Wichtig ist, dass die Interfaces passen, und dazu musst du deinem 
C++-Code sagen, dass manche Interfaces - konkret die FreeRTOS-APIs - dem 
C-Standard folgen. Das machst du mit 'extern "C"' in deinem C++-Code 
(und kannst es auch beim #include um die FreeRTOS-Header wickeln, wenn 
die das nicht schon selbst tun).

Wie du deiner IDE beibringst, C-Dateien mit gcc und C++-Dateien mit g++ 
zu bauen, weiß ich nicht. Du verrätst uns ja auch nicht, was du benutzt. 
Außerdem muss dein Startup-Code für C++ vorbereitet sein (z.B. globale 
Konstruktoren aufrufen), sonst bekommst du relativ schnell Probleme.

Und dann ist C++ auf kleinen Controllern noch lange kein C++ auf großen 
Computern.

von PittyJ (Gast)


Lesenswert?

>>
Im Netz finde ich vieles was dafür spricht, das das mit freertos und c++
nicht so ohne weiteres geht.

http://www.stf12.org/developers/FreeRTOS_EC.html

Hier gibt es auch unterschiedliche Aussagen.
Was stimmt denn nun?
<<

Also: bei mir geht es wunderbar.
Vielleicht fehlen bei dir einfach andere Basics:
- Bedienung einer IDE
- Benutzung von Compilern und Linkern
- Erstellung von Makefiles
- Ansprechen von C-Code in C++

Versuche dieses Wissen zu ergänzen, dann klappt es auch mit Rtos.

von Ruediger A. (Firma: keine) (rac)


Lesenswert?

Du kannst mal hier gucken:

http://www.springer.com/de/book/9783658148492

unter Zusatzmaterial Kapitel 10 ist die Konvertierung einer Beispielapp 
(wie üblich LED Blink) nach C++ als Projekt für WinIdea herunterladbar 
(und im Buch beschrieben).

Es gibt viele Wege, die Welten zusammenzuführen; der einfachste (wie 
schon beschrieben) ist FreeRTOS als C Code zu belassen und den C++ 
Applikationscode mit extern "C" auf die FreeRTOS Systemfunktionen 
zugreifen zu lassen. FreeRTOS selber als C++ Code zu übersetzen geht 
auch (Du musst dann aber ein paar Änderungen im FreeRTOS Code vornehmen, 
weil in C++ illegale implizite type casts vorgenommen werden, die in C 
selber erlaubt sind), ist aber eigentlich eine nicht sinnvolle Übung.

von Janosch (Gast)


Lesenswert?

Denke, so langsam lichtet sich der Nebel.

Habe nun auch versucht ein C file mit Header file in ein kleines Übungs 
C++ Projekt einzubinden.

Das hat soweit geklappt indem ich den/die Funktionsprototypen im C 
Header
in folgendes Konstrukt gepackt habe.

#ifdef __cplusplus
extern "C"{
#endif

// ------------------> Hier reingepackt habe.

#ifdef __cplusplus
}
#endif



Meine main.cpp sieht prinzipiell wie folgt aus.

#include ......

#ifdef __cplusplus
extern "C"
#endif
// Das bedeutet wohl, dass hier C Code aber auch C++ Code kommen kann.
// Das Projekt ist als C++ angelegt. Funktioniert zumindest so bei mir.

main
{

// hier können wohl alle C Funktionen genutzt werden
// deren Header in main.cpp includiert ist und deren Funktionsprototypen
// mit extern "C" wie oben umschlossen sind.

}



Was das nun für mich für FreeRtos bedeutet, weiß ich noch nicht so 
recht.
Vermutlich muss ich in jeden Header der im FreeRtos Paket mitkommt,
mit diesem oben aufgeführten extern "C"{ }  ... Block bereichern.

Vermutlich ein möglicher Weg. Wie umständlich, weiß ich noch nicht.

von S. R. (svenska)


Lesenswert?

Janosch schrieb:
> #ifdef __cplusplus
> extern "C"
> #endif
> // Das bedeutet wohl, dass hier C Code aber auch C++ Code kommen kann.
> // Das Projekt ist als C++ angelegt. Funktioniert zumindest so bei mir.

Das heißt, dass Code, der an dieser Stelle auftaucht, eine C-kompatible 
Schnittstelle verpasst bekommen, und zwar unabhängig davon, ob er nun in 
C oder C++ geschrieben ist. Das ist ein Unterschied!

Bedenke außerdem, dass C und C++ nicht vollständig zueinander kompatibel 
sind. Du kannst zwar viel C-Code problemlos durch einen C++-Compiler 
schicken, aber eben bei weitem nicht jeden.

von janosch (Gast)


Lesenswert?

Läuft nun alles wie erwartet. :-)

Ich habe wohl anfänglich auf die für mich falschen IDEs gesetzt.

Nun benutze ich das SW4STM32 das von STM bereitgestellt wird und kann nu 
ohne Probleme das freeRtos nutzen inklusive cpp Klassenfiles.

Wird wohl auch mit den anderen IDEs gehen .... war aber eben bei mir 
nicht erfolgreich.

Gewöhnlich sitzt der Depp jedoch vor dem Computer und somit werde ich 
das, sobald ich Zeit finde, auch mit meiner anderen aktuell noch leicht 
favorisierten IDE nochmals probieren.

von Zehpepeh (Gast)


Lesenswert?


von Markus (Gast)


Lesenswert?

Witziger Weise gibt es genau zur selben Zeit einen Artikel auf Hackaday 
zu C++ FreeRTos

http://hackaday.com/2017/04/08/freertos-gets-class/

von Freddie C. (freddiechopin)


Lesenswert?

(sorry for writing in English - you don't want to read my German (; )

You could also try an alternative approach, which is to use a RTOS 
written entirely in C++. As I also wanted to stay with C++ and avoid all 
the wrapper-related problems, I've just strated my own project - 
http://distortos.org/ . This is a working solution which I used with 
success in several commercial projects (;

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.