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!
Warum willst du ein C Programm mit einem C++ Compiler übersetzen.? Es reicht, wenn die C++ Quellen per g++ übersetzt werden. Hth, Adib.
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 :(.
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.
Hat sich geklärt. Ich muss die Interrupts in einer .c platzieren, sondern werden diese nicht angesprungen.
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
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?
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.
NochNichtCubeUser schrieb: > im h und cpp-File > > extern "c" void InterruptFunction () > { > } Danke, das hat geholfen!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.