Forum: Mikrocontroller und Digitale Elektronik AVR Studio C++ vs. Arduino Processing


von Patrick S. (schnibbelwind)


Lesenswert?

Moin

Ich habe anfangs mit Bascom gearbeitet und stoße an die grenzen von 
Basic. Nun möchte ich mich weiterentwickeln und steh zwischen den zwei 
oben genannten Programmiersprachen.
Welche Sprache lohnt es sich  zu lernen?
Im hinblick das ich in ca. 7 Monaten mein Elektrot. Studium beginne.

Schwierigkeit spielt keine Rolle. Ich will nur keine Sprache lernen die 
ich irgendwann wieder vergessen kann.

von Peter II (Gast)


Lesenswert?

es ist doch beides C++?

von Patrick S. (schnibbelwind)


Lesenswert?

Ich kenne leider beide Sprachen noch nicht. Ich habe nur zwei Scripte, 
mit der selben Aufgabe, verglichen

von abc.def (Gast)


Lesenswert?

Es gibt hier etliches Schimpfen über Arduino // AVR-gcc.
avr-gcc kann alles, Du solltest aber die 500seitigen englischen 
Datenblätter von Atmel lesen (wollen).
Arduino ist dasselbe, nur mächtig eingeschränkt. Da gibt es nur eine 
Quarz-Frequenz und eine handvoll CPU. Dafür sind Beispiele, die aber 
auch gleich funktionieren, wenn ...
Ein Beispiel gleichzeitig funktioniert, aber da die Hardware die 
gleichen Timer für mehrere Aufgaben nutzt, kommen sich mehrere Beispiele 
häufig in die Quere. Und es gibt keine Doku, um das vorherzubestimmen. 
(außer reverse engineering). Die Port-Befehle sind etwas komisch, dafür 
brauchen sie auch 10µs pro Bit, aber man muß sie ja nicht benutzen. Für 
eine Bastel-Arbeit ist Arduino gut, aber was industrielles kann man 
damit nicht machen. Ich verwende übrigens die Arduino-Hardware und 
programmiere direkt über Linux-Befehlszeile und usbasp ohne bootloader. 
Das ganze Maus-geklicke nervt etwas und ich brauche 2 Hände für die 
Tasten; die dritte Hand steht an meinem Lötplatz ;-) und nicht an der 
Maus.

von Peter II (Gast)


Lesenswert?

Patrick Schneidewind schrieb:
> Ich kenne leider beide Sprachen noch nicht.

es ist die gleiche Sprache!

von Patrick S. (schnibbelwind)


Lesenswert?

Mir gefällt die Arduino Hardware auch zum entwickeln von Ideen, mögen 
manche nicht verstehen aber Menschen sind so. ( Siehe Apple;) )

Also wäre das sinnvollste für den Einstig ein Arduino UNO mit AVR Studio 
zu betreiben und sich ins C++ zu quälen?!

C++ bekam ja mächtig Kritik, wie man liest.

von Mr. Tom (Gast)


Lesenswert?

abc.def schrieb:
> Arduino ist dasselbe, nur mächtig eingeschränkt.

Umgekehrt. Arduino stellt einen Haufen Bibliotheken zur Verfügung, die 
gewisse Mindestanforderungen an die Hardware stellen. Und natürlich läßt 
sich unter Arduino auch ganz normal in C++ programmieren. Da ist nichts 
eingeschränkt oder verboten.

von Svenska (Gast)


Lesenswert?

Wenn du C++ nicht magst, kannst du auch mit C anfangen.
Das Problem mit C++ auf solch kleinen Controllern ist, dass du wissen 
musst, welche Features du verwenden darfst und welche nicht.

Insofern: Fang erstmal mit C an.

von Dr. Sommer (Gast)


Lesenswert?

Patrick Schneidewind schrieb:
> C++ bekam ja mächtig Kritik, wie man liest.
Ja, von Leuten die es nicht verstehen. C++ ist wunderbar für 
Mikrocontroller geeignet, und es gibt kaum einen Grund noch C zu 
verwenden. Im ET-Studium wird nur vermutlich doch C gelehrt, dann musst 
du aufpassen was du da nicht verwenden kannst. Das ist allerdings 
einfahcer als erst C, dann C++ zu lernen (weil du dann die ganzen 
schlechten C-Angewohnheiten wieder un-lernen müsstest).

Svenska schrieb:
> Das Problem mit C++ auf solch kleinen Controllern ist, dass du wissen
> musst, welche Features du verwenden darfst und welche nicht.
Bei C aber genauso. Siehe malloc, fopen, system, ...

von Patrick S. (schnibbelwind)


Lesenswert?

Ihr habt mich von c++ überzeugt. Danke für die Hilfe :)

Jetzt wäre noch eine Frage übrig, was wäre aus eurer sich gut fürs 
Lernen geeignet. Bücher, Webseiten, Videos,...

von Patrick B. (p51d)


Lesenswert?

hei, betreffend Studium kann ich dir ev. weiterhelfen.

