Forum: Mikrocontroller und Digitale Elektronik Wie stark sollte man bei der Mikrocontroller Programmierung kapseln?


von Jan K. (jan_k)


Lesenswert?

Hi Leute,

eigentlich steht meine Frage bereits im Betreff. Ich habe eigentlich C++ 
'gelernt' (sprich in der UNI ein paar Semester programmiert), und habe 
daher immer eingetrichtert bekommen, dass ich Klassen kapseln und per 
set/get Funktionen Parameter etc setzen soll.

In C (gerade im embedded Bereich) scheint das völlig anders zu sein. 
Viele Projekte, die ich hier sehe strotzen nur vor globalen Variablen, 
teilweise ein völliges Chaos.
Mir ist klar, dass zusätzliche Variablen und Funktionsaufrufe ein 
bisschen overhead mitbringen und frage mich daher, wie weit ich dem 
Konzept der Kapselung folgen soll.

Folgende Situation:
Ich habe ein Modul geschrieben, mit seiner eigenen .c Datei und dem 
dazugehörigen header. Das Modul hat einige set und get sowie eine Init 
Funktion, deren Prototypen im header deklariert sind. Lokale Funktionen 
erscheinen nur in der Datei selbst und sind auf static gesetzt. Globale 
Variablen kämen nur mit extern in den header, lokale Variablen (die 
stelle ich mir jetzt als 'Klassenvariablen' vor, kommt das hin?) kommen 
in den Sourcecode. Benötigen diese auch ein static?

Ist diese Vorgehensweise so erst einmal korrekt?

Jetzt ist es z.B. so, dass ich einen Parameter setzen möchte. 
Unglücklicherweise sind dies viele Parameter, z.B. eine Tabelle, die 
minimal+maximal Werte für verschiedene Größen enthält, die in meinem 
Modul vorkommen und auf die geprüft werden muss.
Würde ich das Konzept der Kapselung verwenden, müsste ich in der main.c 
diese Liste anlegen, per set Funktion in mein Modul übernehmen und dort 
in die gleich große lokale Variable schreiben. Das bedeutet ich 
verbrauche, selbst wenn ich die Tabelle mit call by reference übergebe 
doppelt soviel RAM, korrekt?

RAM ist allgemein etwas knapp, da ich ziemlich viele Werte puffern muss.

Würde man in so einem Fall auf globale Variablen umstellen?


Und was ist z.B. mit status flags (UART hat was empfangen oder so)? 
Theoretisch kann ich diese auch lokal halten (in dem Empfangsmodul) und 
diese per get Funktion auslesen. Hab' ich noch nie gesehen, dass dies in 
einem C Code gemacht wird. Warum nicht?


Vielen Dank für Eure Antworten, ich hoffe sie bringen etwas Licht ins 
Dunkle :)

Jan

: Gesperrt durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Jan K. schrieb:

> Mir ist klar, dass zusätzliche Variablen und Funktionsaufrufe ein
> bisschen overhead

Naja, die typischen set/get-Methoden in C++ lassen sich in aller
Regel implicit inline definieren, dann brauchen sie keinen
zusätzlichen Code.

Auch auf einem Controller kann man gut und gern C++ benutzen.

> lokale Variablen (die
> stelle ich mir jetzt als 'Klassenvariablen' vor, kommt das hin?) kommen
> in den Sourcecode. Benötigen diese auch ein static?

Ja.

> Würde man in so einem Fall auf globale Variablen umstellen?

Pack' doch deine Parameter in eine Struktur, deren Adresse du bei
der Konfiguration übergibst.  Dein Modul muss sich dann nur diese
Adresse merken (Kosten: 2 Bytes) und benötigt keine separate Kopie
davon.

> Und was ist z.B. mit status flags (UART hat was empfangen oder so)?
> Theoretisch kann ich diese auch lokal halten (in dem Empfangsmodul) und
> diese per get Funktion auslesen.

Wenn du (was bei UART über kurz oder lang Sinn hat) den Empfang über
einen Ringpuffer per Interrupt erledigst, dann muss man sogar
die Implementierung nach dem Zustand („Sind Daten vorhanden?“)
befragen.  Prinzipiell könnte man den Ringpuffer selbst natürlich
global anlegen und dann die Zustandsabfrage im Header als Makro
(oder inline-Funktion) implementieren.  Da die Abfrage aber kaum
zeitkritisch sein dürfte, gibt es dafür kaum einen Grund.

von Moby (Gast)


Lesenswert?

Ja du meine Güte. Machs bei kleinen Controllern einfach in ASM, dann 
lösen sich viele Deiner Fragen in Luft auf. In ASM programmierst Du 
GENAU das was nötig ist, nicht mehr, nicht weniger. Und holst das 
Maximum aus der Hardware.

von MaWin (Gast)


Lesenswert?

Das optimale Programm ist das, von dem man nichts mehr weglassen kann, 
ohne die Funktion zu bescheiden (inklusive Reaktion auf Fehler),
und zwar sind nicht die Kommentare im Quelltext gemeint, sondern die 
Instruktionen die der Prozessor ausführen muss.
Den einzigen trade off den es gibt ist der zwischen speed und space.

Wenn du deinen Quelltext leserlich und logisch schön strukturieren 
kannst und über die Kapselung nicht den Überblick verlierst wie so viele 
OOP Programmierer, dann wäre das ok.

> Ist diese Vorgehensweise so erst einmal korrekt?

Ja.

> und diese per get Funktion auslesen.

Auch C++ macht get meist inline, zumindest so lange es nur den 
unmodifizierten Variablenwert liefert.
In C macht man eben die Variable öffentlich, kein static, und lässt die 
() beim Aufruf weg :-)
Das kann man (bei definiertem unsigned char uartstaus;) mit einem define 
im Header verschönern:
#define GetUartStatus() uartstatus

Zumindest wird auf diese Art keine Instukrion mehr verbraten, kein call, 
kein stack benötigt.

> Jetzt ist es z.B. so, dass ich einen Parameter setzen möchte.
> Unglücklicherweise sind dies viele Parameter, z.B. eine Tabelle, die
> minimal+maximal Werte für verschiedene Größen enthält, die in meinem
> Modul vorkommen und auf die geprüft werden muss.
> Würde ich das Konzept der Kapselung verwenden, müsste ich in der main.c
> diese Liste anlegen, per set Funktion in mein Modul übernehmen und dort
> in die gleich große lokale Variable schreiben. Das bedeutet ich
> verbrauche, selbst wenn ich die Tabelle mit call by reference übergebe
> doppelt soviel RAM, korrekt?

Ein set-Aufruf pro Wert, jeder Wert wird als Parameter übergeben, und 
wenn das set den Wert unmodifiziert in eine Variable überträgt, kann man 
es mit define wie oben bauen, also:

#define SetBaudrate(x) baudrate=(x)
#define SetBitCount(x) bitcount=(x)
#define SetStopBits(x) stopbits=(x)

statt

void InitSerial(struct { unsigned char br,bc,sb; } param)
{
  baudrate=br;
  bitcount=bc;
  stopbits=sb;
}

Etwas blöd wird das nur, wenn die Werte gegenseitig validiert werden und 
nur wenn sie insgesamt zusammenpassen modifiziert werden dürfen, dann 
ist der struct-Parameter Ansatz besser.

von Fabian O. (xfr)


Lesenswert?

Jan K. schrieb:
> Folgende Situation:
> Ich habe ein Modul geschrieben, mit seiner eigenen .c Datei und dem
> dazugehörigen header. Das Modul hat einige set und get sowie eine Init
> Funktion, deren Prototypen im header deklariert sind. Lokale Funktionen
> erscheinen nur in der Datei selbst und sind auf static gesetzt. Globale
> Variablen kämen nur mit extern in den header, lokale Variablen (die
> stelle ich mir jetzt als 'Klassenvariablen' vor, kommt das hin?) kommen
> in den Sourcecode. Benötigen diese auch ein static?
>
> Ist diese Vorgehensweise so erst einmal korrekt?

Genau so ist es richtig. Und ja, die Modulvariablen benötigen ein 
static, sonst sind sie global.

> Jetzt ist es z.B. so, dass ich einen Parameter setzen möchte.
> Unglücklicherweise sind dies viele Parameter, z.B. eine Tabelle, die
> minimal+maximal Werte für verschiedene Größen enthält, die in meinem
> Modul vorkommen und auf die geprüft werden muss.
> Würde ich das Konzept der Kapselung verwenden, müsste ich in der main.c
> diese Liste anlegen, per set Funktion in mein Modul übernehmen und dort
> in die gleich große lokale Variable schreiben. Das bedeutet ich
> verbrauche, selbst wenn ich die Tabelle mit call by reference übergebe
> doppelt soviel RAM, korrekt?
>
> RAM ist allgemein etwas knapp, da ich ziemlich viele Werte puffern muss.
>
> Würde man in so einem Fall auf globale Variablen umstellen?

Als erstes kommt es drauf, ob die Werte sich überhaupt zur Laufzeit 
ändern. Wenn nicht, wären #defines in einer zusätzlichen Header-Datei 
(z.B. modulname_config.h) die effizienteste Lösung. Ansonsten gibt es 
zwei Möglichkeiten:

1. Das Modul speichert die Parameter. Entweder in globalen Variablen 
oder in Modulvariablen (static) mit get/set-Funktionen. Der Aufrufer 
(main.c) muss diese Werte dann ja nicht mehr dauerhaft speichern, 
sondern nur den Initialisierungscode einmalig ausführen.

2. Der Aufrufer speichert die Parameter. Du legst also in main.c eine 
Struktur oder Tabelle an und übergibst dem Modul einen Zeiger darauf. 
Entweder mit jedem Funktionsaufruf (dann sind auch mehrere Instanzen 
möglich) oder nur einmalig beim Init und das Modul speichert den Zeiger.

> Und was ist z.B. mit status flags (UART hat was empfangen oder so)?
> Theoretisch kann ich diese auch lokal halten (in dem Empfangsmodul) und
> diese per get Funktion auslesen. Hab' ich noch nie gesehen, dass dies in
> einem C Code gemacht wird. Warum nicht?

Du musst Dir halt eine sinnvolle Schnittstelle zum UART-Modul ausdenken. 
Wenn es z.B. eine Funktion int uart_getchar(void) gibt, die das 
empfangene Zeichen zurückgibt und EOF (-1) wenn keins empfangen wurde, 
braucht man diese Details nicht nach außen zugänglich machen. Alternativ 
kann man natürlich auch eine Funktion bool uart_char_received(void) 
schreiben, die solche Infos bereitstellt.

von Moby (Gast)


Lesenswert?

MaWin schrieb:
> Das optimale Programm ist

... jedenfalls kein C oder gar objektorientiertes C++ Programm.
Die bringen nur massig Probleme und überflüssigen Programmtext- gemessen 
an der Funktion, die zu codieren ist.

von Karl H. (kbuchegg)


Lesenswert?

Ich würde vorschlagen, dass sich alle die nichts von C Programmierung 
verstehen einfach raushalten.
OK?

Schreib deinen Assemblerkäse, aber lass den Rest der Welt damit in Ruhe.

von Moby (Gast)


Lesenswert?

Wie stark sollte man bei der Mikrocontroller Programmierung kapseln?

Ganz einfach: Gar nicht. Macht nur alles unnötig komplex. Und das ist 
sicher kein Käse...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:
> Schreib deinen Assemblerkäse, aber lass den Rest der Welt damit in Ruhe.

Ich habe das Gefühl, unser „c-hater“ hat sich einen neuen Nicknamen
zugelegt …  Wie würdet ihr Ösis sagen: „So ein Topfen.“ :-)

von Embedded (Gast)


Lesenswert?

