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.
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?
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.
Witziger Weise gibt es genau zur selben Zeit einen Artikel auf Hackaday zu C++ FreeRTos http://hackaday.com/2017/04/08/freertos-gets-class/
(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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.