Ich schliesse gleich mein 1. Semester an der Fachhochschule ab, und wir 
haben bis jetzt einen halben Tag pro Woche mit C verbracht. Im nächsten 
Semester sollen Projektarbeiten kommen, damit wir in Gruppen 
programmieren können.
Im 3. Semester soll "Hardware-Nahes Programmieren" kommen, doch leider 
haber ich hier dinge in erfahrung gebracht, die absolut nichts mit 
Hardarenahe zutun haben: Man kriegt ein 32Bit Arm-Prozessor von Toradex 
und soll hier dann die UART mit Assemble codieren...?? Für mich komplett 
sinfrei, aber ja.
im 4. Semester kommt Objektorientiertes Programmieren in C++ und Java.

Ich gebe dir einen guten Rat: Lerne zuerst C auf einem 8-Bit Controller, 
dann hast du sehr viele Probleme schon mal nicht. C++ mit allen 
Variationen (dynamischer Speicher, Listen, Vektoren, Bäume, dynamische 
Klassen...) macht in nur auf einem 32Bit mit genügend RAM sinn. Alles 
andere ist Ressourcenverschwendung (Zeit und Speicher).

von Hans-Georg L. (h-g-l)


Lesenswert?

Patrick B. schrieb:

> C++ mit allen
> Variationen (dynamischer Speicher, Listen, Vektoren, Bäume, dynamische
> Klassen...) macht in nur auf einem 32Bit mit genügend RAM sinn. Alles
> andere ist Ressourcenverschwendung (Zeit und Speicher).

Was hat das mit der Sprache C++ zu tun ?
Das können andere Sprachen wie C auch.
Und was sind dynamische Klassen in C++ ?

: Bearbeitet durch User
von Patrick B. (p51d)


Lesenswert?

C++ ist viel mächtiger als C, und somit kann man bei C++ grössere und 
umfangreichere Projekte machen, aber auf einem kleinen 8-Bitter ist 
genau das der Nachteil aus meiner Sicht.

Dynamische Klasse (keine Ahnung, ob man dem wirklich so sagt) ist die 
Instanzierung einer Klasse in einer einzigen Funktion. Wenn dies global 
geschieht ist der Speicher sowieso schon belegt, aber wenn man das in 
einer Funktion machen möchte, muss man auch sicherstellen, dass genügend 
RAM vorhanen ist (alle Member) auch wirklich geladen werden können. 
Hatte einmal grosse Probleme damit bei einem Projekt (auf einem 
Cortex-M4). Hier wurde mir nach gewisser Zeit der Heap komplett 
fragmentiert, was übel war. Ich habe mich dann auf das statische 
Programmieren beschränkt, und dazu braucht man kein C++. Also, lieber 
mit C anfangen. Für Bildbearbeitung, GUIs, Speicherverwaltung und alles 
weitere kann man dann auf C++ wechseln.
Ausserdem werden bei sauberen Klassen eine Menge Ressourcen bei kleinen 
Projekten verschwendet, da alle Members über Get- und Set-Funktionen 
angesprochen werden sollten (somit können die Daten auch gleich 
überprüft werden). Aber auf einem uC weiss ich normalerweise, wie die 
Daten vorliegen, also unnötig.

von Dr. Sommer (Gast)


Lesenswert?

Patrick B. schrieb:
> C++ ist viel mächtiger als C, und somit kann man bei C++ grössere
> und
> umfangreichere Projekte machen, aber auf einem kleinen 8-Bitter ist
> genau das der Nachteil aus meiner Sicht.
Keineswegs. Die Features von C++ helfen auch bei kleinen Projekte, und 
bei der Skalierbarkeit. Und wie viele ja beteuern, kann man eben auch 
auf 8-Bittern große Projekte umsetzen; man muss schon einige Zeilen Code 
schreiben, um einen ATmega2560 vollzukriegen?!
> Dynamische Klasse (keine Ahnung, ob man dem wirklich so sagt) ist die
> Instanzierung einer Klasse in einer einzigen Funktion.
Meinst du so?
1
void someFunction () {
2
  MyClass myInstance;
3
}
Das hat mit der Klasse gar nichts zu tun, und die Allokation geschieht 
auf dem Stack.
> Wenn dies global
> geschieht ist der Speicher sowieso schon belegt, aber wenn man das in
> einer Funktion machen möchte, muss man auch sicherstellen, dass genügend
> RAM vorhanen ist (alle Member) auch wirklich geladen werden können.
Genau wie wenn man es in C machen würde, mit structs oder einzelnen 
Variablen. Bloß dass man in C++ noch Konstruktoren und RAII gratis 
dazubekommt.
> Hatte einmal grosse Probleme damit bei einem Projekt (auf einem
> Cortex-M4). Hier wurde mir nach gewisser Zeit der Heap komplett
> fragmentiert, was übel war.
Obige Instanz wird überhaupt nicht auf dem Heap allokiert. Wer sagt, 
dass man unbedingt den Heap verwenden muss? Man kann auch C++ Klassen 
wunderbar auf dem Stack oder global statisch (in .data) allokieren; wir 
reden hier schließlich nicht von Java.
> Ich habe mich dann auf das statische
> Programmieren beschränkt, und dazu braucht man kein C++.
Aber auch kein C. Maschinencode reicht völlig aus.
> Also, lieber
> mit C anfangen.
Warum? Warum nicht gleich lernen wie es richtig geht, anstatt erst mit 
was gammeligen Anfangen, sich mit ekligen Makros & Co rumplagen um dann 
das erst später wieder mühselig alles vergessen zu müssen?
> Ausserdem werden bei sauberen Klassen eine Menge Ressourcen bei kleinen
> Projekten verschwendet, da alle Members über Get- und Set-Funktionen
> angesprochen werden sollten (somit können die Daten auch gleich
> überprüft werden).
Das verschwendet keinerlei Ressourcen, denn die Getter/Setter macht man 
natürlich als "inline" Funktionen, falls der Compiler das nicht onehin 
schon automatisch macht.
> Aber auf einem uC weiss ich normalerweise, wie die
> Daten vorliegen, also unnötig.
Ja, wenn man niemals Kapselung betreibt und Code wieder verwenden 
will...