MaWin schrieb:
> Das optimale Programm ist das, von dem man nichts mehr weglassen kann,
> ohne die Funktion zu bescheiden (inklusive Reaktion auf Fehler),
> und zwar sind nicht die Kommentare im Quelltext gemeint, sondern die
> Instruktionen die der Prozessor ausführen muss.
> Den einzigen trade off den es gibt ist der zwischen speed und space.

Das ist Stand der Technik von vor 30-40 Jahren. Heutzutage spielt auch 
bei uC-Programmen immer öfter Wartbarkeit und Portabilität eine Rolle, 
auch wenn es auf die Performance geht.

Jan K. schrieb:
> Und was ist z.B. mit status flags (UART hat was empfangen oder so)?
> Theoretisch kann ich diese auch lokal halten (in dem Empfangsmodul) und
> diese per get Funktion auslesen. Hab' ich noch nie gesehen, dass dies in
> einem C Code gemacht wird. Warum nicht?

Weil du offensichtlich noch nicht genug Code gesehen hast. Das gibt es 
nämlich schon.

von Axel S. (a-za-z0-9)


Lesenswert?

Jan K. schrieb:
> eigentlich steht meine Frage bereits im Betreff. Ich habe eigentlich C++
> 'gelernt' (sprich in der UNI ein paar Semester programmiert), und habe
> daher immer eingetrichtert bekommen, dass ich Klassen kapseln und per
> set/get Funktionen Parameter etc setzen soll.
>
> In C (gerade im embedded Bereich) scheint das völlig anders zu sein.

<schnipp>

Was an der Uni anscheinend nicht gelehrt wird, ist daß Kapselung, 
Abstraktionen und auch OO an sich kein Selbstzweck sind, sondern das 
Leben erleichtern sollen. Sie sollen dabei helfen, Übersichtlichkeit 
wieder herzustellen, wo sie sonst verloren gehen würde.

In typischen µC-Programmen die aus wenigen 100 Zeilen C-Code bestehen, 
besteht oft gar keine Notwendigkeit für solche Mittel. Das heißt nicht, 
daß man es nicht trotzdem machen kann (man kann auch mit dem 5-Tonner 
Brötchen holen fahren). Aber es ist meist nicht sinnvoll.

Ausnahmen gibt es natürlich immer und die Übergänge sind fließend. 
Typische Grenzgänger sind Code-Bibliotheken. Zum einen müssen die schon 
der Modularität und Wiederverwendbarkeit wegen stärker gekapselt werden 
als anderer Code. Zum anderen weiß man ja vorher nicht, ob so eine 
Bibliothek später in einem kleinen oder in einem großen Projekt 
eingesetzt werden wird.

Viel wichtiger als die Frage "wie stark soll man kapseln?" wäre IMHO die 
Frage "was kostet mich das?" bzw. "wie weit kann ich gehen ohne daß die 
Kosten den Nutzen auffressen?". Und auch hier hängt die Antwort von 
vielen Dingen ab. Was ich aber auf jeden Fall schon mal sagen würde: die 
Tatsache daß Mobiltelefone heutzutage Quadcore CPUs mit GHz Takt 
brauchen, ist im wesentlichen das Verschulden der Kapseler-Fraktion.


XL

von Karl H. (kbuchegg)


Lesenswert?

Jörg Wunsch schrieb:
> Karl Heinz Buchegger schrieb:
>> Schreib deinen Assemblerkäse, aber lass den Rest der Welt damit in Ruhe.
>
> Ich habe das Gefühl, unser „c-hater“ hat sich einen neuen Nicknamen
> zugelegt …  Wie würdet ihr Ösis sagen: „So ein Topfen.“ :-)

:-)
So ein Käse
("So ein Quark" lässt sich nicht wortwörtlich auf österreichisch 
übersetzen :-))

von Autobauer (Gast)


Lesenswert?

Wie stark man sich darüber Gedanken machen sollte hängt vor allem von 
der Größe deines Controllers ab.

Wer mal einen ganzen AUTOSAR Stack gesehen hat der sieht die 
Mikrocontroller aus anderen Augen ;-)

von Karl H. (kbuchegg)


Lesenswert?

Axel Schwenke schrieb:

Ich geh 100% mit dem Rest konform

> vielen Dingen ab. Was ich aber auf jeden Fall schon mal sagen würde: die
> Tatsache daß Mobiltelefone heutzutage Quadcore CPUs mit GHz Takt
> brauchen, ist im wesentlichen das Verschulden der Kapseler-Fraktion.

Würde ich so nicht sagen.
Smartphones von heute kannst du nicht mit einem Telefon von vor 15 
Jahren vergleichen.
Heute hast du hoch auflösende Bildschirme, willst Videos streamen, 
Spiele spielen, das Adressbuch muss animiert sein, vollflächig scrollen 
etc. etc.

Natürlich gibt es vollkommen schwachsinnig und laienhaft durchgeführte 
Kapselungen. Aber noch viel öfter hab ich auch das Gegenteil gesehen: 
unstrukturiert zusammengeschusterten Code, dessen Verhalten absolut 
nicht vorhersehbar war, weil sich ein Konglomerat von 120 Funktionen an 
globalen Variablen zu schaffen gemacht hat und keiner mehr 
nachvollziehen konnte, welche Variable wann unter welchen Umständen 
verändert wird.

Wenn ein System vernünftig aufgebaut ist, wenn die Klassenhierarchien 
stimmen, dann fallen die EInzelteile wie Puzzlestücke ineinander und 
alles funktioniert überaschau- und vor allen Dingen auch wartbar. Etwas 
was einem an den Unis nicht gelehrt wird und worauf auch nicht weiter 
geachtet wird. Das lernt man dann erst on the job.

von Moby (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> hat sich einen neuen Nicknamen
> zugelegt

Ach Jörg, das war nun gerade NICHT Thema dieses Threads...

Jan K. schrieb:
> teilweise ein völliges Chaos

... kann man hier eben nur sehen wenn man seine Uni antrainierten 
Sichtweisen und Methoden, die bei grossen Rechnersystemen noch ihre 
Berechtigung haben mögen, nun in der Welt der kleinen Controller 
anzuwenden sucht. Dabei kann einfach nix effektives rauskommen.

von Moby (Gast)


Lesenswert?

Axel Schwenke schrieb:
> Was ich aber auf jeden Fall schon mal sagen würde: die
> Tatsache daß Mobiltelefone heutzutage Quadcore CPUs mit GHz Takt
> brauchen, ist im wesentlichen das Verschulden der Kapseler-Fraktion

100% ACK

von Karl H. (kbuchegg)


Lesenswert?

Moby schrieb:

> ... kann man hier eben nur sehen wenn man seine Uni antrainierten
> Sichtweisen und Methoden, die bei grossen Rechnersystemen noch ihre
> Berechtigung haben mögen, nun in der Welt der kleinen Controller
> anzuwenden sucht. Dabei kann einfach nix effektives rauskommen.


Wenn es effektiv genug ist, um seine Aufgabe zu erfüllen, dann reicht 
das. Die paar Prozent Verlust nimmt man gerne in Kauf, für Software die 
man ein halbes Jahr später immer noch ändern und erweitern kann.

von Embedded (Gast)


Lesenswert?

Moby schrieb:
> ... kann man hier eben nur sehen wenn man seine Uni antrainierten
> Sichtweisen und Methoden, die bei grossen Rechnersystemen noch ihre
> Berechtigung haben mögen, nun in der Welt der kleinen Controller
> anzuwenden sucht. Dabei kann einfach nix effektives rauskommen.

Ich habe aber auch schon Systeme gesehen, die über Jahre gewachsen sind. 
Angefangen haben sie auf kleinen Mikrocontrolllern, haben sie heute die 
Komplexität einer mittelgroßen PC-Anwendung. Dummerweise ist die 
Architektur nie mit gewachsen und die Entwickler sind immer noch in 
ihrer Assembler-Denkweise gefangen und blocken alle Ansätze einer 
Modernisierung ab. Das Resultat ist ein langsames, chaotisches, kaum 
noch wartbares System.

Da würde das Uni-Wissen über moderne Softwaretechniken wirklich nicht 
schaden.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Axel Schwenke schrieb:
> In typischen µC-Programmen die aus wenigen 100 Zeilen C-Code bestehen

Naja, Axel, wir arbeiten heute nicht mehr mit einem UB8821. ;-) (Für
die Teilnehmer westlich von Elbe und Werra: Z8601, jedoch mit
externem EPROM, daher recht beliebt gewesen bei Bastlern.)

Klar, wenn dein Programm auf zwei A4-Seiten passt, brauchst du dir
um Strukturen, Kapselung und all sowas keinen Kopp machen.  Das
schreibst du nach drei Gläsern Bier noch ohne große Planung runter,
und es läuft danach.

Aber das, was man heute alles unter „Controller“ findet, überflügelt
nach oben bei Weitem eine einstmalige PDP-11, nicht nur in der
Geschwindigkeit, sondern auch im Speicherausbau.  Ich habe noch
Assemblerbetriebssysteme für die PDP-11 gesehen.  Nein, sowas will
man heute nicht mehr haben …

von MaWin (Gast)


Lesenswert?

> Das ist Stand der Technik von vor 30-40 Jahren. Heutzutage spielt auch
> bei uC-Programmen immer öfter Wartbarkeit und Portabilität eine Rolle,
> auch wenn es auf die Performance geht.

Man muß sich eben nur klar eingestehen,
daß die einfachere Erstellbarkeit und Wartbarkeit
mit Abstrichen bei der Programmqualität erkauft werden.

Wenn man sagt "ich habe kein optimales Programm erstellt,
weil das Geld/Zeit nicht reichte und ich zu faul war"
ist das in Ordnung.

Gute Programmqualität ist dieselbe wie vor 30 oder 40 Jahren,
nämlich optimal effizient und fehlerfrei.
Daß der Stand der Technik heute fehlerhafte und übermässig
resourcenfressende Programme abliefert liegt eher an
der Qualität der heutigen Programmierer, die sich selbst
in die Tasche lügen und ihre Kunden anlügen "das ist gut
so wie es ist". Nein, es ist Schrott, und das inzwischen
durch die Bank, von WebSeiten über Betriebssysteme wie
Windows über Anwenderprogramme wie Word oder Handy-Apps,
voller Fehler, voller Bulk.

von Embedded (Gast)


Lesenswert?

MaWin schrieb:
> Gute Programmqualität ist dieselbe wie vor 30 oder 40 Jahren,
> nämlich optimal effizient und fehlerfrei.

Das ist deine Definition von optimal. Das ist aber nicht die übliche 
Definition in einem kommerziellen Umfeld. Da ist optimal in allererster 
Linie "wartbar".

