Forum: Mikrocontroller und Digitale Elektronik Microcontroller / C++


von Peter (Gast)


Lesenswert?

Hey

Nur eine kurze Frage: Grundlagen für den Arduino habe ich schon, doch 
die sind noch zu wenig gefestigt und darum habe ich mich entschieden, um 
die Sprache(C++) besser verstehen zu können, zuerst mal das C++ schön 
systematisch lernen und danach mich dem Microcontroller zuwenden.


Was meint ihr? Ist das sinnvoll so? Oder hat jemand bessere 
Lösungsvorschläge?

MFG

von PittyJ (Gast)


Lesenswert?

wenn man teilweise die Fragen hier liest ....

Es kann nicht schaden, eine vernünftige Grundlage an C oder C++ zu 
haben, wenn man programmieren möchte.

von Peter2 (Gast)


Lesenswert?

Peter schrieb:
> und danach mich dem Microcontroller zuwenden.

dazu benötigst Du -zuvor- nicht zwingend C oder C++

Peter schrieb:
> bessere
> Lösungsvorschläge

für Lösungsvorschläge muss man erstmal wissen was gelöst werden soll.
sprich, was hast du konkret vor?

lernen um des lernens willen?

> Grundlagen für den Arduino habe ich schon, doch
> die sind noch zu wenig gefestigt

zum "Festigen" brauchst Du jedenfalls kein C++ zu lernen

von Carl D. (jcw2)


Lesenswert?

Immer sinnvoll ein großes Problem in zwei unabhängige kleinere 
Teilprobleme zu trennen. Allerdings sind die Teilbereiche von C++, die 
man sinnvoll auf dem μC verwenden kann, meist nicht Bestandteil eines 
C++ Tutorials für PCs.
IoStreams, virtuelle Methoden, dynamische Objekterzeugung, ... sind 
nichts, was auf μC uneingeschränkt benutzt werden sollte. Dort braucht 
man Templates, Overloading, ... und min. C++11. Das kann sogar der alte 
4.9er GCC aus der Arduino-IDE, ohne daß man dort aber davon Gebrauch 
machen würde.

von Huh (Gast)


Lesenswert?

Peter2 schrieb:
>> Grundlagen für den Arduino habe ich schon, doch
>> die sind noch zu wenig gefestigt
>
> zum "Festigen" brauchst Du jedenfalls kein C++ zu lernen

Du meinst also, daß man lieber bei den Grundlagen bleiben sollte? ;-)

Auch wenn man das C++ nicht nur für den Arduino, sondern auch bei 
anderen Programmierprojekten gebrauchen kann, reichen also die 
Grundlagen? Seltsame Einstellung...

von Stefan F. (Gast)


Lesenswert?

Einen Teil von C++ kannst du sinnvoll auf Mikrocontrollern verwenden. Du 
wirst aber auch ein bisschen C benötigen - spätestens wenn du 
Interrupt-Routinen schreibst.

Das Makefile in meiner Hello-World Vorlage eignet sich sowohl für C als 
auch für C++: http://stefanfrings.de/avr_hello_world/index.html

Berücksichtige Carl's Hinweis. Am Einfachsten ist es sicher, wenn du die 
Programmiersprache zuerst auf einem PC lernst und Dir dann ein Tutorial 
anschaust, dass zeigt, welche Teile der Sprache auf Mikrocontrollern 
sinnvoll nutzbar sind.

Arduino ist meiner Meinung nach ein schlechtes Vorbild. Dort benötigt 
man Berichten zufolge über 200 Takte, um eine LED einmal an und wieder 
aus zu schalten. Wenn man es richtig macht, braucht man dazu nichtmal 10 
Takte.

von Christopher J. (christopher_j23)


Lesenswert?

Was das verfassen von C++ Quelltexten angeht gilt meiner Meinung nach 
das selbe wie in der Grundschule: Wer selber viel liest, dem fällt auch 
das schreiben von Texten leichter. Leider gilt auch bei C++, dass man 
noch lange nicht etwas (fehlerfrei) schreiben kann, was man zu lesen in 
der Lage ist aber es vergrößert doch den "Wortschatz" wenn man fremde 
Quelltexte liest. Dann kannst du dir irgendein Projekt deiner Wahl 
schnappen, dich dort einlesen und das nach deinen Vorstellungen 
erweitern oder verbessern. Wenn du deinen Quelltext frei zur Verfügung 
stellst wirst du eventuell auch Verbesserungsvorschläge von anderen 
Leuten bekommen, die eventuell schon etwas erfahrener sind als du.