von Kaj (Gast)


Lesenswert?

Patrick B. schrieb:
> Im 3. Semester soll "Hardware-Nahes Programmieren" kommen, doch leider
> haber ich hier dinge in erfahrung gebracht, die absolut nichts mit
> Hardarenahe zutun haben
Ich weiß ja nicht was du für eine Vorstellung von Hardwarenähe hast, 
aber sehr viel näher als mit Assembler kommst du nicht mehr, es sei denn 
du gibts die Prozessorbefehle direkt ein.

Patrick B. schrieb:
> und soll hier dann die UART mit Assemble codieren...?? Für mich komplett
> sinfrei, aber ja.
Na, dann erklär doch mal warum das sinnfrei sein sollte...

von decimad (Gast)


Lesenswert?

Natürlich wird man wohl erstmal so über die Hälfte der STL knicken 
können. Wenn man mit templates arbeiten möchte, muss man aufpassen, dass 
man keine Typenexplosion erzeugt, wo sie nicht nötig ist (halteben 
code-explosion).
Aber C++ ist auch in der halb-prozeduralen Programmierung so viel 
schöner als C, dass ich nicht nachvollziehen kann, warum man sich mit 
irgendwelchen C-Limitationen rumschlagen sollte.
Ihr müsst auch bedenken, dass viele, die C++ gegenüber Java oder anderem 
vorziehen eben um die Implikationen der benutzten Konstrukte wissen und 
an C++ schätzen, dass man Klotzen kann, wo es keine Probleme macht und 
dennoch feinfühlig sein kann, wo es um die Wurst geht. Da hätte 
wahrscheinlich jemand, der aus der Java-Ecke kommt, größere Probleme...

Btw: Die ersten 25% des C++-Artikels für Mikrocontroller auf dieser 
Seite (Die Fußangeln) sollten imho ersatzlos gestrichen gewerden, da 
irgendwie nicht mehr aktuell. Der Rest klingt eigentlich sinnvoll.

von Patrick S. (schnibbelwind)


Lesenswert?

Ich habe kein Problem damit C++ zu lernen, wenn es sich lohnt.

Aber ich habe bis jetzt kaum Literatur gefunden die sich mit AVR und C++ 
befasst. Mit C tonnen weise.
Und wenn ich im Studium C brauche, muss ich wohl in den sauren Apfel 
beißen und beides lernen.

Wie hart ist der Sprung von C zu C++ oder von C++ zu C oder ist es 
wurscht, dann lerne ich erst C.

von Dr. Sommer (Gast)


Lesenswert?

Patrick Sch. schrieb:
> Wie hart ist der Sprung von C zu C++ oder von C++ zu C oder ist es
> wurscht, dann lerne ich erst C.
Von C++ zu C ist recht leicht, du musst nur wissen welche Sachen in C 
eben nicht gehen. Von C zu C++ ist schwierig, weil du erst alle 
schlechten C-Angewohnheiten wieder un-lernen musst(solltest) um zu 
lernen wie es in C++ richtig geht.

Patrick Sch. schrieb:
> Aber ich habe bis jetzt kaum Literatur gefunden die sich mit AVR und C++
> befasst. Mit C tonnen weise.
Der Teil der Literatur, der sich einfach nur mit dem Hardwarezugriff 
beschäftigt, ist für C++ onehin identisch, Register-Zugriffe, ISR's und 
so funktionieren da eh genau gleich. Und wenn es um die Strukturierung 
der Programme geht kannst du dann ja deine richtigen C++ Kenntnisse 
anwenden.

von Patrick B. (p51d)


Lesenswert?

Dr. Sommer schrieb:
> Warum? Warum nicht gleich lernen wie es richtig geht, anstatt erst mit
> was gammeligen Anfangen, sich mit ekligen Makros & Co rumplagen um dann
> das erst später wieder mühselig alles vergessen zu müssen?
Wieso wird dann auf kleinen uC in C oder sogar in Assembler 
programmiert? Laut deiner Schilderung gibts ja keinen Grund dafür... 
Interessanterweise habe ich bis jetzt bei jeder Schulung für 
Programmierung eines uC Assembler und C gehabt. Der einzige Ort wo ich 
C++ eingesetzt habe ist in einem Projekt für eine Kommunikationsklasse 
die gleichzeitig auf uC und FPGA im selben Unternehmen eingesetzt wurde. 
Somit mussten nur wenige Dateien aktualisiert werden, da der Rest über 
Subversion automatisch in die anderen Projekte einbezogen und 
aktualisiert wurde.
Achja, und für AVR, PIC, MSP und Renesas habe ich bis jetzt nur C 
gesehen, welches auch anständig unterstütz wurde. Ab Stufe Cortex-M3 
wird C++ erst richtig unterstützt. Selbst die grossen Libs von ST für 
ihre ARMs sind in C geschrieben, können aber ohne weiters in ein C++ 
Projekt integriert werden (da alle Header über extern C verfügen).