von Moby (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Wenn es effektiv genug ist, um seine Aufgabe zu erfüllen,

Nö, damit meinte ich noch nicht mal den mehr oder weniger großen 
Ressourcenverlust bei Hochsprachen-Verwendung. Man schaue sich die 2000 
Seiten Wälzer C(++) Lehrbücher nur mal an... Kein Verhältnis zu dem, was 
(mit ein paar Dutzend ASM-Anweisungen) wirklich zur Codierung nötig ist.

von Karl H. (kbuchegg)


Lesenswert?

MaWin schrieb:
>> Das ist Stand der Technik von vor 30-40 Jahren. Heutzutage spielt auch
>> bei uC-Programmen immer öfter Wartbarkeit und Portabilität eine Rolle,
>> auch wenn es auf die Performance geht.
>
> Man muß sich eben nur klar eingestehen,
> daß die einfachere Erstellbarkeit und Wartbarkeit
> mit Abstrichen bei der Programmqualität erkauft werden.

Zustimmung.
Aber die Zeiten haben sich geändert.
Programmlaufzeit ist nicht mehr das einzige Kriterium für 'Qualität'.
Was nicht heißt, dass man unnötig Laufzeit verschenkt und alles und 
jeden Unsinn durchdrückt, nur weil es der reinen Lehre entspricht.
Auf einem kleinen µC herrschen andere Gesetze als auf einem größeren 
Desktopsystem. Was aber auch wiederrum nicht heißt, das man sinnvoll 
einsetzbare Systematiken aus der Szene der Großen nicht einsetzen kann. 
Vor allen Dingen dann nicht, wenn das keine nennenswerte Performance 
kostet.

> Gute Programmqualität ist dieselbe wie vor 30 oder 40 Jahren,
> nämlich optimal effizient und fehlerfrei.
No
Zu guter Qualität gehört heute mehr und mehr Wartbarkeit dazu. Für 
Industrieprogrammierer ist es gang und gäbe, ein Programm von einem 
Vorgänger zu übernehmen, es 5 Jahre oder noch länger zu betreuen und 
dann an den nächsten weiter zu geben.

Ohne vernünftigen Software-Aufbau ist das nicht machbar, weil in der 
Entwicklung zu teuer.


> Daß der Stand der Technik heute fehlerhafte und übermässig
> resourcenfressende Programme abliefert liegt eher an
> der Qualität der heutigen Programmierer

das stimme ich dir zu.

>, die sich selbst
> in die Tasche lügen und ihre Kunden anlügen "das ist gut
> so wie es ist".

Ich würde es eher so festmachen, dass mindestens 60% der in der 
Industrie tätigen Programmierer ihr Handwerk und ihr Handwerkszeug 
'Programmiersprache' ganz einfach nicht mehr beherrschen.
Wer den Ort auf diesem Planeten sucht, auf dem die meisten unfähigen 
Programmierer auf einem Haufen versammelt ist, der möge zu Microsoft 
nach Redmond schauen.

von Karl H. (kbuchegg)


Lesenswert?

Moby schrieb:
> Karl Heinz Buchegger schrieb:
>> Wenn es effektiv genug ist, um seine Aufgabe zu erfüllen,
>
> Nö, damit meinte ich noch nicht mal den mehr oder weniger großen
> Ressourcenverlust bei Hochsprachen-Verwendung. Man schaue sich die 2000
> Seiten Wälzer C(++) Lehrbücher nur mal an... Kein Verhältnis zu dem, was
> (mit ein paar Dutzend ASM-Anweisungen) wirklich zur Codierung nötig ist.

Kein Verhältnis dazu, was man mit ein paar Klassen alles auf Anhieb 
erreichen kann.

Nochmal: wenn du keine Ahnung hast wovon du redest, dann halte dich 
raus.
Mit deinen 200 Zeilen Micky Mouse Assembler Programmen machst du hier 
keinen Stich.

von PittyJ (Gast)


Lesenswert?

Ich verwende C++ auch auf den kleinen Controllern.
Alleine die Kapselung mit Membervariablen und ordentlichen Konstruktoren 
wiegt für mich die Nachteile auf.
Globale Variablen verwende ich gar nicht. Das macht es auch einfacher, 
wenn man Teile für andere Projekte recycelt.

von Embedded (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Ich würde es eher so festmachen, dass mindestens 60% der in der
> Industrie tätigen Programmierer ihr Handwerk und ihr Handwerkszeug
> 'Programmiersprache' ganz einfach nicht mehr beherrschen.

Das glaube ich nicht. Das Problem ist eher der steigende Termindruck, 
unklare Anforderungen, zu starke Fokusierung auf die Dokumentation und 
fehlendes Komplexitätsmanagement.

Wenn es ein Problem mit der Kompetenz gibt, dann eher, dass viele 
"erfahrene" Programmierer einfach den gewachsenen 
Komplexitätsanforderungen nicht mehr gewachsen sind und nicht mit dem 
Stand der Technik mithalten können.

von Moby (Gast)


Lesenswert?

Embedded schrieb:
> immer noch in
> ihrer Assembler-Denkweise gefangen

Damit fühlt sich der ASM-Programmierer nicht gefangen, sondern wirklich 
frei! Grössere Softwaresysteme erfordern andere Methoden. Hier aber ging 
es aber ausdrücklich um Mikrocontroller...

von Karl H. (kbuchegg)


Lesenswert?

Embedded schrieb:
> Karl Heinz Buchegger schrieb:
>> Ich würde es eher so festmachen, dass mindestens 60% der in der
>> Industrie tätigen Programmierer ihr Handwerk und ihr Handwerkszeug
>> 'Programmiersprache' ganz einfach nicht mehr beherrschen.
>
> Das glaube ich nicht.

Dann frag mal einen C# Programmierer nach einer doppelt verketteten 
Liste, wann man sie einsetzt etc. etc.

> Wenn es ein Problem mit der Kompetenz gibt, dann eher, dass viele
> "erfahrene" Programmierer einfach den gewachsenen
> Komplexitätsanforderungen nicht mehr gewachsen sind und nicht mit dem
> Stand der Technik mithalten können.

Das kann durchaus sein. Ich sehs aber auch bei uns. Wenn es darum geht 
komplexe Fehler zu finden, dann ist die C# Fraktion raus aus dem Spiel. 
Dann müssen die alten Hasen rann, die selbst dann noch Techniken parat 
haben, wenn die C# Fraktion nur noch mit den Ohren schlackert.

Das die alten mit den neuen Techniken und Frameworks nicht mehr 
mithalten können gestehe ich dir im übrigen zu. Zähle mich auch dazu.

von Karl H. (kbuchegg)


Lesenswert?

Moby schrieb:
> Embedded schrieb:
>> immer noch in
>> ihrer Assembler-Denkweise gefangen
>
> Damit fühlt sich der ASM-Programmierer nicht gefangen, sondern wirklich
> frei! Grössere Softwaresysteme erfordern andere Methoden. Hier aber ging
> es aber ausdrücklich um Mikrocontroller...

... und den Éinsatz von Hochsprachen.

Also: Tschüüüs

von Moby (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Mit deinen 200 Zeilen Micky Mouse Assembler Programmen machst du hier
> keinen Stich.

Die langen aber oft :-) In Hochsprache häng mal noch eine 0 dran :-)
Und verständlicher wirds auch nicht.

von holger (Gast)


Lesenswert?

>Damit fühlt sich der ASM-Programmierer nicht gefangen, sondern wirklich
>frei! Grössere Softwaresysteme erfordern andere Methoden. Hier aber ging
>es aber ausdrücklich um Mikrocontroller...

Ein STM32F4xx ist auch ein Mikrocontroller.
Mach die 2MB Flash mal mit handgeschriebenem Assemblercode voll;)

von Embedded (Gast)


Lesenswert?

Moby schrieb:
> Damit fühlt sich der ASM-Programmierer nicht gefangen, sondern wirklich
> frei! Grössere Softwaresysteme erfordern andere Methoden. Hier aber ging
> es aber ausdrücklich um Mikrocontroller...

Mikrocontroller heißt auch Cortex M4 mit 2M Flash oder ein Blackfin mit 
400 Mhz.

Und selbst im Sub-Euro-Bereich kommen inzwischen 32-Bit-Controller zum 
Einsatz.

Karl Heinz Buchegger schrieb:
> Das die alten mit den neuen Techniken und Frameworks nicht mehr
> mithalten können gestehe ich dir im übrigen zu. Zähle mich auch dazu.

Das Problem ist, dass die dann das sagen haben. Das führt dann zu oben 
genannten chaotischen Systemen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Moby schrieb:
> Hier aber ging es aber ausdrücklich um Mikrocontroller...

Siehe meine Antwort an Axel Schwenke: auch wenn die Dinger das Wort
„Mikro“ im Namen haben, sind diese Teile dieser Tage oftmals größer
als ein Schrank voll „Minicomputer“ vor 30 … 40 Jahren.

Für einen ATtiny10 mag deine Denkweise noch OK sein.

Moby schrieb:
>> Mit deinen 200 Zeilen Micky Mouse Assembler Programmen machst du hier
>> keinen Stich.
>
> Die langen aber oft :-) In Hochsprache häng mal noch eine 0 dran :-)

Unfug.  Gerade die Anzahl der Codezeilen ist bei Assembler oft genug
viel größer als bei höheren Sprachen, das war noch nie der Bereich,
bei dem man hätte mit einem Assemblerprogramm punkten können.

Aber selbst bei der Größe des generierten Codes ist es nur
Selbstüberschätzung oder Ignoranz eingefleischter 
Assemblerprogrammierer,
dass ein Compiler prinzipiell das 10fache ihrer Werke erzeugen würde.

von Karl H. (kbuchegg)


Lesenswert?

Embedded schrieb:

> Karl Heinz Buchegger schrieb:
>> Das die alten mit den neuen Techniken und Frameworks nicht mehr
>> mithalten können gestehe ich dir im übrigen zu. Zähle mich auch dazu.
>
> Das Problem ist, dass die dann das sagen haben. Das führt dann zu oben
> genannten chaotischen Systemen.

OK, das sehe ich ein. Auch wenn ich das so nie erlebt habe.
Meine Erfahrung war eher so, dass man die Jungen mit ihren Frameworks 
eher Bremsen musste. Dinge die die Frameworks von alleine gemacht haben, 
waren noch kein Problem. Aber wenns dann trickreicher wurde, war es oft 
so, dass die Jungen irgendwann anstanden und dann erst recht die Alten 
wieder ran mussten.

von Moby (Gast)


Lesenswert?

holger schrieb:
> Ein STM32F4xx ist auch ein Mikrocontroller.
> Mach die 2MB Flash mal mit handgeschriebenem Assemblercode voll;)

Du muss und braucht man auch nicht voll machen, in ASM...

von MaWin (Gast)


Lesenswert?

> Das ist deine Definition von optimal.

Nein, das IST die Definition von optimal.
Und daran ändert sich auch nicht, auch nicht weil du es willst, auch 
nicht in 30-40 Jahren. Optimal bleibt optimal.
Höre spassenhalber mal in eine Informatik-Vorlesung rein, es reicht das 
erste Semester, Algorithmen & Datenstrukturen.

> Das ist aber nicht die übliche Definition in einem kommerziellen
> Umfeld. Da ist optimal in allererster Linie "wartbar".

Was du definierst, ist "billig".
Das hört man im BWL Studium.

von Karl H. (kbuchegg)


Lesenswert?

Jörg Wunsch schrieb:

> dass ein Compiler prinzipiell das 10fache ihrer Werke erzeugen würde.

Kunststück.
Was soll ein Compiler auch bei
1
int main()
2
{
3
  DDRD = 0xFF;
4
5
  while( 1 )
6
  {
7
  }
8
]
auch groß anderes machen, als das was ein Assembler Programmierer auch 
macht.
Der einzige Unterschied: Bei
1
   DDRE = 0xFF;
schreib ich das immer noch so hin und muss mir keine Gedanken darüber 
machen, ob DDRE jetzt mit einem OUT oder doch mit einem STS erreichbar 
ist, und wie im letzteren Fall dann die Syntax für die 
Adressschreibweise aussehen muss.

ABer manche kapierens einfach nie.

