Hallo an alle! Nachdem ich einige Diskussionen zum Thema C++ auf Mikrocontrollern verfolgt habe, bin ich auf dieses Buch gestoßen: Real-Time C++: Efficient Object-Oriented and Template Microcontroller Programming 978-3642346873 von Christopher Kormanyos Der Autor hat sogar die Codebeispiele auf github veröffentlicht: https://github.com/ckormanyos/real-time-cpp Obwohl das Buch von 2013 ist, finde ich keine (aussagekräftigen) Bewertungen. Hat sich jemand dieses Buch gekauft und kann es weiterempfehlen für jemanden, der sich mit C++ speziell auf Mikrocontrollern auseinandersetzen und es lernen möchte und der schon recht tiefgehende C Kenntnisse hat? Gibt es dafür vielleicht noch andere oder bessere Bücher? Habe mir vor einiger Zeit mal ein recht dickes C Buch gekauft, aber das war eine absolute Enttäuschung... Danke schon mal im Voraus! Grüße Jan
Das C Buch (C von A bis Z...), von dem ich schrieb, ist von der Theorie her in Ordnung, aber die Praxis (im Wesentlichen Codebeispiele) sind katastrophal und inkonsequent. Damit konnte man halt nicht vernünftig arbeiten. Dass sich die Geister bei der Anwendung von C++ auf Mikrocontrollern spalten, ist mir mittlerweile mehr als klar. Bin aber auch ziemlich überzeugt davon, dass man sehr effiziente Ergebnisse erzielen kann, wenn man es richtig macht und nicht alle Features von C++ genutzt werden (in dem Buch geht es ja offensichtlich im Wesentlichen um Templates). Darüber hinaus steht im github Readme:
1 | The reference application supports the following targets: |
2 | * Win32 in both Release and Debug modes |
3 | * ATMEL(R) AVR(R) Atmega328P |
4 | * ST Microelectronics(R) STM32F100 ARM(R) Cortex(TM)-M3 |
5 | * ST Microelectronics(R) STM32F407 ARM(R) Cortex(TM)-M4 |
6 | * ST Microelectronics(R) STM32F429 ARM(R) Cortex(TM)-M4 |
7 | * BeagleBone with Texas Instruments(R) AM3359 ARM(R) A8 |
8 | * Renesas(R) RL78/G13 |
9 | * Renesas(R) RX600 |
10 | * Microchip(R) PIC(R)32 MIPS4K |
11 | * Raspberry Pi with ARM(R) 11 |
Da ist genau ein kleiner Mikrocontroller dabei. Das Buch bezieht sich also offensichtlich nicht nur auf kleine Mikrocontroller. Oder sehe ich das falsch? Das ist ja im Wesentlichen meine Frage, und halt auch, ob man vernünftig und praxisnah mit den Beispielen arbeiten kann (also weiß der Autor, wovon er redet bzw. schreibt). Hoffe, mein Anliegen ist nun verständlicher.
Ich würde C++ und Mikrokontroller trennen. Zum einen ist jeder Mikrocontroller anders (Hardware). Zum anderen ist jeder Mikrokontroller anders (Befehlssatz). Zum Dritten ist jeder Mikrokontroller anders (wenige Compiler unterstützen DEINEN Kontroller - aber vielleicht den, den Du nicht gebrauchen kannst). Bein "normalem" C sieht das schon ganz anders aus. Da muss jeder Hersteller etwas zur Verfügung stellen. Und wenn es der Link zu einem Compilerbauer ist. In dem Moment, in dem Du auf die Hardware zugreifst, ist mit Portabilität sowieso Schluss. Wegen des doch meist großen Overheads von C++ ist oft noch ein Platzproblem, bei den etwas einfacheren Teilen, gegeben. Kein Thema, wenn Dein Chef sagt: "Geld spielt keine Rolle".
Zum TO: Das Buch ist super, weil es viele, direkt einsetzbare Beispiele liefert und die Kosten einzelner C++ Konstrukte genau aufzeigt. Insbesondere Templates kosten zur Laufzeit nichts, können aber elegant Code erzeugen und. Annahmen prüfen . Mit statischer Polymorphie kann man fast alle Vorteile von Objektorientierung nutzen ohne irgendwelche virtuellen Funktionen, welche gewisse Laufzeitkosten verursachen. Moby schrieb im Beitrag #4274449: > Ok Jan. Stell Dein erstes C++ MC Projekt dann in der Projektesammlung > vor. Die erzielte Effizienz, auch in Bezug auf den Lernaufwand, > interessiert mich brennend. Gibt ja kaum was in dieser Kategorie ;-) Moby du kannst nicht einmal eine x < 10000 in ASM effizienter implementieren als der Compiler. C++ ist halt nicht in 5 Minuten zu erlernen aber ermöglicht Dinge die den kleinen ASM Programmierer zu erschreckend erscheinen.
>Zum TO: Das Buch ist super, weil es viele, direkt einsetzbare Beispiele >liefert und die Kosten einzelner C++ Konstrukte genau aufzeigt. >Insbesondere Templates kosten zur Laufzeit nichts, können aber elegant >Code erzeugen und. Annahmen prüfen . Natürlich kosten Templates nur Platz in einer Textdatei. Das aber bedeutet, dass Du sie umsonst geschrieben hast. Setzt Du sie aber um, so sieht es schon ganz anders aus. An dieser Stelle macht sich dann oft das "Metzgereiprinzip" (darfs ein bissel mehr sein) bemerkbar. Viele Klassen sind nämlich eierlegende Wollmichsäue. Das werden für alle möglichen Bedingungen Funktionen eingebaut
Als ich das Buch zum ersten Mal in die Finger bekam, habe ich natürlich erstmal diagonal über die Beispiele geschaut. Dabei hätte ich fast den Fehler gemacht, es für immer in's Regal zu stellen und zu vergessen, weil der Kode mir fast unlesbar erschien. Nachdem ich dann aber trotzdem mal gelesen habe, was das alles soll, habe ich doch Dinge gelernt, auf die ich so selbst nicht gekommen wäre. Insbesondere wie man Templates benutzt, um Ressourcen (z.B. Pins oder eingebaute Peripheriegeräte (DAC, ADC...)) gegen mehrfache Benutzung aus mehreren Programm- bzw. Bibliotheksteilen zu schützen und, um nur genau die benötigte Funktionalität in's Programm hineinzukompilieren. Alles in allem würde ich es wieder kaufen.
:
Bearbeitet durch User
Der Kampf hier um die "richtige" Programmiersprache auf einem uC ist ja schlimm. Schaut euch doch einmal auf dem Programmiersprachen-Markt auf den großen Rechnern um. Da ergibt sich eine gesamte Schlachtfeld-Landschaft, wo hunderte kleine und große Programmiersprachen-Fans sich Grabenkämpfe liefern bis die Nacht zum Tage wird. Und dann kommen die Spielverderber und raunen daher: "Nehmt einfach die richtige Sprache für die jeweilige Anwendung.". Und alle haben Angst, nicht "dir richtige Sprache" für ihre jeweilige Anwendung zu beherrschen. Also wird angefangen sich in andere Sprachen einzuarbeiten, und Zeit zu investieren. Und das Investment soll sich natürlich auszahlen. Daher werden sie unsicher, und Fragen nach, "Lerne ich die richtige Sprache?". Aber soviel dazu. In die Wahl der Hilfsmittel (hier: Programmiersprache als Hilfsmittel zur Maschinencode-Erzeugung) fließen typischerweise viel zu viele Faktoren ein. U.A.: Können meine Kollegen die Sprache? Unterstützt die Plattform die Sprache? Wie gut bin ich selbst in der Sprache? Hat das Marketing ein Mitspracherecht und will "Haskell" oder "Java" auf der Flagge stehen haben? Wenn ein Bastler, der evtl. in seinem Hauptberuf C++ benutzt, einen MC in C++ programmieren will, und zufällig seine Wahl auf einen in der Sprache programmierbaren fällt, dann ist doch alles Prima. In der Natur der Sache muss er natürlich den Gebrauch der Sprache auf die Plattform anpassen. Letztendlich werden weder C noch C++ in ihrer völligen Pracht auf MCs genutzt. Vor allem da zu einer Programmiersprache auch die Standardbibliothek gehört. Und da hört es in C bei MCs ja schon bei C's fopen() oder malloc() auf angenehm zu sein. Es hilft nichts, der jeweilige Programmierer muss die Grenzen seiner Plattform kennen und wie sich diese auf die jeweilige Sprache auswirken. Ich verstehe den K(r)ampf um die Sprache hier genauso wenig wie einen imaginären Kampf um den besten Text-Editor für MC-Quelltexte - Vi(m) oder doch Emacs? Eclipse's Texteditor oder doch Qt Creator? Nehmt doch was ihr wollt für die Hobbyprojekte, auf Arbeit hat man üblicherweise nicht die Freiheit dies auszuwählen.
Hannes J. schrieb im Beitrag #4274685: > Stefan K. schrieb: >> @Hannes: >> Hat Dir Dein Chef gerade gekündigt, weil Du trotz Aufforderung vor einem >> Jahr immer noch kein C++ kannst? > > Ich habe mein erstes C++ Programm vor rund 25 Jahren geschrieben, als > man C++ noch mit cfront nach C übersetzte. Mein letztes C++ entstand > irgendwann im letzten Jahr. Ansonsten sehe ich allerdings keinen Grund > mich gegenüber Pissern wie dir mit deinen Mobbing-Taktiken von Schulhof > weiter rechtfertigen zu müssen. Ich habe auch schon einige C++-Programme geschrieben. Können tu ich es trotzdem nicht wirklich (zumindest nicht so gut wie ich gerne könnte). Doch darum geht es doch hier gar nicht. Der TO hat gefragt ob hier jemand ein bestimmtes C++ Buch kennt. Leider hat Moby diesen Thread entdeckt und musste sofort rum meckern. @Hannes: Auch wenn du nicht gerne in C++ programmierst, so interessiert das hier keine Sau. Die Frage ist: Kennst du das Buch? Ulli
Ich hab mir mal die Sourcen angesehen, soeziell folgende: https://github.com/ckormanyos/real-time-cpp/blob/master/chapter02_02/led.cpp Das Konzept ist sehr gut, aber as gibt etwas dass als Fehlerhaft betrachtet werden könnte: Folgendes ist Global:
1 | const led led_b5 |
2 | {
|
3 | mcal::reg::portb, |
4 | mcal::reg::bval5 |
5 | };
|
Das Problem ist im Konstruktor von LED:
1 | *reinterpret_cast<volatile bval_type*>(port) &= static_cast<bval_type>(~bval); |
Dieser code wird zu einem unbestimmten Zeitpunkt vor der Main ausgeführt. Auch wenn die generierte Instruktion (bei avr z.B. sbi) vermutlich immer Funktioniert, würde ich mich darauf niemals verlassen. Sauberer währe eine globale init_leds Methode das initialisieren der Leds übernehmen zu lassen und diese in der main aufzurufen. Ausserdem ist mir Aufgefallen, dass es überflüssige casts gibt und magic numbers verwendet werden. dport=port-1um das ddr register zu setzen? Und genau hier keine kommentarzeile! Aber abgesehen von all dem würde ich das Buch sofort kaufen, wenn ich es den bräuchte. Ich habe ein tiefes Verständnis von C, C++, JavaScript/ECMAScript, Java, php, glsl und html. Für einen uC sind C und C++ in bezug auf Performance gleichwertig, es ist bei GCC immer möglich in c den selben Maschienen code generieren zu lassen wie in einem beliebigen C++ code und umgekehrt. Die schwierigkeit an gutem C++ code ist die wahl der richtigen Paradigmen für eine Aufgabenstellung. Wenn dies jemand perfekt beherscht (,was eher unwarscheinlich ist), ist C++ auch in der uC Programierung die beste wahl.
Wir hatte es hier glaube ich schon einmal. Es gibt ein schönes Beispiel von Adafruit für eine Art Multitasking System mit C++: https://learn.adafruit.com/multi-tasking-the-arduino-part-1/overview Der Code wird in den Lektionen Schritt für Schritt aus C entwickelt bis man schließlich bei C++ landet: https://learn.adafruit.com/multi-tasking-the-arduino-part-1/overview Ich finde diese Herleitung ziemlich gelungen.
Der zweite Link war leider falsch, hier der richtige: https://learn.adafruit.com/multi-tasking-the-arduino-part-1/a-classy-solution
Wow, danke für die ganzen Antworten! Muss ehrlich sagen, dass ich nach den unsachlichen und einfach falschen Antworten, bei denen Dinge behauptet wurden, die ich so gar nicht gesagt habe, nicht mehr vor hatte, hier nochmal zu antworten. Aber danke fürs Aufräumen, Andreas! :) Vielen Dank auf jeden Fall für das ausführliche Feedback. Im Wesentlichen haben sich meine Fragen und anfänglichen Zweifel damit geklärt. Mir ist durchaus klar, dass C++ ein sehr mächtiges Werkzeug ist und wie das mit Werkzeugen nunmal immer so ist, muss man sie beherrschen können, sonst bringen sie einem nichts. Aber genau das möchte ich ja lernen, eigentlich ist es mir dabei egal, ob und wie C++ nun auf Mikrocontrollern eingesetzt wird. Mir persönlich hat es beim Lernen von C sehr geholfen, auf einem Mikrocontroller zu starten, weil man sich - zumindest mir ging es so - einfach mehr Gedanken über die Effizienz und den Ablauf usw. macht und ich hoffe, dass es mir beim Lernen von C++ ähnlich gehen wird. Wenn es dann auf einem kleinen System funktioniert, kann man ja immer noch expandieren und weitere Features von C++ dazu nehmen :) chris_ schrieb: > Wir hatte es hier glaube ich schon einmal. Es gibt ein schönes Beispiel > von Adafruit für eine Art Multitasking System mit C++: > https://learn.adafruit.com/multi-tasking-the-arduino-part-1/overview Danke für den Link, werde ich mir mal ansehen! Sieht aber sehr interessant aus!
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.