> Das verschwendet keinerlei Ressourcen, denn die Getter/Setter macht man
> natürlich als "inline" Funktionen, falls der Compiler das nicht onehin
> schon automatisch macht.
Ja klar, sollange es solche Getter und Setter sind:
1
void Set_Member(int value){
2
  Member1 = value;
3
}
4
int Get_Member(void){
5
  return Member1;
6
}
Aber in rund der Hälfte der Fälle möchte man ja auch die Werte prüfen:
1
int Set_Member(int value){
2
  if((value < 3) && (value > 10)){
3
    Member1 = value;
4
    return 1;
5
  }
6
  else{
7
    return 0;
8
  }
9
}
Und hier kann man noch so viel inlinen, da wird automatisch mehr 
Rechenleistung gebraucht. Wenn die Klasse auf dem uC nur einmal 
vorhanden ist, brauchts auch keine Klasse und dann fallen diese 
Überprüfungen meistens auch gleich weg.

Kaj schrieb:
> Ich weiß ja nicht was du für eine Vorstellung von Hardwarenähe hast,
> aber sehr viel näher als mit Assembler kommst du nicht mehr, es sei denn
> du gibts die Prozessorbefehle direkt ein.
Hardwarenahe ist für mich, dass man noch mit dem Datenblatt arbeitet, 
und verstehen muss, was wie gemacht wird (Interrupts, atomar, wie halt 
32-Bit Variablen auf einem 8-Bitter umgesetzt werden, wie eine 
Float-Zahl auf 8-Bit behandelt wird, Casts...).
Zum Vergleich mein Werdegang auf dem Gebiet Programmieren:
- ~1 Monat C auf dem PC in kombination mit dem Dos
- 2 Jahre AVR und PICs mit C
- 6 Monate C++ auf PC
- 1 Jahr PHP und JavaScript auf Linux-Server
- 2 Jahre C auf ARM Controllern
- 3 Monate C++ auf ARM/FPGA
Und so sieht der Ablauf bei meiner FH aus:
- 6 Monate C auf PC
- 6 Monate C als Projekt (Spiele programmieren)
- 6 Monate C 32-Bit Controller mit allem Schickimicki und Grafikdisplay
- 6 Monate Java
- Als Freifächer Embeded programming (aber keine Ahnung welche Sprache)
Was nützt einem eine Assembler Routine für einen Controller um die UART 
zu betreiben (ohne Interrupts und ohne DMA), wenn nebenan ein DMA 
vorhanden ist (ok, man muss noch wissen, wie die Daten daherkommen und 
wie man mit dem DMA umgehen muss)

Patrick Sch. schrieb:
> Aber ich habe bis jetzt kaum Literatur gefunden die sich mit AVR und C++
> befasst. Mit C tonnen weise.
> Und wenn ich im Studium C brauche, muss ich wohl in den sauren Apfel
> beißen und beides lernen.
Was für mich ein weiterer Grund für C ist. Mache dich ersteinmal mit den 
kleinen uCs vertraut (meistens C), dann kannst du auf die grösseren 
wechseln, die dann auch DMAs und FPUs und vieles weitere noch haben.
Was du in deinem Studium brauchen wirst, kann ich dir nicht sagen. Bei 
uns ists auf jeden Fall so.

Scheinbar ist das Thema C++ auf MCU genau gleich ein Glaubenskrieg wie 
AVR vs PIC. Aber hei, wieso nicht bei den Basics anfangen, und dann 
später Freude haben, wenn etwas mit C++ einfacher geht, dafür hat man 
aber begriffen was man macht. Ich habe auch nicht in der ersten Klasse 
mit dem First angefangen oder Integralrechnen betrieben...

von Dr. Sommer (Gast)


Lesenswert?

Patrick B. schrieb:
> Wieso wird dann auf kleinen uC in C oder sogar in Assembler
> programmiert? Laut deiner Schilderung gibts ja keinen Grund dafür...
Wenn es keinen C++ Compiler gibt oder derjenige ein Problem mit Klammern 
hat...
> Interessanterweise habe ich bis jetzt bei jeder Schulung für
> Programmierung eines uC Assembler und C gehabt.
Das ist halt ein selbst verstärkender Effekt; die Lehrenden 
können/kennen nur C, und bieten daher auch nur C an. An "meiner" 
Hochschule gibts aber sogar Embedded C++ Kurse.
> Achja, und für AVR, PIC, MSP und Renesas habe ich bis jetzt nur C
> gesehen, welches auch anständig unterstütz wurde.
Ach, der GCC für AVR kann kein richtiges C++? Dabei sind Clang und GCC 
doch eigentlich die besten im Bezug auf "vollen" C++ Support...
> Ab Stufe Cortex-M3
> wird C++ erst richtig unterstützt. Selbst die grossen Libs von ST für
> ihre ARMs sind in C geschrieben
Aus der Qualität der ST Libraries kann man auf die Kompetenz der 
Entwickler schließen, welche wiederum die Verwendung von C erklärt. Und 
natürlich wollen die die C-Fans (von denen es im Embedded Bereich zu 
viele gibt) nicht vergraulen
> können aber ohne weiters in ein C++
> Projekt integriert werden (da alle Header über extern C verfügen).
Wenigstens etwas.