von Embedded (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> OK, das sehe ich ein. Auch wenn ich das so nie erlebt habe.
> Meine Erfahrung war eher so, dass man die Jungen mit ihren Frameworks
> eher Bremsen musste. Dinge die die Frameworks von alleine gemacht haben,
> waren noch kein Problem. Aber wenns dann trickreicher wurde, war es oft
> so, dass die Jungen irgendwann anstanden und dann erst recht die Alten
> wieder ran mussten.

Es geht mir weniger um das neueste Framework, sondern um moderne 
Entwicklungsmethoden.

Manche "alte Hasen" weigern sich sogar noch vehement, 
Versionskontrollsysteme einzusetzen.

MaWin schrieb:
> Nein, das IST die Definition von optimal.
> Und daran ändert sich auch nicht, auch nicht weil du es willst, auch
> nicht in 30-40 Jahren. Optimal bleibt optimal.

Solche Sturköpfe wie du haben nicht erst eine Architektur völlig 
versaut.

MaWin schrieb:
> Höre spassenhalber mal in eine Informatik-Vorlesung rein, es reicht das
> erste Semester, Algorithmen & Datenstrukturen.

Ich habe studiert.

MaWin schrieb:
> Was du definierst, ist "billig".
> Das hört man im BWL Studium.

Nein, das lernt man im Alltag in der Entwicklung. Wenn du nur deine 
eigenen, "optimalen" Programm warten musst, kannst du natürlich so 
weiter machen. Wenn du mal ein fremdes Programm betreuen musst, weißt 
du, wie viel Wartbarkeit wert ist.

von Karl H. (kbuchegg)


Lesenswert?

MaWin schrieb:

>> Das ist aber nicht die übliche Definition in einem kommerziellen
>> Umfeld. Da ist optimal in allererster Linie "wartbar".
>
> Was du definierst, ist "billig".
> Das hört man im BWL Studium.

Nein. MaWin. Sorry.
Aber Software ist heutzutage genauso ein Dienstleistungsangebot wie 
jedes andere, das denselben Marktgesetzen von Angebot und Nachfrage 
unterliegt.
Das wovon du träumst, das gibt es nur noch bei Bastlern. Eine 
Softwarefirma kann sich das aus Kostengründen schon gar nicht mehr 
leisten.

von Karl H. (kbuchegg)


Lesenswert?

Embedded schrieb:

> Es geht mir weniger um das neueste Framework, sondern um moderne
> Entwicklungsmethoden.
>
> Manche "alte Hasen" weigern sich sogar noch vehement,
> Versionskontrollsysteme einzusetzen.

OK. Dann hab ich dich falsch verstanden. Sorry.

Sturköpfe gibt es überall. Leider.

von MaWin (Gast)


Lesenswert?

> Was soll ein Compiler auch bei
> int main()
> {
>   DDRD = 0xFF;
>
>   while( 1 )
>   {
>   }
> ]
> auch groß anderes machen, als das was ein Assembler Programmierer auch
> macht.

Schau dir mal den Assemblercode des Compilers an...

(aber das liegt nicht am C-Programmierer, er hat die wenigst-möglichen 
Instruktionen gewählt, sondern an der Qualität der Compiler-Schrebier 
die unter Optimierung selten optimal verstehen.

Klar, auch ein Compiler-Schreiber will früher Feierabend haben, er 
KÖNNTE aber über main hinaus optimieren, feststellen daß kein return von 
main stattfindet, daß der stack nicht benötigt wird und damit die 
Initialisierung, daß main nicht ge-call-t werden muss sondern reinlaufen 
kann, daß while(1) keine 16 bit 1 pushen muss...

von Karl H. (kbuchegg)


Lesenswert?

Embedded schrieb:

>> Nein, das IST die Definition von optimal.
>> Und daran ändert sich auch nicht, auch nicht weil du es willst, auch
>> nicht in 30-40 Jahren. Optimal bleibt optimal.
>
> Solche Sturköpfe wie du haben nicht erst eine Architektur völlig
> versaut.

Leider. Ich kämpfe jeden Tag mit den Hinterlassenschaften eines 
selbsternannten Optimal-Programmierers. Nein, eigentlich sinds zwei. Der 
Originalprogrammierer, der nach einigen Jahren des 'Funktionsaufrufe 
sind böse' an einen nicht minder begabten und kreativen 
'Optimalprogrammierer' abgegeben hat. Vor 3 Jahren haben beide das 
Handtuch geschmissen, weil sie selbst nicht mehr durch die Komplexität 
durchgeblickt haben, die sie sich selbst erschaffen haben.
Am besten wäre es das Zeug wegzuschmeissen und neu zu machen. Geht aber 
aus Kosten- und Termingründen nicht.
.

von MaWin (Gast)


Lesenswert?

> Aber Software ist heutzutage genauso ein Dienstleistungsangebot wie
> jedes andere, das denselben Marktgesetzen von Angebot und Nachfrage
> unterliegt.

Das erklärt (dir&mir) zwar den Schrott, der derzeit existiert,
so wie Schrott bei Werkzeug, Lebensmitteln und in der Politik,

> Das wovon du träumst, das gibt es nur noch bei Bastlern. Eine
> Softwarefirma kann sich das aus Kostengründen schon gar nicht mehr
> leisten.

dir hat der Kapitalismus offenbar schon den Verstand abgekauft.
Schrott beliebt Schrott, auch wenn er billig war.

"Gute Qualität" ist weder bei Programmen, noch bei Werkzeug,
noch bei Lebensmitteln das billigste.

Lass dich nicht verblenden, hol dir deinen Verstand zurück
den du an den Kapitalismus verhökert hast (wohl gegen einen
Videorecorder mit schlechtem Film eingetauscht).

von Peter D. (peda)


Lesenswert?

Jan K. schrieb:
> Viele Projekte, die ich hier sehe strotzen nur vor globalen Variablen,
> teilweise ein völliges Chaos.

Naja, die Programme hier kann man nicht unbedingt als Maßstab ansehen. 
Viele sind nur Hobbyprogrammierer und haben sich das Programmieren 
selbst beigebracht.

Ich entwickele hauptsächlich Geräte und mache auch nur nebenbei etwas 
Firmware zur Steuerung.

An modularem Programmieren ist überhaupt nichts auszusetzen, da gibt es 
kein zuviel.
Ich bin auch ein Fan von kleinsten Funktionen. Die Kommunikation sollte 
möglichst nur über Parameter und Returnwerte erfolgen. Globale Variablen 
braucht man eigentlich nur für die Kommunikation mit Interrupts.

Mit C++ kenne ich micht nicht aus, wie das mit Klassen und Vererbung 
funktioniert.
Ich sehe bei C++ aber immer einen riesen Schreibaufwand allein schon in 
den Headern. Ich finde dann keinen roten Faden, wo eigentlich was 
ausgeführt wird. Ich guck also rein, wie ein Schwein ins Uhrwerk.
Ich habe den Eindruck, C++ Quelltexte sind mindestens doppelt so groß, 
wie das gleiche in C.
Im Binärcode soll dann der Größenunterschied ja nicht mehr so groß sein.

von db8fs (Gast)


Lesenswert?

Hi,

mach es Dir doch ganz einfach und ich behaupte mal, der Unterschied 
zwischen objektorientierter C und C++ Programmierung ist gar nicht so 
groß.

Wenn du C++ gelernt hast, weißt du, dass C++ auf dem Sprachkonstrukt von 
C aufsetzt.
Soll heißen: Klassen sind nix anderes als Strukturen mit Daten sowie mit 
Funktionspointern für Operationen. Fertig biste, schon kannste 
objektorientiert auch mit reinen ANSI-C-Mitteln arbeiten.
Templates kannst du halbwegs durch Makros approximieren, kannst dir also 
auch so behelfen.

Was du gewinnst: wartbaren, wiederverwendbaren Code, der idealerweise 
nur in atomaren Operationen direkt die AVRlibc-Mittel aufruft.

Gegenüber reinen objektorientierten Architekturen (gegen rein virtuelle 
Interface-Klassen programmiert) bist du dann immer noch um eine 
Abstraktion/Dereferenzierung schneller, kriegst aber wartbareren Code 
hin.

Wenn du nicht objektorientiert arbeiten willst, kannst du ja auch 
Interface-Driven-Development mit ANSI-C machen. Dann sind 
Funktionspointer-Deklarationen deine Schnittstellen, gegen die du 
entwickelst. Auch damit kannst du SOLID programmieren (siehe J.Grenning 
"TDD for Embedded Systems").

Viel Erfolg!

von Karl H. (kbuchegg)


Lesenswert?

MaWin schrieb:
>> Was soll ein Compiler auch bei
>> int main()
>> {
>>   DDRD = 0xFF;
>>
>>   while( 1 )
>>   {
>>   }
>> ]
>> auch groß anderes machen, als das was ein Assembler Programmierer auch
>> macht.
>
> Schau dir mal den Assemblercode des Compilers an...

Ja.
1
int main(void)
2
{
3
    DDRD = 0xFF;
4
  92:  8f ef         ldi  r24, 0xFF  ; 255
5
  94:  81 bb         out  0x11, r24  ; 17
6
  96:  ff cf         rjmp  .-2        ; 0x96 <main+0x4>

und?


> Klar, auch ein Compiler-Schreiber will früher Feierabend haben, er
> KÖNNTE aber über main hinaus optimieren, feststellen daß kein return von
> main stattfindet, daß der stack nicht benötigt wird und damit die
> Initialisierung, daß main nicht ge-call-t werden muss sondern reinlaufen
> kann, daß while(1) keine 16 bit 1 pushen muss...

Sagen wir so. Der Linker könnte diese Teile rauswerfen. Und 
entsprechenden Startup code massgeschneidert bereitstellen.

Ja, könnte er.
Und? Kratz mich das, wenn der µC nach Anliegen der Versorgungsspannung 
20 oder 30 Takte früher mit der Initialisierung fertig ist?
Nein ... nicht wirklich.
Kratzt es mich, wenn mir der Compiler/Linker eine Interrupt Vektor 
Tabelle einbaut, obwohl Interrupts gar nicht vorkommen. Nein, nicht 
wirklich.
Das sind Dinge, die ich in Kauf nehme und die bei den 'paar verschenkten 
Prozenten' drinnen sind.

von Embedded (Gast)


Lesenswert?

MaWin schrieb:
> "Gute Qualität" ist weder bei Programmen, noch bei Werkzeug,
> noch bei Lebensmitteln das billigste.

Das hat immer noch nichts mit billig zu tun. Wenn Mannjahre nur damit 
verbracht werden, das gleiche immer wieder neu "optimal" zu 
implementieren und man bestehenden Code immer wieder in die Tonne tritt, 
weil so ein Optimalfetisicht wie du am Werk war, dann ist das einfach 
nur Fortschrittsfeindlich und ist bei talentierten Entwicklern ein 
absoluter Frustfaktor. Gerade wenn man es mit solchen Betonköpfen wie 
dir zu tun hat, die ihre tolle, "optimale" Programmierweise auch noch 
bis auf letzte verteidigen.

Ich habe an solchen Betonköpfen schon ganze Firmen zugrunde gehen sehen.

von Karl H. (kbuchegg)


Lesenswert?

Embedded schrieb:

> Ich habe an solchen Betonköpfen schon ganze Firmen zugrunde gehen sehen.

Da bist du nicht der einzige.

von MaWin (Gast)


Lesenswert?

> Das hat immer noch nichts mit billig zu tun. Wenn Mannjahre nur damit
> verbracht werden, das gleiche immer wieder neu "optimal" zu
> implementieren und man bestehenden Code immer wieder in die Tonne tritt,
> weil so ein Optimalfetisicht wie du am Werk war, dann ist das einfach
> nur Fortschrittsfeindlich

Armer Irrer. Ich hoffe, dir hat man schon oft deinen Code um die Ohren 
gehauen damit du ihn noch mal machst.

Das Ergebnis deiner Philosophie wurde schon genannt:

> > Was ich aber auf jeden Fall schon mal sagen würde: die
> > Tatsache daß Mobiltelefone heutzutage Quadcore CPUs mit GHz Takt
> > brauchen, ist im wesentlichen das Verschulden der Kapseler-Fraktion
> 100% ACK

Das passiert, wenn man wie du den Kontakt zur Realität verliert,
und nicht mehr die Richtung kennt, in die man sich bemühen muss.

Optimal ist selten erreicht, aber immer die richtige Richtung.

Deine Richtung ist immer falsch.

von Karl H. (kbuchegg)


Lesenswert?

MaWin schrieb:

> Das Ergebnis deiner Philosophie wurde schon genannt:
>
>> > Was ich aber auf jeden Fall schon mal sagen würde: die
>> > Tatsache daß Mobiltelefone heutzutage Quadcore CPUs mit GHz Takt
>> > brauchen, ist im wesentlichen das Verschulden der Kapseler-Fraktion
>> 100% ACK

Ja ein Vergleich 'Äpfel mit Birnen' und die Zustimmung eines 
Programmierers, der auch noch nie irgendwas größeres als ein paar 100 
Zeilen Code geschrieben hat.
Kein wirklich gutes Argument.

Aber abgesehen davon: kurbelst du eigentlich dein Auto noch von Hand an? 
Denn neumodisches Zeug wie Starter braucht man ja eigentlich auch nicht.

von Andreas (Gast)


Lesenswert?

Jan K. schrieb:
> Mir ist klar, dass zusätzliche Variablen und Funktionsaufrufe ein
> bisschen overhead mitbringen und frage mich daher, wie weit ich dem
> Konzept der Kapselung folgen soll.

1.) Bleib bei C++, auch auf dem MC, und kapsele so weit wie es Dir 
gefällt. Dabei entsteht kein nennenswerter Overhead, wenn man dem 
Compiler/Linker die richtigen Optionen mitgibt (-Os -fno-exceptions 
-fno-rtti -flto -fwhole-program).

2.) Rechne möglichst nur mit ganzen Zahlen und vermeide möglichst 
Funktionen wie printf, sonst wird der Platz im Flash schnell knapp.

3.) Lerne Deine MCU auf Assemblerebene zu beherrschen, damit Du den vom 
Compiler generierten Code prüfen kannst. Gelegentlich muss man in der 
Hochsprache etwas nachhelfen, damit der Compiler kompakten und 
effektiven Code erzeugen kann.