Noch eine Sache aus eigener (bitterer) Erfahrung:
Es ist meiner Meinung nach sinnvoller sich zuerst solide Grundkenntnisse 
in C anzueignen bevor man sich auf C++ stürzt. Ich habe selber den 
Fehler gemacht mich zuerst mit C++ zu beschäftigen weil ich dachte C++ 
ist eine Obermenge von C, also muss es besser sein. Für das erlernen von 
C++ ist aber genau das Gegenteil der Fall: Da C eine Teilmenge von C++ 
ist, macht es Sinn sich zuerst auf C zu beschränken. Gerade im 
Mikrocontroller-Umfeld ist C nach wie vor weit verbreitet und wenn du 
dir z.B. die Arduino- oder mbed-Bibliotheken anschaust wirst du 
feststellen, dass C++ meistens nur als (sehr dünner) Wrapper um 
vorhandene C-Bibliotheken verwendet wird. C ist an und für sich ja schon 
komplex genug (im Vergleich zu anderen Hochsprachen) obwohl es per 
Definition nur einen Bruchteil der Komplexität von C++ besitzt. Wenn du 
also irgendwann ein sicheres Verständnis von Zeigern hast, weißt wie ein 
Struct im Speicher aussieht und verstanden hast wie das eigentlich mit 
Stack und Heap funktioniert, dann und erst dann würde ich mich an deiner 
Stelle in die endlosen Weiten von C++ stürzen. Das Wissen was du durch 
das erlernen von C erwirbst ist jedoch keines Falls verloren, denn du 
kannst es quasi 1:1 auf C++ anwenden.

Wenn du der englischen Sprache mächtig bist kannst du dir z.B. mal den 
Online-Kurs von Jonathan Valvano auf EDX anschauen: 
https://courses.edx.org/courses/course-v1:UTAustinX+UT.6.10x+1T2017/a827a8b3cc204927b6efaa49580170d1/

Da lernst du die Grundlagen von C und Assembler und wie ein 
Microcontroller aufgebaut ist und wie er arbeitet und was man so alles 
damit anstellen kann.

von Michael B. (laberkopp)


Lesenswert?

Peter schrieb:
> meint ihr? Ist das sinnvoll so?

Nein.
Man kann C++ so lernen, daß man auf einem Arduino keine Zeile 
programmieren kann.
Lerne Arduino aus Beispielen zum Arduino (oder Büchern).

Wenn du HINTERHER das gante C++ lernst, merkst du, wie einschränkend der 
Arduino ist.

von Stefan F. (Gast)


Lesenswert?

@Christopher:
Ich habe dir ein +1 gegeben, wegen dem Vorschlag, Quelltexte zu 
veröffentlichen, und zwar ganz genaus aus dem von Dir genannten Grund.

Open-Source bedeutet: Geben und Nehmen. Das ist für Beide Seiten eine 
Gute Sache. Kann ich aus eigener Erfahrung bestätigen.

von W.S. (Gast)


Lesenswert?

Peter schrieb:
> ...und danach mich dem Microcontroller zuwenden.
>
> Was meint ihr? Ist das sinnvoll so? Oder hat jemand bessere
> Lösungsvorschläge?

Verstehe das mal richtig: Mikrocontroller sind Hardware und sie werden 
zusammen mit anderer Hardware eingesetzt.

Der Umstand, daß ein µC eben auch ein Programm benötigt, um sinnvoll zu 
funktionieren, ist dabei nur ein Teil-Aspekt, aber nicht die Hauptsache.

Bevor du also schreibst, daß du dich dem µC zuwenden willst, solltest du 
erstmal dich selbst fragen, was du eigentlich tun willst.

Das Normale im Umgang mit µC besteht darin, daß man Geräte baut, die 
eine Funktion haben, also beispielsweise ein Thermometer, eine Uhr, eine 
Steuerung für irgendwas (vom Rolladen über das selbstgebaute Radio bis 
zum 3D-Drucker), ein Meßgerät oder so ähnlich.

Also, sich µC zuzuwenden heißt im Klartext: Geräte konzipieren, deren 
Funktionalität planen, Hardware entwickeln, Schaltungen und 
Leiterplatten und dann erst Herumprogrammieren.

Also mein Vorschlag wäre, dich hinzusetzen, nachzudenken über deine 
Ziele und Prioritäten zu setzen. Kein anderer kann das, was dir in 
deinem Kopf vorschwebt, aus der Ferne riechen.

W.S.

von Mark B. (markbrandis)


Lesenswert?

Stefan U. schrieb:
> Arduino ist meiner Meinung nach ein schlechtes Vorbild. Dort benötigt
> man Berichten zufolge über 200 Takte, um eine LED einmal an und wieder
> aus zu schalten. Wenn man es richtig macht, braucht man dazu nichtmal 10
> Takte.

Für nicht genutzte Rechenzeit gibt es kein Geld zurück.

von Julian B. (julinho)


Lesenswert?