Patrick B. schrieb:
> Und hier kann man noch so viel inlinen, da wird automatisch mehr
> Rechenleistung gebraucht. Wenn die Klasse auf dem uC nur einmal
> vorhanden ist, brauchts auch keine Klasse und dann fallen diese
> Überprüfungen meistens auch gleich weg.
Das macht wieder überhaupt keinen Sinn?! Was hat die Überprüfung mit C++ 
und Klassen zu tun? Wenn ich die Überprüfung mache, zählt sie sowohl in 
C als auch in C++ zur Rechenleistung. Wenn ich keine Überprüfung mache, 
braucht keine der Sprachen dafür Rechenleistung. Außerdem macht man 
solche Überprüfungen typischerweise mit assert(), s.d. sie nur im 
Debug-Modus auftreten. Oder wenn es sein muss mit einem template. Die 
Folgerung "Verwende C++" => "Muss zwangsweise überall Überprüfungen 
machen" ist jedenfalls verkehrt.
In C++ könnte man sogar, wenn man es drauf anlegt, derartige 
Überprüfungen zur Compile-Zeit machen (s.d. sie gar keine Resourcen zur 
Laufzeit brauchen), falls dem Compiler die Werte bekannt sind; das geht 
in C gar nicht.

von decimad (Gast)


Lesenswert?

Ich kann mir irgendwie nicht vorstellen, dass es einem hilft, 
Jahresweise die Programmiersprachen zu rotieren, zwischen 
Web/Embedded/Desktop um auch nur auf irgendeiner dieser 
Plattfrom/Sprach-Kombinationen einen reifen Programmierstil zu 
entwickeln.

von Dr. Sommer (Gast)


Lesenswert?

decimad schrieb:
> Ich kann mir irgendwie nicht vorstellen
Das hilft sehr gut, einen Überblick über verschiedene Betrachtungsweisen 
zu gewinnen und ein allgemeines Verständnis zu erlangen; viel besser als 
immer nur eine Technologie innerhalb des eigenen Tellerrands zu 
verwenden.

von decimad (Gast)


Lesenswert?

Also was ich meinte war folgendes: Wenn ich jemanden vor mir habe, der 
mir sagt er könne "X, Y, Z, A, B, C, hat 3 Wochen dies, 2 Wochen das, 17 
Wochen und blablabla", dann kann ich nur denken, dass er entweder ein 
Genie ist, oder aber nie etwas produktreifes erledigt hat. Ich kann vor 
allem also nicht beurteilen, ob er Durchhaltevermögen besitzt. Und 
offenbar besitzt er auch an keiner Sache ein gesteigertes Interesse.
Aber ich seh das vielleicht etwas schwarz/weiß, geb' ich schon zu. Und 
weiterbringen tut uns diese Diskussion hier wahrscheinlich auch nicht. 
War nur ein Kommentar aus der Hüfte geschossen.

von Patrick B. (p51d)


Lesenswert?

Interessante Bemerkung...

1) Ich programmiere jetzt seit rund 8 Jahren Mikrocontrollern (das 
meiste davon in C) und ja, da waren mehrere Projekte die zur Serie 
gebracht wurden.
2) Als ich anfing, konnte der Lehrer nicht wirklich erklähren, wie man 
programmiert. Dies lernte ich erst, als ich von meinem Verein für die 
Homepage-Verwaltung "angagiert" wurde. Daraus kam ein komplettes 
angepasstes CMS. Und hier habe ich die Bedeutung von Datenbanken erst 
richtig verstanden (sehr nützlich für C++). Ausserdem habe ich plötzlich 
auch begriffen, wie ich gewisse Dinge in C angehen muss.
3) Wenn man etwas grösseres macht (nicht nur Hobby-Mässig), dann wird 
man unweigerlich auf mehrere Sprachen und Platformen stossen, und krass 
gesagt wenn du das beruflich nicht kannst (über den Tellerrad blicken) 
dan finden die einen anderen. Als ich in der Entwicklung tätig war 
(zugegeben, nur etwa 3 Jahre), war für uns C=Mikrocontroller (8Bit), C++ 
= FGPA/ARM/PC, Java = PC (Linux, Windows).
4) Ich bin noch relativ jung (25 jährig) und habe mich zwischen Lehre, 
Berufsmatura, Militärdienst (Schweiz), Studium immer wieder für ~1/2 
Jahr bei Firmen gemeldet, die mich dann temporär eingestellt haben. Das 
hatte 2 Folgen: Ich konnte in diversen Firmen arbeiten und wurde somit 
jeweils mit anderen, neuen Prozessstrukuren konfrontiert. Hier wurde nur 
PIC verwendet, da waren es nur ARMs, hier gabs keine Windows-PCs...
5) Ich habe bei meiner Liste oben "nur" die Lehrzeiten, nicht aber die 
effektiven Arbeitszeiten aufgeschrieben und ausserdem habe ich von 
mehreren Monaten gesprochen, nicht von Tagen/Wochen.

