Forum: Mikrocontroller und Digitale Elektronik C++ auf Mikrocontrollern: Buchempfehlung


von Jan B. (diphthong)


Lesenswert?

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

von Jan B. (diphthong)


Lesenswert?

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.

von Amateur (Gast)


Lesenswert?

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".

von Scelumbro (Gast)


Lesenswert?

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.

von Amateur (Gast)


Lesenswert?

>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

von Georg B. (diereinegier)


Lesenswert?

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
von R. R. (elec-lisper)


Lesenswert?

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.

von Ulli (Gast)


Lesenswert?

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

von Daniel A. (daniel-a)


Lesenswert?

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.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Bitte beim Thema bleiben.

von chris_ (Gast)


Lesenswert?

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.

von chris_ (Gast)


Lesenswert?

Der zweite Link war leider falsch, hier der richtige:
https://learn.adafruit.com/multi-tasking-the-arduino-part-1/a-classy-solution

von Jan B. (diphthong)


Lesenswert?

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
Noch kein Account? Hier anmelden.