Stefan U. schrieb:
> Wenn man es richtig macht, braucht man dazu nichtmal 10
> Takte.

ich schaff's in zwei Takten

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Kirk: Scotty, wie lange brauchst du, um den Schaden zu reparieren?
Scotty: 24 Stunden, Captain.
Kirk: Scotty, schaffst du es in 12 Stunden?
Scotty: Für sie mache ich es in 8 Stunden.

https://thinkfirstdevelopment.wordpress.com/2011/08/03/zeitschtzung-nach-star-trek-art/

;) ganz ohne Assembler gg

von Nop (Gast)


Lesenswert?

Ich empfehle, erstmal C zu lernen. Beethoven hat seine erste Sinfonie 
bekanntlich auch in C und nicht in C++ geschrieben.

von Ruediger A. (Firma: keine) (rac)


Lesenswert?

Mark B. schrieb:
> Stefan U. schrieb:
>> Arduino ist meiner Meinung nach ein schlechtes Vorbild. Dort benötigt
>> man Berichten zufolge über 200 Takte, um eine LED einmal an und wieder
>> aus zu schalten. Wenn man es richtig macht, braucht man dazu nichtmal 10
>> Takte.
>
> Für nicht genutzte Rechenzeit gibt es kein Geld zurück.

Doch:

- Lass den Code in einem ISR ablaufen.
- Wenn die benötigte Taktzahl zum Abarbeiten des ISR grösser ist als die 
Feuerfrequenz des ISR (z.B. bei seriellen Übertragungen), verlierst Du 
Interrupts.
- Du hast dann zwei Lösungsmöglichkeiten:
  1. Schnelleren Prozessor (= teurer aus mehreren Gründen)
  2. ISR auf Umlaufzeit optimieren.

Die zweite Variante spart eindeutig Geld. Ob "sparen" und 
"zurückbekommen" effektiv verschiedene Dinge sind... kann man natürlich 
diskutieren.

Aber ich bin mir sicher, dass Du das weisst. ISR Zyklenoptimierung ist 
Bestandteil des Grundwerkzeugkastens von (zumindestens systemnah 
arbeitenden) Embedded Entwicklern. Ob sich das ändern wird, hängt einzig 
und Allein davon ab, ob Hardware so billig wird, dass zumindestens im 
Einkauf der Unterschied zwischen einem Minimalprozessor und einem 
deutlich überdimensionierten Prozessor auf Null schrumpft. Selbst dann 
wird es Einsatzgebiete geben, wo der kleinstmöglich getaktete Prozessor 
die Hardware bestimmt (z.B. dort wo Stromverbrauch oder Wärmeentwicklung 
im kritischen Pfad liegt).

von Mark B. (markbrandis)


Lesenswert?

Ruediger A. schrieb:
> Doch:
>
> - Lass den Code in einem ISR ablaufen.
> - Wenn die benötigte Taktzahl zum Abarbeiten des ISR grösser ist als die
> Feuerfrequenz des ISR (z.B. bei seriellen Übertragungen), verlierst Du
> Interrupts.
> - Du hast dann zwei Lösungsmöglichkeiten:
>   1. Schnelleren Prozessor (= teurer aus mehreren Gründen)
>   2. ISR auf Umlaufzeit optimieren.
>
> Die zweite Variante spart eindeutig Geld. Ob "sparen" und
> "zurückbekommen" effektiv verschiedene Dinge sind... kann man natürlich
> diskutieren.

Schon recht. Nur ist Arduino eben auch für Leute gemacht, die keine 
Ahnung haben was eine Interrupt Service Routine ist und die auch gar 
nicht unbedingt bis auf dieses Level hinabsteigen wollen.

Einen Musiker, Künstler, (Nicht-Elektronik-)Bastler interessiert es 
nicht, ob sein Code in 10 oder in 200 Takten ausgeführt wird. Er will 
ein bestimmtes Ergebnis sehen und die Details der technischen Umsetzung 
dahinter sind ihm relativ egal.

von W.S. (Gast)


Lesenswert?

Mark B. schrieb:
> Für nicht genutzte Rechenzeit gibt es kein Geld zurück.

Oh doch.

Sowas merkst du sehr schön, wenn du die Batterien nicht alle 3 Wochen, 
sondern alle 3 Tage wechseln mußt, weil der Blödian, der die Firmware 
gemacht hat, dafür besagte 200 Takte benötigt anstelle von 2 Takten und 
deshalb den Rechentakt hochschrauben mußte.

W.S.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Ihr kloppt Euch jetztz aber hier nicht darum, ob man C-Code irgendwie 
optimieren kann, oder?

Behaltet Das auf jeden Fall für die nächste float-Diskussion im 
Hinterkopf, wo sinnlos statt 'inc a'  'a=a+1.0' geschrieben steht ;)

MfG

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.