Aber ja, das wird langsam OT

von Florian S. (tornado) Benutzerseite


Lesenswert?

Will nur noch kurz meine Meinung zur C/C++-Diskussion abgeben:

Anm.: Die Meinung ist aus ca 18 Jahren Erfahrung in der 
Softwareentwicklung entstanden [inkl. abgeschlossenem Studium], von 
denen die letzten 10 Jahre primär C/C++ waren wobei - mit 
Unterbrechungen - auch etwa 10 Jahre uC-Technik dabei ist. Und auf dem 
Desktop bin ich ausgesprochener C++-Fan...

- lernen: ich halte es wohl für sinnvoll, mit C anzufangen und dann erst 
C++ zu machen. Gründe gibts dafür mMn mehrere, nicht zuletzt der 
übersichtlichere Sprachumfang und ein gewisses Verständnis für 
Lowlevel-Geschichten, die zwar unter C++ verpönt sein mögen, aber 
dennoch sinnvoll sein können, wenn sie richtig eingesetzt werden - 
beispielsweise die oben so "beschimpften" Präprozessormakros. Nicht 
zuletzt hat der neue C++11-Standard die Sprache mMn so "schmutzig" 
gemacht (auto variablen usw.), dass ICH es einem Anfänger nicht 
empfehlen könnte, direkt C++ zu lernen - und verhindern, dass er C++11 
auf seinem "Weg" will ich garnicht erst versuchen (schon schwer genug 
Anfängern zu erklären was der Unterschied zw. C++ und C++.net ist)

- wenn man C++ verwendet, halte ich es für sinnvoll, zumindest auch zum 
großen Teil Objektorientiert, mit Referenzen und ähnlichen Neuerungen zu 
programmieren und nicht nur alle "malloc" durch "new" und alle "free" 
durch "delete" zu ersetzen (ob man Templates verwenden will ist nochmal 
eine eigene Diskussion). Dadurch handelt man sich jedoch üblicherweise 
einiges an nicht sichtbaren Speicher- und Ressourcenfressern ein. Vor 
allem haben Klassen einen auf kleinen 8-bittern doch spürbaren Overhead 
(als prominentes Beispiel seien v-tables genannt). Aber auch andere 
"Best practices" für C++ haben Nachteile bei Geschwindigkeit und 
Ressourcen, beispielsweise die (häufig zumindest abschaltbaren) 
Overflow-Protections genannt.

Es ist zwar durchaus möglich, dass C++ ähnlich (speziell im Hinblick auf 
uCs) guten Code erzeugt wie C,  darauf wetten würde ich aber nicht. 
Somit macht es für mich durchaus Sinn, für 8-bit Controller C zu 
verwenden, denn er hat häufig geringe Ressourcen (Flash und RAM) und 
muss nicht unbedingt immer mit einem 16Mhz-Quarz laufen um kleinere 
Aufgaben flott durchzuführen.

Wenn man natürlich weiß was man tut, kann man auch mit C++ arbeiten, 
aber ich persönlich finde es einfacher nicht so viel über Performance 
und Ressourcen Nachdenken zu müssen und nutze deshalb auf uCs lieber C.

Btw: Auch verschiedene Benchmarks - die natürlich auch nicht 
repräsentativ oder vollständig sind - zeigen, dass C und C++ keineswegs 
gleich sind und C++ bei komplexen Datenverarbeitungstasks Vorteile hat, 
sonst aber C meist schneller/sparsamer ist. Besagte komplexe 
Datenverarbeitung spielt aber für 8bit meist eher eine untergeordnete 
Rolle.


Was Arduino vs "Plain-C(++)" angeht, ists meiner Erfahrung nach ähnlich 
wie mit C vs. C++: Arduino macht vieles einfacher und weniger 
Fehleranfällig, aber auch langsamer und "fetter". Ebenso sind 
Lowlevel-Kenntnisse kaum/nicht erforderlich, was für spätere Aufgaben 
mMn zum großen Nachteil werden kann. Und so besonders 
komplex/kompliziert find ich die Datenblätter gerade bei Atmel btw. 
nicht.

Grüße Florian

von Dr. Sommer (Gast)


Lesenswert?

Florian S. schrieb:
> aber
> dennoch sinnvoll sein können, wenn sie richtig eingesetzt werden -
> beispielsweise die oben so "beschimpften" Präprozessormakros.
Was hat eine dumme Textersetzung aka Makro mit Low-Level zu tun? In C++ 
hat man mit templates ein besseres, mindestens genauso effizientes aber 
sichereres Werkzeug.