von Embedded (Gast)


Lesenswert?

MaWin schrieb:
> Armer Irrer. Ich hoffe, dir hat man schon oft deinen Code um die Ohren
> gehauen damit du ihn noch mal machst.

Nein, ganz im Gegenteil. Ich musste schon öfters "Feuerwehr" für die 
Optimal-Betonköpfe spielen.

MaWin schrieb:
> Das passiert, wenn man wie du den Kontakt zur Realität verliert,
> und nicht mehr die Richtung kennt, in die man sich bemühen muss.

Das passiert aber nur bei den Optimal-Betonköpfen.

MaWin schrieb:
> Deine Richtung ist immer falsch.

Die Industrie sagt etwas anderes. Achja, ich habe ganz vergessen, dass 
du glaubst, dass die Industrie einen falschen Weg geht und nur dein Weg 
der richtige ist und du sämtliche Software auf der ganzen Welt viel 
besser entwickeln könntest.

Haha.

Zeig doch erstmal, was du so viel besser kannst wie die Entwickler von 
iOS oder Linux.

von Moby (Gast)


Lesenswert?

Embedded schrieb:
> Ich habe an solchen Betonköpfen schon ganze Firmen zugrunde gehen sehen.

Karl Heinz Buchegger schrieb:
> Da bist du nicht der einzige.

Wer seid ihr eigentlich, daß Ihr so urteilen könnt?

von Embedded (Gast)


Lesenswert?

Moby schrieb:
> Wer seid ihr eigentlich, daß Ihr so urteilen könnt?

Entwickler mit langjähriger Industrieerfahrung im Embeddedbereich?

von Karl H. (kbuchegg)


Lesenswert?

Moby schrieb:
> Embedded schrieb:
>> Ich habe an solchen Betonköpfen schon ganze Firmen zugrunde gehen sehen.
>
> Karl Heinz Buchegger schrieb:
>> Da bist du nicht der einzige.
>
> Wer seid ihr eigentlich, daß Ihr so urteilen könnt?

Falls du es noch nicht begriffen hast:
Hauptberufliche Industrieprogrammierer.
Wir sind dir ein paar Millionen Lines of Code vorraus mein Freund. Jeden 
Fehler, den du in den nächsten 5 Jahren machen wirst, haben wir schon 
ein paar mal gemacht, wissen wie es dazu gekommen ist und auch wie man 
dafür sorgt, dass er nicht nochmal passiert.

Du argumentierst wie jemand der gerade mal unfallfrei ein Pflaster 
aufkleben kann, Chirurgen mit 20 Jahren Erfahrung im OP aber erklären 
will, wie sie ihren Job zu machen haben (wobei es bei mir bald 30 Jahre 
werden).

von Moby (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Wir sind dir ein paar Millionen Lines of Code vorraus mein Freund.
>
> Du argumentierst wie jemand der gerade mal unfallfrei ein Pflaster
> aufkleben kann, Chirurgen mit 20 Jahrfen Erfahrung im OP aber erklären
> will, wie sie ihren Job zu machen haben.

Diese Überheblichkeit sagt doch alles.
Ich denke, dass Firmen wohl eher daran zugrundegehen.

von Karl H. (kbuchegg)


Lesenswert?

Moby schrieb:
> Karl Heinz Buchegger schrieb:
>> Wir sind dir ein paar Millionen Lines of Code vorraus mein Freund.
>>
>> Du argumentierst wie jemand der gerade mal unfallfrei ein Pflaster
>> aufkleben kann, Chirurgen mit 20 Jahrfen Erfahrung im OP aber erklären
>> will, wie sie ihren Job zu machen haben.
>
> Diese Überheblichkeit sagt doch alles.

Ja, ja.
Das sagen immer die, die selber nichts zustande bringen und dann, wenn 
sie die Sache in den Sand gesetzt haben nach den Profis rufen.
Kennen wir alles. Alles schon erlebt.

> Ich denke, dass Firmen wohl eher daran zugrundegehen.

Ähm. unsere Firmen leben noch. Und wie sie leben!
Aber ob dus glaubst oder nicht. Man kennt auch Leute in anderen Firmen. 
Und die erzählen manchmal was oder fragen nach, wie man Dinge lösen bzw. 
umschreiben könnte. Und man kommt auch zu anderen Firmen. Es gibt 
Kooperationen, man bleibt mit Studienkollegen in Kontakt, etc. etc.

von db8fs (Gast)


Lesenswert?

Ach so, btw. wer richtig guten, plattformunabhängigen und schnellen 
C-Code in 'nem größeren Projekt mal anschauen möchte, dem seien die 
Enlightenment Foundation Libraries (EFL), speziell Evas, mal zum 
Anschauen empfohlen. Von den Libs kann man allerhand lernen und 
garantiert auch auf uC's wieder verwenden (Eina als Algorithmenlib?).

von Moby (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> unsere Firmen leben noch

Noch...   :-)

von Karl H. (kbuchegg)


Lesenswert?

Moby schrieb:
> Karl Heinz Buchegger schrieb:
>> unsere Firmen leben noch
>
> Noch...   :-)

Der Himmel steh uns bei, dass wir je einen weiteren Betonkopf wie dich 
in unser Team kriegen. Wir haben schon genug damit zu tun, das Chaos 
aufzuarbeiten, das uns andere Betonköpfe hinterlassen haben.

von Embedded (Gast)


Lesenswert?

Ich habe leider immer wieder mit solchen 
100-Zeilen-Assemblerprogrammierern zu kämpfen. Die muss man halt 
irgendwie durschleppen, am besten mit den unwichtigen Aufgaben so 
vollpacken, dass sie die fähigen Entwickler nicht aufhalten. Die dürfen 
dann allenfalls noch Doku schreiben.

von MaWin (Gast)


Lesenswert?

> Zeig doch erstmal, was du so viel besser kannst wie die Entwickler von
> iOS oder Linux.

Das habe ich bereits, von meinen Ideen und Programm lebt eine ganze 
Firma.

Und nicht embedded, sondern richtige Programme, die von Windows über 
Linux und iOS bis zu CICS Mainframes laufen.

Und ich habe viel Code gesehen, in dem "ich strukturiere so toll und bin 
so super zukunfstsorientiert und nutze nur die modernsten Methoden" 
Leute Elefanten gebaut haben die nicht mal einen Mäusefurz lassen 
konnten.

von Moby (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> dass wir je einen weiteren Betonkopf wie dich
> in unser Team kriegen

Keine Angst, ich bin völlig branchenfremd... Aber in meine Controller 
kommt trotzdem nur reiner ASM Code- und der optimiert bis zum geht nicht 
mehr. Mit einem Minimum an Textaufwand, formuliert in einfacher 
Sprachsyntax. Der einfach funktioniert. Der schnell, kompakt und 
effektiv ist. Alles wovon ein Industrieprogrammierer nur träumen kann 
:-)

von Embedded (Gast)


Lesenswert?

MaWin schrieb:
> Das habe ich bereits, von meinen Ideen und Programm lebt eine ganze
> Firma.

Nur eine? Schwach.

MaWin schrieb:
> Und nicht embedded, sondern richtige Programme, die von Windows über
> Linux und iOS bis zu CICS Mainframes laufen.

Embedded sind also keine richtigen Programme?

MaWin schrieb:
> Und ich habe viel Code gesehen, in dem "ich strukturiere so toll und bin
> so super zukunfstsorientiert und nutze nur die modernsten Methoden"
> Leute Elefanten gebaut haben die nicht mal einen Mäusefurz lassen
> konnten.

Und ich schon sehr viel von Leuten "ich programmiere so super optimal, 
dass kein Mensch hinterher etwas mit dem Code anfangen kann und ich 
garantieren kann, dass der in zwei Jahren neu geschrieben werden muss". 
Von so teamunfähigen Sturköpfen wie du einmal abgesehen.

von Karl H. (kbuchegg)


Lesenswert?

Ja, schon recht.
Ich freue mich, wenn ich dich das nächste mal sehe, wenn du einem 
Assembler-Hilfesuchenden hier im Forum aus der Patsche hilfst.
Bis jetzt hat man ja von dir nicht viel gesehen, ausser: C ist scheisse.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Andreas schrieb:
> vermeide möglichst Funktionen wie printf, sonst wird der Platz im Flash
> schnell knapp.

Auf einem Controller mit 8 KiB mag das stimmen.

Auf einem mit 128 KiB ist selbst printf() nur Rauschen.  Dafür
vereinfacht es gerade das Debuggen während der Entwicklungsphase
oft ungemein, wenn man sich damit mal schnell ein paar Werte
nebenbei protokollieren kann.

> Lerne Deine MCU auf Assemblerebene zu beherrschen, damit Du den vom
> Compiler generierten Code prüfen kannst.

Das auf alle Fälle.

von Embedded (Gast)


Lesenswert?

Moby schrieb:
> Alles wovon ein Industrieprogrammierer nur träumen kann
> :-)

Nein, als Industrieprogrammierer träume ich davon, dass ich den gleichen 
Code auf PC, FPGA-Softcore und Cortex M4 verwenden kann.

Geht das mit deinem Assemblercode?

von Axel S. (a-za-z0-9)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Software ist heutzutage genauso ein Dienstleistungsangebot wie
> jedes andere, das denselben Marktgesetzen von Angebot und Nachfrage
> unterliegt.
> Das wovon du träumst, das gibt es nur noch bei Bastlern. Eine
> Softwarefirma kann sich das aus Kostengründen schon gar nicht mehr
> leisten.

100% ACK

