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?
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.
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.
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?
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.
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.
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++"
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.
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.
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.
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?
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.
>>
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.
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.
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.
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.
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.
(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 (;