Florian S. schrieb:
> Nicht
> zuletzt hat der neue C++11-Standard die Sprache mMn so "schmutzig"
> gemacht (auto variablen usw.),
Nur weil eine Sprache viel kann ist sie nicht schmutzig. Gerade die 
Neuerungen mit "constexpr" (und dem was C++14 dazu noch kommen wird) 
sind ideal für Mikrocontroller und ermöglichen Dinge die mit C gar nicht 
gehen.

Florian S. schrieb:
> und verhindern, dass er C++11
> auf seinem "Weg" will ich garnicht erst versuchen
Wär auch ziemlich dumm irgendwie.

Florian S. schrieb:
> wenn man C++ verwendet, halte ich es für sinnvoll, zumindest auch zum
> großen Teil Objektorientiert
Ja.

Florian S. schrieb:
> (als prominentes Beispiel seien v-tables genannt).
Wenn man sie denn verwendet; das C-Äquivalent mit Funktionszeigern ist 
genauso "ineffizient". Man muss nicht jede Funktion virtuell machen.

Florian S. schrieb:
> Aber auch andere
> "Best practices" für C++ haben Nachteile bei Geschwindigkeit und
> Ressourcen,
Ja, genau wie in C muss man auf µC etwas anders programmieren.
> beispielsweise die (häufig zumindest abschaltbaren)
> Overflow-Protections genannt.
Wo kommt die denn her in C++? Meinst du Canary Bytes, die haben doch 
nichts mit C++ zu tun.

Florian S. schrieb:
> Es ist zwar durchaus möglich, dass C++ ähnlich (speziell im Hinblick auf
> uCs) guten Code erzeugt wie C,  darauf wetten würde ich aber nicht.
Es ist aber so. Rate mal wie viele Instruktionen folgender Code 
generiert:
1
STM32::SDADC0.configure ().contRegular ().on ()
2
                          .fastMode ().on ()
3
                          .setRegChannel(4)
4
                          .enabled ().on ()
5
                          .apply ();
Richtig, 6 (darunter kein Funktionsaufruf). Ginge in ASM nicht besser. 
Ja, das ist Code für den STM32, den hatte ich gerade zur Hand, aber Code 
für AVR ginge es genauso, da er äquivalente Instruktionen hat. Das 
Frontent interessiert sich schließlich nicht für die Zielplattform.

Florian S. schrieb:
> tw: Auch verschiedene Benchmarks - die natürlich auch nicht
> repräsentativ oder vollständig sind - zeigen, dass C und C++ keineswegs
> gleich sind und C++ bei komplexen Datenverarbeitungstasks Vorteile hat,
Sowas wie Numerik ist in C und C++ absolut identisch. Die Vorteile von 
C++ liegen in der Strukturierung; das hat mit Rechenalgorithmen relativ 
wenig zu tun.

von decimad (Gast)


Lesenswert?

@Dr. Sommer: Ist das nen offener C++-Wrapper für die STM-Bibliothek oder 
eine Eigenentwicklung? Als ich mir die letzten Tage die Beispiele 
angeschaut habe, schrien sie eigentlich irgendwie nach einem schmalen 
Wrapper... Also wenn's keinen fertigen gibt, werde ich auf kurz oder 
lang selber einen basteln, zumindest nach und nach für was ich davon 
nutze...

von Moby (Gast)


Lesenswert?

C++ auf kleinen 8-Bittern ist doch der totale Overkill. Nicht weil es 
einem um die mehr oder weniger zusätzlich mit Overhead belegten 
Speicherzellen leid tun muß oder die Leistung gleich total einbricht. 
Nein, ganz einfach der unnötigen Einarbeitungszeit in ein komplexes 
Sprachkonzept wegen. Steht in keinem Verhältnis zu den mehr oder weniger 
schlichten  Projekten die letztlich drauf realisiert werden. Ok, ich 
programmier jetzt "nur" AVRs  "nur" aus Hobby und "nur" in ASM. Da 
schaut man ins Datenblatt und sagt dem Controller dann 1:1 was zu tun 
ist. Mehr als die paar ASM-Befehle und ihre wenigen Eigenheiten gibts da 
nicht zu lernen. Mir ist selbst das Klammergedöns von C schon zu viel 
auch wenns manchmal bei Berechnungen schon komfortabler wär oder man die 
eine oder andere Lib nutzen könnte. Dafür muß man keine Sprach- und 
Compilereigenheiten beachten und hat auch keine "künstlichen" Probleme a 
la Typkonvertierung. Die Codezeilen werden plötzlich sehr kurz und 
einfach. Den Rest zu gutem Verständnis muß dann allerdings die Doku 
leisten.

von greg (Gast)


Lesenswert?

Einem Anfänger C++ zu empfehlen ist jetzt auch nicht gerade eine gute 
Entscheidung. C++ ist eine der komplexesten Programmiersprachen, die es 
gibt, mit zahlreichen Fallstricken. Da kann man sich nicht nur in den 
Fuß schießen, nein, man kann sich ausversehen alle Gliedmaßen mit der 
Motorsäge amputieren. ;) Die Qualität der Sprache ist auch sehr 
umstritten.

Vielen Anfängern ist C schon zu schwierig, und hier wird C++ empfohlen. 
WTF?

von Dr. Sommer (Gast)


Lesenswert?