Auch heute noch könnte man 100% korrekten, optimalen Code schreiben. Es 
will halt nur keiner mehr bezahlen. Selbst in extrem kritischen 
Bereichen wie Raumfahrt, Kerntechnik und Medizintechnik nicht mehr :(

Und im normalen Umfeld zählt time-to-market mehr als Fehlerfreiheit. Ein 
99% korrektes programm heute ist mehr wert als ein 100% korreltes 2 
Monate später. Ganz davon zu schweigen daß Field-Upgrades erlauben, 
Bananen-Software [1] abzuliefern.


XL

[1] reift beim Kunden

von Moby (Gast)


Lesenswert?

Embedded schrieb:
> Geht das mit deinem Assemblercode?

Muss man das damit können?
Und Du träumst ja offensichtlich auch nur davon.
Warum wohl?

von Jan K. (jan_k)


Lesenswert?

Ey Leute gehts eigentlich noch? Ab dem ca. 5. Post wird hier (bis auf 
wenige ausnahmen) nur rumgeweint. Gibts doch nicht, noch nicht mal in 
diesem Forum.

Dass unterschiedliche Meinungen existieren ist klar, aber müsst ihr 
deswegen so rumflamen?

Bisher hab ich alles jetzt gelesen... C++ und kapseln was das zeug hält, 
pures hoch"optimales" Assembler, wasn nun?

Offensichtlich macht es ja doch jeder wie er will.

Mein Ziel ist: einfacher, unkomplizierter und wiederverwendbarer (nicht 
überall auf Teufel komm raus, sondern auf identischer Architektur und 
ähnlichem Programmablauf) code, der durchaus länger sein darf,wenn ich 
ihn verstehe. Flash ist nicht das Problem.

Es handelt sich um einen stm32f103, der ja bekannterweise schon etwas 
power hat. Natürlich macht es keinen Sinn, die Ressourcen sinnfrei zu 
verschwenden, aber brach liegen lassen bringt doch auch nix. Ihr sagt 
doch auch immer man soll zB Speicher verwenden wenn er da ist....

Mal sehen was der thread noch bringt..

Jan

von holger (Gast)


Lesenswert?

>Ihr sagt doch auch immer man soll zB Speicher verwenden wenn er da ist...

Richtig, für nicht verwendeten Speicher bekommt man kein Geld zurück;)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Jan K. schrieb:
> Ihr sagt doch auch immer man soll zB Speicher verwenden wenn er da ist.

Ja, es gibt dir niemand Geld zurück für Speicher, den du nicht
benutzt hast.  Wenn dein printf() also noch reinpasst und dir die
Arbeit erleichtert, dann benutze es.  Wenn Gleitkommazahlen noch
reinpassen und dir die Arbeit erleichtern, dann benutze sie.  Wenn
der Speicher voll wird, kannst du das printf() ja allemal wieder
rauswerfen oder dir Gedanken machen, welchen Wertebereich man ohne
Überlauf für scaled integer anstelle von Gleitkomma braucht.

Sinnlose Kopien von Variablen (wie im Beispiel deiner initialen
Parameter) sollte man allerdings in der Tat möglichst bereits vom
Design her vermeiden.

von MaWin (Gast)


Lesenswert?

> Ja, es gibt dir niemand Geld zurück für Speicher, den du nicht
> benutzt hast.

Na ja, kleinere uC sind normalerweise billiger.

Nicht-voller Programmspeicher erlaubt einfache Änderungen,
Bugfixes und Erweiterungen einzubringen.


Es ist also nicht so, daß Platz nicht auch was wert ist.

von holger (Gast)


Lesenswert?

>Na ja, kleinere uC sind normalerweise billiger.

Auf Krampf einen eigentlich zu grossen Code in
einen zu kleinen Controller quetschen zu wollen kostet auch
wenn man ständig irgenwo wieder Abstriche machen muss.

Bei einer 100er Serie denke ich über sowas überhaupt nicht nach.
Da kommt das rein was sowieso da ist. Wenn das 1€ mehr kostet
ist das auch egal. Von dem Geld kann ich keinen Programmierer
eine Woche bezahlen der den Code noch kleiner bekommt.

von old man (Gast)


Lesenswert?

Wenn ich hier alle raus sortiere die keine Ahnung haben dafür aber 
großes Maul, dann bleiben nur ein paar wenige brauchbare Beiträge 
übrig...
Fakt ist doch, alles was gerade mal wieder total in ist hat die Welt in 
2 Jahren vergessen.
Ich habe vor 23 Jahren mit Borland C++ auf dem PC das erste mal etwas in 
C++ gemacht und davor einiges an Büchern verschlungen. In der 
Zwischenzeit sind viele Konzepte, Compiler und Sprachen gekommen und 
gegangen. Die Grundidee von C++ hat die Zeit überdauert. Teile vom C++ 
Code den ich vor 23 Jahren geschrieben ist heute noch Bestandteil 
unserer Produkte.(unter Windows, Mac und Linux!) Die Kapselung in C++ 
ist schön und gut, in wie weit man sich von dem Konzept gängeln lässt 
ist eine andere Frage. Wenn ich heute eine Lib schreibe die die halbe 
Welt benutzen soll, dann kommen natürlich nur Memberfunktionen in Frage. 
Eigentlich dürften in der Klassendefinition gar keine Variablen stehen 
um das vor dem Anwender der Lib zu verbergen. Das geht aber in C++ zwar 
nur über Krampflösungen, aber es geht. Es ist aber nicht immer eine Lib 
das Ziel der Arbeit. Wenn ich auf einem kleinen Controller z.b. etwas in 
Klassen packe, dann habe ich ja nicht das Ziel alles vor mir selbst zu 
verstecken. Nichts spricht dagegen die Variablen direkt an zu sprechen. 
Insbesondere dann, wenn es sowieso nur eine sinnvolle Instanz geben kann 
(z.b. CAN wenn es nur eine Schnittstelle gibt). Trotzdem hat eine Klasse 
Vorteile vor einer einfachen struct. Was meines Erachtens nach auf 
Controllern nicht geht ist die Verwendung der Standard C++ Lib. Der Kram 
da drin ist einfach nicht dafür ausgelegt mit knappen Resourcen und ohne 
Speicherverwaltung aus zu kommen.

printf ist schon nützlich, solange man es nicht aus der newlib benutzt. 
Hier gibt es genügend schmale Implementierungen im Netz. Damit kann man 
schon mal viel unnötigen Ballast entfernen.

Alles in allem kann man sagen: Ein Lehrbuch ist dazu da Grundlagen zu 
vermitteln. Man muss sich aber auch klar darüber sein, dass die Autoren 
der Lehrbücher aus der "Lehre" kommen. Nicht alles was da steht ist 
immer der Stein des Weisen.

Um auf den Ausgangspunkt zurück zu kommen. Wenn du das Gefühl hast mit 
den vielen Get/Set-Funktionen nur Ballast zu schreiben, dann ist es auch 
Ballast. Du musst mit deiner Arbeit zufrieden sein und nicht damit dass 
du alles wie im Lehrbuch gemacht hast. An deinen Zweifeln sehe ich aber, 
dass du auf dem richtigen Weg bist. Und nochmal C/C++ ist auf 
Controllern die erste Wahl. Ich denke zu wenigstens 99%.

von Embedded (Gast)


Lesenswert?

Moby schrieb:
> Muss man das damit können?
> Und Du träumst ja offensichtlich auch nur davon.
> Warum wohl?

Ja, muss man. Schließlich muss ich mit mehreren Plattformen arbeiten und 
kann es mir nicht leisten, jeden Mist neu zu implementieren. Außerdem 
sollen die Algorithmen auch für Simulationstools am PC verwendet werden. 
Schließlich geht es nicht um lächerliche 100 Zeilen Assemblercode, 
sondern um zehntausende Codezeilen.

Und nein, ich träume nicht nur davon, das ist meine Realität.

von Martin V. (oldmax)


Lesenswert?

Hi
Manchmal amüsiert es mich, wenn die Antworten auf ein Thema wieder in 
den Glaubenskrieg ausarten. Wann steht ihr mal von eurem Arbeitsplatz 
auf und werft einen Blick an díe Theke einer Kneipe. Dort trinken die 
Leute auch nicht nur Bier, sondern nutzen die Getränkevielfalt. Das 
Beispiel ist vielleicht etwas schräg, dennoch geht es doch in erster 
Linie um einen Job oder en Hobby. Ich wünschte manchmal, ich wäre in 
jungen Jahren nicht so faul gewesen und hätte die Chance genutzt, eine 
Sprache (richtig) zu studieren. So ist eben alles "nur" learning by 
doing. Klar, ich kenn auch "Kapselung". Und es hat lange gedauert hat, 
bis ich's verstanden habe. Obwohl ich auf Controllerebene immer noch 
einen Ochenkarren fahre (Assembler programmiere), geht mein Stil auch in 
die Richtung "Kapselung". Der Begriff ist hier nicht ganz richtig, aber 
ich denke, ihr versteht, was gemeint ist.
  Alles in allem habe ich Respekt vor jedem Programmierer, der seine 
Arbeit versucht mit dem Gedanken an seine Kollegen umzusetzen und einen 
klaren Code schreibt. Die Sprache ist doch in diesem Zusammenhang völlig 
wurscht. Was ich aber immer öfter feststelle, das ein Termin- oder 
Kostendruck eben nicht klare Programme und schon gar nicht Fehlerfreie 
liefert. Auch ich stolper das ein oder andere mal über meine eigenen 
"quick and dirty"-Codes.
Um vielleicht noch einen kleine Beitrag zum ersten Post zu geben: ja, 
die Programmierung während und für ein Studium ist etwas anderes, als 
die vielseitige Welt der Programmiersprachen. Aber man bekommt 
sicherlich eine Menge Basiswissen, welches nützlich ist, bei der 
Umsetzung aktueller Aufgaben. Und ja, nicht immer muss gekapselt werden 
und ja, es gibt auch Controller, die mächtiger wie der Atmega8 sind.
Auf welcher Hardware ich mit welcher Software arbeite, ist doch immer 
den aktuellen Bedingungen geschuldet.
gruß oldmax

von Michael S. (msb)


Lesenswert?

Ich möchte mal ein bisschen aus dem Nähkästchen plaudern.

Mal von schnellen Q&D Hacks zum ausprobieren von etwas, sollte jede 
professionelle Software folgende Ziele verfolgen:
- Fehlervermeidung im Ansatz
- Gute und sichere Wartbarkeit, auch durch Andere
- Optimierung von Resourcen, Stromverbrauch und Performance
  aber nur im Rahmen des Notwendigen

Das ereicht man durch:
- klare Requirements
- die für die Aufgabe richtige Archtektur,
  was auch die Programmiersprache einschliesst
- ein übersichtliches Designs,
  das man zumindest im Groben vor der Kodierung macht
- gute und weitreichende Kodierrichtlinien
- Disziplin bei der Implementierung die Richtlinien einzuhalten
- Unit tests an den richtigen Stellen
- systematische Integrations- und Systemtests
- und ein Sack von Praxiserfahrungen,
  denn grau ist jede Theorie

Prizipiell kann man das in jeder Sprache erreichen. Schon zu Z80 
Assemblerzeiten habe ich mich bemüht übersichtlich und modular zu 
Programieren.

Aber eines ist klar:
In C geht das sehr viel besser als in Assembler und in C++ deutlich 
besser als in C.

Wir benutzen heute keinen Assembler mehr (von Startup Code und 
Spezialsequenzen mal abgesehen)

Wir benutzen C für kleine uC wie PIC16,PIC18 und da muss man manchmal 
Resourcen vor die 100% sauberen Designs stellen, aber NUR wenn es 
wirklich notwendig ist.

Sonst ist alles in C++, PIC32, ARM7, ARM Cortex M3, und auf Linux und PC 
ohnehin.
Ausser ein Kunde fordert explizit C. Die Mär vom resourcenfressenden C++ 
stimmt zumindest dann nicht, wenn man weiss was man tun sollte und was 
nicht.

Dazu kommen saubere Python Scripts für Build Automatisierungen, 
Customizations, Code Generatoren.

