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
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
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.
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...
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.
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.
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.
@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.
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.
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.
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).
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.
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.
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