decimad schrieb:
> @Dr. Sommer: Ist das nen offener C++-Wrapper für die STM-Bibliothek oder
> eine Eigenentwicklung?
Das ist kein Wrapper, das ist eine Eigenentwicklung die komplett 
frei&unabhängig von ST-Code ist indem sie direkt auf Register zugreift. 
Wird auch irgendwann mal released, wenn es fertig ist...

Moby schrieb:
> C++ auf kleinen 8-Bittern ist doch der totale Overkill.
Es gibt Leute, die implementieren CANopen auf 8-Bittern. CANopen ist 
definitiv komplex genug dass man eine Sprache, die viel Struktur bietet 
aka C++, dafür verwenden sollte...

greg schrieb:
> Einem Anfänger C++ zu empfehlen ist jetzt auch nicht gerade eine gute
> Entscheidung.
Das geht, ich hab auch mit C++ angefangen. Man muss nicht sofort 
template Meta-Algorithmen schreiben, man kann mit den einfachen Dingen 
anfangen. Und z.B. am PC ist C++ für Anfänger noch viel mehr geeignet, 
da Dinge wie std::vector und std::string dort das leben drastisch 
vereinfachen.
>
> Vielen Anfängern ist C schon zu schwierig, und hier wird C++ empfohlen.
> WTF?
Ja, weil sie es nicht lernen sondern nur Code Copy&Pasta betreiben. Wenn 
man es richtig nach Buch lernt geht das ganz gut.

von Patrick S. (schnibbelwind)


Lesenswert?

Okay, dann werde ich mich ins C einarbeiten. Gibt es auch mehr 
Informationen für. :)

Vielen Dank für eure Hilfe.

Als nächstes steht eine kleine DIY Platinenfräse bei mir auf dem Plan. 
(dauert aber noch) Das Platinen ätzen geht mir so langsam auf die Nerven 
;)

von greg (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Das geht, ich hab auch mit C++ angefangen. Man muss nicht sofort
> template Meta-Algorithmen schreiben, man kann mit den einfachen Dingen
> anfangen.

Aber die ganzen komplizierteren Features und Möglichkeiten verwirren und 
lenken ab. Insbesondere wenn man fremden Code liest, was ja gerade 
Anfänger hauptsächlich tun. In C++ ist das besonders schlecht, da es 
viele Features gibt, die man heute lieber nicht mehr verwenden sollte.

> Und z.B. am PC ist C++ für Anfänger noch viel mehr geeignet,
> da Dinge wie std::vector und std::string dort das leben drastisch
> vereinfachen.

Da würde ich lieber eine ordentliche High-Level-Sprache wie z.B. Python 
oder Java/C# empfehlen.

Wie auch immer, C ist auf jeden Fall eine gute Wahl.

von Florian S. (tornado) Benutzerseite


Lesenswert?

greg schrieb:
> Da würde ich lieber eine ordentliche High-Level-Sprache wie z.B. Python
> oder Java/C# empfehlen.

Das seh ich etwas anders.
Python ist nicht schlecht für Anfänger (wobei die "ungewöhnliche" Syntax 
nicht gerade vorteilhaft ist, wenn man irgendwann mal noch andere 
Sprachen anschaun möchte).

Aber C# ist spätestens seit Version 4 extremst überladen, dass es für 
Anfänger mMn völlig ungeeignet ist und Java ist vom Design her einfach 
Mist - da wurden meiner Meinung nach zu viele "akademische" 
Entscheidungen getroffen. Das betrifft sowohl die 
"PC-Standardimplementierung" als Stackmaschine (bei Dvalik schaut das 
schon wieder ganz anders aus) als auch die Sprache selbst, die derart 
auf Design Pattern setzt, dass selbst einfachste Aufgaben über hässliche 
Umwege umgesetzt werden müssen (da ist C# beispielsweise um Welten 
besser), Stichwort Getter/Setter, Events,...
Andererseits gibts auch ein paar wirklich ekelhafte Fallstricke, wie 
z.B. Generics (bzw. deren Implementierung über Casts), Strings (die 
"aussehen" wie primitive Typen aber eigentlich keine sind, aber trotzdem 
einen +-Operator haben obwohl es eigentlich kein Operatorüberladung 
gibt), die "implizite" Übergabe by-reference bzw. by-value ohne dass für 
Anfänger darin ein System zu erkennen wäre (im Gegensatz zur Zeiger vs. 
Kopie bei C z.B.).

Daneben ist der rein objektorientierte Ansatz dieser beiden Sprachen 
nicht ideal für Anfänger, ich finde klassische prozedurale Sprachen für 
Einsteiger da leichter zu verstehen.
Deswegen wäre Python garnicht so schlecht. Aber auch Basic oder PHP 
(trotz aller Schwächen - vorteilhaft ist die C-like Syntax) sind mMn 
keine schlechten Einsteigersprachen.
Oder eben C, da es viel Literatur, einen übersichtlichen Sprachumfang 
aber auch "Zukunftssicherheit" bietet, auch wenn man mit der ganzen 
Zeigergeschichte und Speicherverwaltung am Anfang ohne Zweifel 
durcheinander kommen kann, wenn mans nicht sauber lernt.

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.