von Purzel H. (hacky)


Lesenswert?

Man kann uebrigens auch mit ASM und alles globalen Variablen kapseln.

- durch Namensgebung
- durch Gruppierung der Definitionen und Deklarationen

und dynamische Alozierung der Objekte sollte man eh vermeiden.

Ziel von Objektorientierung ist
-Uebersicht
-Strukturierung
-Wiederverwendbarkeit
-Kapselung

Und das erreicht man auch ohne die ueblichen Objekte.

von Moby (Gast)


Lesenswert?

Embedded schrieb:
> Schließlich geht es nicht um lächerliche 100 Zeilen Assemblercode,
> sondern um zehntausende Codezeilen.

Wer sagt das es nur 100 Zeilen sein können?
Mit entsprechend Können, Lust und Leidenschaft und viel Zeit gerne viele 
Tausend. Gerade letztere ist ja das Privileg des Hobbyprogrammierers :-)
Im übrigen muss ich gerade deshalb nicht zwischen den Plattformen 
umherspringen weil ASM-Code die erwählte eben effizient auszunutzen 
weiß. Im Rahmen derer (AVR/XMega in meinem Fall) kann ich dann auch 
viele Codemodule wiederverwenden. Von den vielen Tausend Projekten hier 
im Forum sehe ich nur ganz wenige, die den Leistungsrahmen von PIC,AVR & 
Co prinzipiell sprengen würden. Immer fettere Hochsprachen->immer 
größere/stärkere Controller->immer fettere Hochsprachen: ich finde das 
ist eine sehr ungesunde Spirale nach oben die letztlich nur zu 
Energieverschwendung führt.

von Moby (Gast)


Lesenswert?

Jan K. schrieb:
> Es handelt sich um einen stm32f103,

Hätte der Autor das gleich gesagt hätte ich mich mit meinem Plädoyer für 
simplen ASM Code gar nicht eingeschaltet. Die ARMs sind so schon gar 
nicht mehr sinnvoll zu programmieren.

von Chris D. (myfairtux) (Moderator) Benutzerseite


Lesenswert?

holger schrieb:
>>Na ja, kleinere uC sind normalerweise billiger.
>
> Auf Krampf einen eigentlich zu grossen Code in
> einen zu kleinen Controller quetschen zu wollen kostet auch
> wenn man ständig irgenwo wieder Abstriche machen muss.

Vor allem kostet es eines: viel Zeit

ich habe das genau einmal gemacht, weil der Code unbedingt in die 8kB 
eines ATmega8515 passen musste (Hardware war da schon von Partnerfirma 
geordert worden ... hmpf).

Nie wieder!

Die Zeit (=Geld), die ich da reingesteckt habe, hatten wir auch nach 
1000 Stück nicht raus.

Aber daraus habe ich viel gelernt :-)

> Bei einer 100er Serie denke ich über sowas überhaupt nicht nach.
> Da kommt das rein was sowieso da ist. Wenn das 1€ mehr kostet
> ist das auch egal. Von dem Geld kann ich keinen Programmierer
> eine Woche bezahlen der den Code noch kleiner bekommt.

Genau so ist es heutzutage.

Mittlerweile gehe ich genau andersherum vor: zuerst wird der dickste 
Controller genommen und auf dem alles implementiert. Und danach wird 
dann geschaut, welcher kleinere mit dem Code dasselbe leisten kann.

Aber auch da wird viel Luft gelassen, denn wie Du schon schriebst: ob 
der Controller nun einen Euro mehr kostet, ist völlig egal.

Der Code muss das machen, was er soll und zusätzlich modular/gut 
wartbar sein. Sonst ist eine Weiterentwicklung/Ergänzung später 
wirtschaftlich nicht mehr darstellbar.

Mittlerweile muss ich in vielen Fällen nur noch passende Module 
zusammensetzen und das geht eben nur dann, wenn diese sauber gekapselt 
und mit definierten Schnittstellen versehen sind. In 99% der Fälle 
spielt dabei Geschwindigkeit keine Rolle (mehr). Die Controller sind für 
die üblichen Routineaufgaben einfach schon viel zu schnell geworden.

---

Objektorientiert kann man natürlich auch in reinem C programmieren, denn 
Objektorientiertheit ist nur eine andere Art, Programme zu 
strukturieren. Das geht prinzipiell mit jeder Programmiersprache.

Bzgl. globaler Variablen für ISRs:
Ich handhabe das eigentlich immer so, dass alle Informationen, die ISRs 
benötigen, ebenfalls über entsprechende Schnittstellen im "ISR-Modul" 
angesprochen werden. Dadurch gibt es dann gar keine globalen Variablen 
mehr und die Trennung ist sehr sauber.

von old man (Gast)


Lesenswert?

Moby schrieb:
> Im übrigen muss ich gerade deshalb nicht zwischen den Plattformen
> umherspringen weil ASM-Code die erwählte eben effizient auszunutzen
> weiß. Im Rahmen derer (AVR/XMega in meinem Fall) kann ich dann auch
> viele Codemodule wiederverwenden. Von den vielen Tausend Projekten hier
> im Forum sehe ich nur ganz wenige, die den Leistungsrahmen von PIC,AVR &
> Co prinzipiell sprengen würden. Immer fettere Hochsprachen->immer
> größere/stärkere Controller->immer fettere Hochsprachen: ich finde das
> ist eine sehr ungesunde Spirale nach oben die letztlich nur zu
> Energieverschwendung führt.

Ich würde an dieser Stelle gern mal einen Webserver mit SD-Karten 
Interface von dir sehen der in Assembler geschrieben ist. Das sowas in C 
auf 8-bittern geht haben hier ja schon einige bewiesen. Ein TcpIp-Stack 
oder ein SD-Karten Interface mit FAT(16/32)-FS ist mir aber noch nicht 
in Assembler untergekommen. Es sind nicht immer die Hochsprachen die 
alles immer fetter machen. Auch die Aufgabenstellungen wachsen. Und zum 
Glück haben alle bis auch dich erkannt, dass es ab einer bestimmten 
Komplexität und Größe keinen Sinn mehr macht alles in Assembler zu 
machen. Wobei es natürlich immer wieder mal sinnvoll ist ein paar Zeilen 
Assembler zu benutzen. Dann aber nur da wo die Geschwindigkeit wirklich 
an erster Stelle steht.

von Peter D. (peda)


Lesenswert?

Da dieser Thread nun zu ASM vs C abgedriftet ist.

Es ist schon von Vorteil, wenn man das Listing lesen kann, das der 
Compiler erzeugt.
Aber ASM möchte ich nicht mehr programmieren müsen, es kostet einfach 
viel zuviel Zeit, d.h. ich würde meinen Auftraggeber bestehlen.

Auch hat man heutzutage oft nicht nur einen MC-Typ in Benutzung und da 
ist es von Vorteil, wenn man einfach Routinen z.B. vom 8051 auf den 
Cortex-M0 übernehmen kann.

Die Compiler scheinen alle auch sehr ähnlich zu optimieren. Ein 
C-Programm, was auf dem 8051 kompakten Code erzeugt, tut es auch auf dem 
AVR.

In der Regel ist der Codezuwachs C gegenüber ASM etwa 5..10%, in 
Ausnahmefällen können es auch mal bis zu 50% sein. Es ist also nicht der 
Rede wert.
Das gilt natürlich nur für Assembler-Profis. Ein Assembler-Anfänger 
erzeugt in der Regel größeren Code, als in C.

Bei meinem ersten Assembler-Programm, was ich 1:1 nach C umgeschrieben 
hatte, wurde das Binary auch etwas kleiner (der Quelltext natürlich 
sowieso).

von M. N. (Gast)


Lesenswert?

Jan K. schrieb:
> Es handelt sich um einen stm32f103, der ja bekannterweise schon etwas
> power hat. Natürlich macht es keinen Sinn, die Ressourcen sinnfrei zu
> verschwenden, aber brach liegen lassen bringt doch auch nix. Ihr sagt
> doch auch immer man soll zB Speicher verwenden wenn er da ist....

Dann programmiere so, wie Du es gelernt hast und kannst.

Viele o.g. Ratschläge resultieren aus einer Zeit, wo es nur Controller 
mit minimalem RAM und externem EPROM gab. Ein C-Compiler war schon Luxus 
und an C++ nicht zu denken. Manche Controller hatten nicht einmal einen 
Stack.
Da Du diese garnicht einsetzen willst, nutzen Dir diese Ratschläge auch 
nichts.

Wenn Du printf() verwenden möchtest, dann mach es einfach. Das gleiche 
gilt für float- oder double-Variablen.

Assembler für einen Cortex-M3 zu erlernen würde ich mir solange 
verkneifen, bis es unvermeidlich werden sollte. Ein optimierender 
Compiler würfelt den Code vielfach so durcheinander, dass er nur noch 
schwer zu durchschauen ist.

Wenn Du mit dem STM32f3.. an Leistungsgrenzen stößt, kannst Du 
problemlos auf einen STM32F4.. umsteigen.

Meine Meinung.

von Martin V. (oldmax)


Lesenswert?

Hi
Ich muss da einfach noch einen draufsetzen....
Peter Dannegger schrieb:
> Da dieser Thread nun zu ASM vs C abgedriftet ist.
>
> Es ist schon von Vorteil, wenn man das Listing lesen kann, das der
> Compiler erzeugt.
> Aber ASM möchte ich nicht mehr programmieren müsen, es kostet einfach
> viel zuviel Zeit, d.h. ich würde meinen Auftraggeber bestehlen.
>
Ich kann ja nix dafür, das mein Auftraggeber halt  (fast) nix anderes 
als ASM kann und mir vorschreibt, wie die kleinen schwarzen Dinger zu 
programmieren sind. Sicherlich stehle ich ihm viel Zeit... aber die 
Alternative wäre Schwimmbad und Enkel und nix mehr mit Programm.
 Nee klar, ich kann schon was dafür, denn ich bin mein eigener 
Auftraggeber und nur zu faul, endlich mit C anzufangen. Ich glaub, ich 
werd es im Rest meines Lebens auch nich mehr lernen, geschweige denn, 
begreifen. Das heißt aber nich, ihr sollt jetzt wieder mit ASM anfangen, 
damit ich euch verstehen kann. Wenn ich mir große Mühe gebe, kann ich 
auch ein C Programm lesen. ( Verstehen ist da wieder etwas anderes..)
Aber warum schreib ich das ? Einmal, weil es mir Spaß macht, die 
eingefleischten ASM - Hasser zu ärgen und zum Anderen, was vielleicht 
auch ein Kernpunkt ist:
Wir alle haben unsere Vorlieben in irgendeiner Sprache. Was die 
Controller angeht, da bin ich sowieso nur Hobbymäßig unterwegs und nur 
ein ganz klein wenig beruflich. Was PC's betrifft, da gibt's schon eine 
kleine Auswahl und beruflich, da bin ich wieder an das große "S" 
gebunden. Die Vorliebe darf aber nicht soweit gehen, das ich darin die 
Berufung sehe, in irgendeiner Sprache missionarisch auf dem Weg zu sein.
Nun ist es aber meinerseits auch gut.
Gruß oldmax

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Zu diesem schönen Flamewar gibts nur eines zu sagen:
Diskussionen im Internet sind wie die Paralympics.
Du kannst zwar gewinnen aber bist dennoch immernoch behindert!

Ansonsten gibts eben nicht einen Schraubendreher für alle Schrauben, 
sondern jede Anwendung braucht sein Werkzeug.
Wobei Assembler für "Die Schraube mit dem Daumennagel reindrehen" steht 
:)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Martin Vogel schrieb:
> die eingefleischten ASM - Hasser zu ärgen

Du verkennst uns.  Wir sind keine „eingefleischten ASM - Hasser“. Wir
haben nur auch alle unsere Erfahrungen gesammelt.  Ich habe noch
Assemblercode für eine PDP-11 geschrieben, da hat mir der damalige
Leiter des Rechenzentrums gesagt, dass er sich das nicht mehr antun
würde.  Ich habe seine Meinung nicht geteilt, aber ihn verstanden:
er hatte das Bibliotheks-Buchungs-System der TU Dresden für einen
ESER-Großrechner in Maschinencode programmiert, das war gewissermaßen
seine Jugendsünde. ;-)  „Maschinencode“ heißt dabei: mit der Hand
assemblieren.  Ein Blatt Papier, auf das man rechts den symbolischen
Code schrieb und links dann den zugehörigen Maschinencode.

Vermutlich war die Unibibliothek der TU Dresden damit eine zeitlang
die modernste Bibliothek der DDR :), aber er hatte danach eben keine
Lust mehr, selbst Assembler anzufassen.

Ich habe das BIOS für mein CP/M selbst in Assembler geschrieben, ein
dicker Stapel Papier, wenn man es ausdruckt (einschließlich eines
Floppytreibers).  Als ich die Ansteuerung für den EPROMmer geschrieben
habe, war ich bereits heilfroh, dass ich das in Turbo-Pascal machen
konnte: in Assembler hätte ich schon einfach nicht mehr die Zeit dafür
gehabt, und der Bedienkomfort wäre um vieles geringer geworden.  So
habe ich den Prototypen komplett in Pascal gezimmert und dann die
zeitkritische innere Schleife als inline-Assemblercode (genauer: das
war eigentlich purer Maschinencode) umgeschrieben.  Damit war das Ding
dann sowohl schnell als auch komfortabel.

Ich habe eine Ansteuerung für drei völlig verschiede Matrixtastaturen
in Z8-Assembler gezimmert, wobei ich einen Modul mit ifdef für die
drei verschiedenen Zieltastaturen gebaut habe (der KBD-Controller
wurde dreimal gebaut, noch für zwei Kollegen).  Ähnliches für die
Steuerung einer elektromechanischen Schreibmaschine per RS-232.  Ich
weiß heute nicht mehr, welche Schmerzen es waren, das zu debuggen,
aber das Zeug funktionierte am Ende. ;-)

Mittlerweile (naja, seit reichlich 10 Jahren, als ich dann mal wieder
nach längerer Pause mit Controllern angefangen habe) bin ich nun an
der gleichen Stelle wie damals besagter Leiter unseres Rechenzentrums:
mir ist meine Lebenszeit einfach zu schade, sie noch mit
Assemblerprogrammierung zu verbrennen.

Ich bin mir sicher, dass dir Peter oder Karl-Heinz ähnliche Anekdoten
berichten können.

von Andreas (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> das war gewissermaßen
> seine Jugendsünde. ;-)  „Maschinencode“ heißt dabei: mit der Hand
> assemblieren.  Ein Blatt Papier, auf das man rechts den symbolischen
> Code schrieb und links dann den zugehörigen Maschinencode.

Auf diese Weise habe ich mal ein Terminalprogramm für den Apple ][ 
geschrieben, das VT100-Kompatibel war, damit man damit per serieller 
Leitung auf Vaxen und PDP-11 arbeiten konnte.
"Jungendsünde" ist der richtige Ausdruck dafür. ;)

von Embedded (Gast)


Lesenswert?

Moby schrieb:
> Mit entsprechend Können, Lust und Leidenschaft und viel Zeit gerne viele
> Tausend. Gerade letztere ist ja das Privileg des Hobbyprogrammierers :-)

Als Hobbybastler kannst du natürlich gerne deine Anforderungen so 
definieren, dass sie zu deiner Arbeitsweise passt. Was sich damit nicht 
realisieren lässt, lässt du einfach bleiben. Für ein Hobby ist das ja 
ok.

Bei Profis läuft das aber so nicht. Da gibt es eben eine Forderung, dass 
dein Algorithmus auch in einer SystemC-Umgebung läuft. Oder man 
verschiedene Geräteklassen mit den unterschiedlichsten Architekturen 
unterstützen musst. Oder der Code zukünftsfähig sein soll, also auch 
noch auf der übernächsten Gerätegeneration läuft. Da kommst du mit 
AVR-Assemblercode nicht weit.

Außerdem muss der Code wartbar sein. Das kann dir als Hobbybastler egal 
sein, weil sich sowieso kein Mensch für deinen Code interessiert. Der 
Code eines Profis wird aber immer von anderen Menschen gelesen, sei es 
im Review, beim Test, bei der TÜV-Zertifizierung oder bei der 
Produktpflege. Da musst du schon sehr viele gute Gründe haben, um 
überhaupt noch mit Assemblercode durchzukommen.

von MaWin (Gast)


Lesenswert?

> Da kommst du mit AVR-Assemblercode nicht weit.

Ebenso kann kommerziell die Anforderung bestehen,
dass du den Holtek Prozessor verwenden musst weil
nur er mit der Versorgungsspannung die LCD treiben
kann zu dem Preis den man benötigt,
da kommst du mit reuse von C++ Klassen nicht weit,
und dann muss man sich eben mit kranker Assembler-
sprache das Ding auf das letzte Byte ausknautschen.

Und 10000 EUR mehr Entwicklungskosten spielen keine
Rolle weil das Ding millionenfach verkauft wird, nur
zuverlässig funktionieren muss es.

von Embedded (Gast)


Lesenswert?

Und was glaubst du wohl ist heutzutage (vor allem in Deutschland) die 
exotischere Anwendung? Wir leben in einer Welt, in der 
32-Bit-Prozessoren für unter 50 Cent zu haben sind. Da ist nicht mehr 
viel Luft für hoch optimierten Assemblercode.

von W.S. (Gast)


Lesenswert?

Ach ihr Glaubenskrieger!

Diesen Satz halte ich in diesem Thread für den besten:
Martin Wende schrieb:
> Du kannst zwar gewinnen aber bist dennoch immernoch behindert!


Jan K. schrieb:
> Ich habe eigentlich C++
> 'gelernt' (sprich in der UNI ein paar Semester programmiert),
...
> In C (gerade im embedded Bereich) scheint das völlig anders zu sein.

Tja, erstens ist es im realen Leben eben anders als in der akademischen 
Lehre und zweitens ist es auf DEN Mikrocontrollern auch anders als auf 
PC's, Mainframes und dergleichen.

Ich halte gar nichts davon, zu Ehren der reinen Lehre krampfhaft sich zu 
bemühen, mit Get- und Set- Funktionen irgendwelchen Kapselungs-Ideen 
nachzurennen. Aber auch das Gegenteil mit einem Sack globaler Variablen 
(so in der Form
#include all_my_project_variables.h
ist keine wirklich gute Lösung. Mit sowas ähnlichem hatte wohl fast 
jeder irgendwann in seinem Leben mal angefangen - man darf bloß nicht 
auf diesem Niveau steckenbleiben.

Irgendwo dazwischen ist die sinnvollste Stelle.

Ich halte es mittlerweile so, daß ich in allen Dingen versuche, das 
Gesamtprojekt zu modularisieren - so, daß in den Headerdateien der 
einzelnen Module nur das drinsteht, was die aufrufenden Programmteile 
auch wirklich benötigen und nicht mehr. Das führt letztendlich von 
selbst zu einer Art Abstraktion des Ganzen und zu dem, was hier als 
"Kapselung" gepriesen wird - ohne daß man sich in albernem 
"Ich_mach_jetzt_Kapselung" ergehen müßte.

Aber eines muß man all den tollen Wartbarkeits- und 
Wiederverwendungs-Aposteln sagen: Es ist nicht weit her damit, egal wie 
man sich bemüht. Oftmals ist ein komplettes Neuschreiben selbst eigenen 
Codes sachlich notwendig. Ich hab das gesehen an meinen eigenen 
Produkten: im Laufe der Zeit hab ich von einer µC-Architektur zur 
nächsten gewechselt ohne_ die Gerätefirmware _deshalb großartig 
umschreiben zu müssen (lediglich die allerunterste Treiberschicht), aber 
für neuere Technologien ist alter Code schlichtweg nicht mehr brauchbar, 
auffälligstes Beispiel sind Menüsysteme, die bei alten und kleinen µC 
mit Alpha-LCD dran eben ganz andere Paradigmen hatten als jetzt, wo man 
den Kunden mit bunten grafischen UI's kommen muß - obwohl die 
eigentliche Nutzfunktion des Gerätes im Grunde dieselbe geblieben ist. 
Von z.B. ner Personenwaage will man das Gewicht ablesen und sachlich ist 
es schnurz, ob das per 7 Segment LED oder buntem QVGA erfolgt. Was also 
ist der Code für das alte Alpha-Menü noch wert angesichts des bunten 
TFT's? Klar: garnichts. Und so geht es in ganz vielen Fällen.

Naja, und der Streit zwischen Assembler und Hochsprachen ist albern. 
Selbstverständlich ist gekonnte Assemblerprogrammierung auch heutzutage 
noch sehr notwendig - aber eben nicht für jeden Karlheinz oder Jörg, 
sondern für eben die Leute, die z.B. die Bibliotheksfunktionen 
schreiben, die dann vom Compiler für Karlheinzens und Jörgs in 
Geschreibsel in den Code eingebaut werden. Auch für die eigentlichen 
Kernroutinen von digitaler Signalverarbeitung (Cortex M4 und so) ist 
immer noch Assembler das Angesagte. Es ist also immer kein Entweder Oder 
sondern immer noch ein Sowohl Als Auch.

W.S.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

W.S. schrieb:
> aber eben nicht für jeden Karlheinz oder Jörg, sondern für eben die
> Leute, die z.B. die Bibliotheksfunktionen schreiben

Ah ja. :-)

von holger (Gast)


Lesenswert?

>> aber eben nicht für jeden Karlheinz oder Jörg, sondern für eben die
>> Leute, die z.B. die Bibliotheksfunktionen schreiben
>
>Ah ja. :-)

Ich denke den versteht W.S. nicht;)

von 21 century (Gast)


Lesenswert?

MaWin schrieb:
>> Das ist deine Definition von optimal.
>
> Nein, das IST die Definition von optimal.
> Und daran ändert sich auch nicht, auch nicht weil du es willst, auch
> nicht in 30-40 Jahren. Optimal bleibt optimal.
> Höre spassenhalber mal in eine Informatik-Vorlesung rein, es reicht das
> erste Semester, Algorithmen & Datenstrukturen.
>
>> Das ist aber nicht die übliche Definition in einem kommerziellen
>> Umfeld. Da ist optimal in allererster Linie "wartbar".
>
> Was du definierst, ist "billig".
> Das hört man im BWL Studium.

ich bin so froh, wenn du und dein dogmatischer blödsinn endlich 
ausstirbst.  es gibt keine allgemeingültige definition von optimal. und 
mit leuten wie dir würden wir heute noch alle in der erde wühlen.

von MaWin (Gast)


Lesenswert?

Armer Irrer. Aber es erklärt, warum die (vor allem Software-) Produkte 
derzeit qualitativ so schlecht sind. Wann bist du geboren? In der 
Null-Bock Generation?

von MCP (Gast)


Lesenswert?

MaWin schrieb:
> Armer Irrer. Aber es erklärt, warum die (vor allem Software-)
> Produkte
> derzeit qualitativ so schlecht sind. Wann bist du geboren? In der
> Null-Bock Generation?

sprachs aus der Make-Love-And-LSD-Generation..

SCNR

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Falls Jan K. noch spezifische Fragen hat möge er bitte einen neue Thread 
eröffnen, hier kommt denke ich nichts mehr rum was mit dem 
ursprünglichem Thema zu tun hätte.

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.