Forum: Mikrocontroller und Digitale Elektronik Embedded C - Firmware Umbau


von No N. (pascee)


Lesenswert?

Hallo zusammen,

ich freue mich auf eure Ideen und Anregungen.

Es ist eine Firmware (Embedded C) gegeben, an der schon etwas länger 
entwickelt wird.
Das Target ist eine MCU ARM Cortex-M3.
Die Firmware beinhaltet derweil ca. 90 Komponenten und setzt auf ein 
proprietäres OS auf. Wobei ich das nicht als OS bezeichnen würde, 
sondern vielmehr ein Prinzip welches durch nachgeführte Funktionalitäten 
(Queues, Mailbox etc.) aufgepimpt wurde.

Diese Firmware oder auch Software Architektur ist nun sehr anfällig bei 
Erweiterungen. Probleme wie nicht offensichtliche Abhängigkeiten, 
schwere Lesbarkeit tun ihr übriges.

Ich würde gerne die gegebene Software Architektur umstrukturieren bzw. 
umbauen (refactorn). Mir ist bewusst, das sowas nicht über Nacht 
erreicht werden kann.
Jedoch frage ich mich, wie ihr Anfangen würdet etwas Struktur 
reinzubringen bzw. ob es nicht Sinn macht eine neue Architektur 
aufzusetzen und den größten Teil neu zu entwickeln?

Es fehlt an:
Coding - Richtlinien
Nicht alle Requirements sind vorhanden
Dokumentation

Wie würdet ihr dabei vorgehen?
Ich bin gespannt auf euren Input.

Viele Grüße

von Morty S. (Gast)


Lesenswert?

> Es fehlt an:
> Nicht alle Requirements sind vorhanden

> Wie würdet ihr dabei vorgehen?

Also es wurde Software erstellt, ohne das klar ist was diese machen 
soll?

Dann sollte man mal Schadensersatzansprüchen gegenüber Programmierer und 
Projektmanager prüfen.

Ansonsten das übliche Vorgehen; erst festhalten was das Ding tun soll 
(Requirements), diese dann freigeben und dann an die Implementierung 
gehen.

Was bisher hingecodet wurde kann man vielleicht in Teilen als "proof of 
concept" ansehen, ansonsten ist es für die Tonne.

Ach ja, hier braucht es sicher neue, gut kehrende Besen ...

von Oliver S. (oliverso)


Lesenswert?

No N. schrieb:
> Ich würde gerne die gegebene Software Architektur umstrukturieren bzw.
> umbauen

Bist du auch derjenige, der dafür das Budget und die benötigten 
Ressourcen genehmigt? Wenn nicht, vergiss es. Da bleibt dann nur das 
Prinzip Hoffnung, daß der ganze Schxx nicht komplett hochgeht, bevor du 
eine neue Stelle gefunden/die Rente erreicht hast.

Oliver

von Lotta  . (mercedes)


Lesenswert?

Von Vorn anfangen.

Und zwar mit nem richtigen RTOS.
Dann kannst Du auf ne Grundlage bauen,
die Profis gelegt haben.
Wenn dann Fehler auftreten, warst Du es und nicht das RTOS. :-P

Ich würd kein C nehmen, sonder EC++, also
embedded C++, auch wenn du keine dynamischen Objekte
benutzt ist C++ durch seine festere Typensicherheit,
Überlagerungsmöglichkeit von Funktionen, Inline u.s.w.
die bessere Wahl.


mfg

von Michael (Firma: HW Entwicklung) (mkn)


Lesenswert?

Lotta  . schrieb:
> Von Vorn anfangen.
> Und zwar mit nem richtigen RTOS

Und da wir die Anforderungen nicht kennen, in die Begrenzungen des RTOS 
laufen, was zu neuem Gefriggel und halbgaren Lösungen führt, bei denen 
dann nach weiteren endlosen Monaten die Frage gestellt wird ob man mit 
einem proprietären 'OS' nicht besser fahren würde.

Ein Fall für einen SW Architekten, nicht für den Code Monkey und auch 
nicht für das mc.net Forum.
Nach einer soliden Zeit und Kostenrechnung wünsche ich dem der das dem 
Chef vorschlägt robuste Nerven.

'Wir haben all Dein Geld verbrannt, haben uns im Dickicht verloren und 
möchten nun mit neuem Geld nochmal das gleiche tun' findet der bestimmt 
ganz toll.

von Oliver S. (oliverso)


Lesenswert?

Michael schrieb:
> 'Wir haben all Dein Geld verbrannt, haben uns im Dickicht verloren und
> möchten nun mit neuem Geld nochmal das gleiche tun' findet der bestimmt
> ganz toll.

Vor allem, weil so eine Neuentwicklung ja parallel zum laufenden 
Geschäft geschieht, und schnell mal ein paar Mannjahre verballert, bevor 
da überhaupt was einsatzfähiges zu Stande kommt.

Bei der Art der Frage dazu dann noch ohne jede Garantie, daß es danach 
besser wartbar/schneller/billiger werden oder überhaupt irgendwie einen 
Vorteil haben wird, und nicht nur eine neue völlig verkorkste Bastelware 
dabei herauskommt, bei der dann zusätzlich noch die Lizenzkosten für das 
RTOS anfallen.

Oliver

von Monk (roehrmond)


Lesenswert?

No N. schrieb:
> Jedoch frage ich mich, wie ihr Anfangen würdet etwas Struktur
> reinzubringen bzw. ob es nicht Sinn macht eine neue Architektur
> aufzusetzen und den größten Teil neu zu entwickeln?

Zuerst solltest du dafür sorgen, dass alle Funktionen dokumentiert sind 
und ein Testautomat (oder manuelle Testprozedur) bereit steht, der nach 
dem Umbau bestätigt, dass die neue Firmware immer noch alle 
Anforderungen erfüllt.

Der Aufwand dafür ist meist viel größer, als die Arbeit am Quelltext.

: Bearbeitet durch User
von Bruno V. (bruno_v)


Lesenswert?

No N. schrieb:
> Jedoch frage ich mich, wie ihr Anfangen würdet etwas Struktur
> reinzubringen
das jetzige und seine Randbedingungen verstehen

> bzw. ob es nicht Sinn macht eine neue Architektur
> aufzusetzen und den größten Teil neu zu entwickeln?
Das ist immer der einfachere Ansatz. Zumindest als bezahlter Entwickler.


> Es fehlt an:
> Coding - Richtlinien
Hier ist zu unterscheiden, ob keine erkennbar ist: Oft gibt es ein oder 
zwei "Handschriften", die relativ problemlos niedergeschrieben werden 
können. Manchmal auch eine "Leithandschrift" und nur einzelne Module mit 
anderer.

Das einfachste ist nun, sich eine gute Codier-Richtlinie auszudenken und 
den Code dahin zu refakturieren. Widerstehe dem!

> Nicht alle Requirements sind vorhanden
> Dokumentation
sind es nie. Die Vorstellung, dass zu irgendeiner erfolgreichen SW einer 
kleinen bis mittleren Firma explizite Requirements oder Doku existieren, 
aus denen ein SW-Team das neu entwickeln könnte, sind Fantasien.

Ergänze und korrigiere, wo notwendig. Meist tust Du es nur für Dich!

> Wie würdet ihr dabei vorgehen?
Incrementell: Wenn Du in einer anderen Firma so eine FW schon 
eigenständig entwickelt und gewartet hättest, würdest Du hier nicht 
fragen. Daher nehme ich an, Du bist jung, motiviert und smart, aber auch 
unerfahren.

Mach Dich mit gängigen Paradigmen eine FW vertraut und verstehe deren 
Vor und Nachteile. Dann vergleiche mit der FW vor Dir.

Zu Anfang eher offensichtliche Abweichungen eliminieren (Beispiel: Wenn 
es eine gute Art gibt, ein Bit zu setzen, und davon grundlos 10x 
abgewichen wird, dann baue die 10 Stellen um).

Widerstehe dem Versuch, dem Code stattdessen Deine Handschrift 
aufzudrücken.

Oft wird der Job des Entwicklers von dem stümperhaften Code bezahlt, den 
sein Vor-Vorgänger oder der Firmenchef zusammenghackt haben.

Wenn es vor einer SW-Entwicklung Requirements, Coderichtlinien etc. gab, 
dann weil es das Dritte Projekt ist und alle sowieso wissen, wie es 
geht.

Die Vorstellung, dass Linux oder FB auch am Reisbrett hätten entstehen 
können mit Requirements und Doku vorweg und dann Umsetzung durch 
Programmierer, ist weltfremd.

: Bearbeitet durch User
von Lotta  . (mercedes)


Lesenswert?

Geil, @Bruno!

> Zu Anfang eher offensichtliche Abweichungen eliminieren (Beispiel: Wenn
> es eine gute Art gibt, ein Bit zu setzen, und davon grundlos 10x
> abgewichen wird, dann baue die 10 Stellen um).

Deshalb muß die Bitsetzerei ja zum Beispiel auch in ne
Inline-Funktion (also doch EC++ :-P) oder in ein Makro,
das dann im gesamten Projekt benutzt wird.

Aber, @bruno, wie würdest Du nun vorgehen, wenn schon
das benutzte RTOS Frickelware ist?

mfg

von Bruno V. (bruno_v)


Lesenswert?

Lotta  . schrieb:
> Deshalb muß die Bitsetzerei ja ...

ich kenne den Code nicht, würde daher auch keine konkreten Tips geben.

> Aber, @bruno, wie würdest Du nun vorgehen, wenn schon
> das benutzte RTOS Frickelware ist?
Das RTOS ist "proprietär" und durch Queues und Mailboxen "aufgepimpt". 
Das ist für mich noch kein Indiz für Frickelware. Ich glaube zu jedem OS 
gibt es Firmen, die eigene Queues oder Mailboxen gebaut haben, weil 
irgendwas nicht passt. Angefangen bei der Definition des Speichers.

von Lotta  . (mercedes)


Lesenswert?

Da muß wohl oder übel auch die Handschrift verbessert werden.. :-O
TO,
Eure Möglichleit:

Detailliertes Pflichtenheft verwenden,
damit das nötige RTOS von Anfang an festgelegt werden kann.

Firmenstandard(s) schaffen, wie wird der Quelltext formatiert?
IDE für alle Progger einheitlich einrichten.
Polnische Notation in allen Objekten, Variablen und Funktionen
einführen.
Wenn möglich mit Namespaces arbeiten.
Jedes Objekt, Modul oder Funktion bekommt ein eigenes
CPP / H - Dateipaar.
KOMMENTIEREN!!
Wenn keine Objekte / Klasen verwendet werden,
dateiprivate Funktionen statisch anlegen,
in den Header gehört nur die Schnittstelle.
Jede Funktion bekommt ein Review und wird danach in ne
Bibliothek compiliert.
Weil ja alles "getestet" ist (naja... ;-P) braucht man sich
dann nun testmäßig "nur" um die Hauptschleife zu kümmern. :-))))

Achja:
Wenn mehere Projekte mit dem gleichen Prozzi anstehen,
ist das richtige RTOS plus deine wachsende Bibliothek ne
Goldgrube!

Ich danke meinen Ellis, Philippe Kahn und nicht zuletzt
unserer geilen Weide für die Vorarbeit, das ich so einem
geilen Hobby frönen kann!

mfg

von Xanthippos (xanthippos)


Lesenswert?

Hatte mehrere verkorkste Projekte redesigned. Da musst du zuerst mal 
einen Haufen Arbeit reinstecken, den dir niemand bezahlt.

Zuerst alle Anforderungen rekonstruieren. Vor allen die Anforderungen, 
die sich nicht realisieren lassen. Musst rumlaufen, alle Leute fragen.

Denn musst du dich in ein Dutzend Architekturen einarbeiten und die 
besten Ideen kombinieren.

Ein überzeugendes Konzept ausarbeiten ist langweilige Bürokratie - 
tagelang überprüfen, ob eine Idee alle Anforderungen erfüllt. Wegwerfen 
und die nächste Idee überprüfen.

Wenn du nach Wochen meinst, so ist es ideal - ein kompaktes Schaubild 
der Architektur zusammenstellen. Und eine Liste, mit der du zeigst, wie 
einfach sich die Anforderungen in der neuen Architektur realisieren 
lassen.

Damit überzeugt du dann 2-3 Entwickler. Erst danach könnt ihr ein Budget 
für das Redesign beantragen.

von Xanthippos (xanthippos)


Lesenswert?

P.S. Seit Scrum ist Architekturen ausarbeiten eine Sisyphos Arbeit. 
Bringt keinen Spaß mehr.

Kommen ja dauernd neue Anforderungen rein. Eigentlich müsstest du da 
jedes mal überprüfen, ob die Architektur noch zu den Anforderungen 
passt, ob größere Umstrukturierungen erforderlich sind.

Statt dessen wird in einem Sprint der erstbeste Schnellschuss dran 
gefrickelt und nach 2 Jahren ist deine mühsam ausgearbeitete Architektur 
genau so geschreddert wie euer heutiges Programm.

von Morty S. (Gast)


Lesenswert?

> Die Vorstellung, dass Linux oder FB auch am Reisbrett hätten entstehen
> können mit Requirements und Doku vorweg und dann Umsetzung durch
> Programmierer, ist weltfremd.

Linux ist aber quasi am Reißbrett nach exakten Vorgaben entstanden.
Die API-Schnittstellen wurden exakt nach den AT&T Vorgaben im 
POSIX-Standard geschrieben und nicht zuletzt "bediente" sich Linus 
heftig an Minix, ein Open Source Operatingssystem aus dem Universitären 
Bereich.

Und Linux bringt Bücherweise Dokumantation und Styleguides mit, wenn die 
auch von manchen Codieräffchen ignoriert werden. 
https://linux-kernel-labs.github.io/refs/heads/master/lectures/intro.html

Wenn man nach Beispielen für hingefrickelte OS ohne fundierte 
Vorüberlegungen sucht, wird man höchstens in der Müllhalde der bei 
Version 0.1 prealpha abgestorbenen Versuche "fündig".

von Bruno V. (bruno_v)


Lesenswert?

Morty S. schrieb:
> Linux ist aber quasi am Reißbrett nach exakten Vorgaben entstanden.
> Die API-Schnittstellen wurden exakt nach den AT&T Vorgaben im
> POSIX-Standard geschrieben

Sich an Standards zu halten ist immer gut. Deine Aspekte sind das, was 
ich auch geschrieben habe:

Bruno V. schrieb:
> Wenn es vor einer SW-Entwicklung Requirements, Coderichtlinien etc. gab,
> dann weil es das Dritte Projekt ist und alle sowieso wissen, wie es
> geht.

Heute vergessen wir, das Linux 2 Eltern hatte, die Unix "frei" machten. 
Neben Linus noch Richard, der alle Vorarbeit geleistet hat und der den 
Kernel am Reißbrett festlegen wollte. Und den deshalb heute keiner mehr 
kennt.

(Anmerkung: Falls der TO das Budget zur Neuentwicklung bekommt, führt 
diesmal am Reißbrett natürlich kein Weg vorbei. Die Chance auf Erfolg 
von Budget UND Ergebnis ist aber gering)

: Bearbeitet durch User
von Morty S. (Gast)


Lesenswert?

> (Anmerkung: Falls der TO das Budget zur Neuentwicklung bekommt, führt
> diesmal am Reißbrett natürlich kein Weg vorbei. Die Chance auf Erfolg
> von Budget UND Ergebnis ist aber gering)
Nope, es ist sehr wahrscheinlich das man, falls man mit sauberen Konzept 
startet, etliches an Qualität (Stabilität) gewinnt und einiges an 
Ressourcen (Budget) einspart. Denn, "Eine Stunde programmieren spart 5 
Minuten nachdenken".

--
> Die Firmware beinhaltet derweil ca. 90 Komponenten

> Diese Firmware oder auch Software Architektur ist nun sehr anfällig bei
> Erweiterungen. Probleme wie nicht offensichtliche Abhängigkeiten,

Naja, da gibt es drei einfache Prinzipien mit dennen man das bändigt, 
Datenkapselung, "Divide et impera" und EVA-Prinzip.

Also schau dir anhand der Systembeschreibung/Requirement an, wo die 
Daten in das System hinEinfließen, wo hinAus und daraus ergibt sich wie 
die daten zwischen Ein- und Ausgabe Verarbeitet werden (müßen). Und 
damit man später nicht von einem Monolithen erschlagen wird, teilt man 
das in einzelne Subblöcke in denen man die (internen) Variablen kapselt 
(Keine globalen Variablen). Und diese Einteilung erreicht man durch 
Definition von Schnittstellen/Interface, die man möglichst innerhalb 
einer Funktionsgruppe standardisiert.

Also gibt es beispielsweise ein Interface zum Sensor über die das 
Hauptprogramm kommuniziert (konfiguration, lesen) , ein Interface zum 
Aktor (Motor) (Start/Stop, Zustand abfragen, "konfigurieren").

Das sollte man IMHO erst ohne Blick in das (bereits implementierte) 
Code-Monster machen, um sich eine Vorstellung zu bilden, was die 
eigentliche Aufgabe der Software hier ist. Wenn das Konzept 
steht,(Systembeschreibung, Systempartionierung, Interface, interne 
Datenstrukturen) dann kann man in den Code schauen, was man dort 
vorfindet. Vielleicht muss man das Architekturkonzept geringfügig 
erweitern, aber die eigentliche Aufgabe ist es, den Code entsprechend 
des Konzeptes/Requirements zu schreiben und nicht umgekehrt.

von Harald K. (kirnbichler)


Lesenswert?

Morty S. schrieb:
> Also schau dir anhand der Systembeschreibung/Requirement an

In akademischen Kreisen kann man vom Vorhandensein einer ausführlichen 
Systembeschreibung und ausführlich aufgelisteten Requirements ausgehen.

In der harten Realität erbt man oft nur einen Haufen Dateien, die mit 
irgendeinem einem nicht unbedingt bekannten Entwicklungssystem genutzt 
wurden, um für ein Produkt, von dem man nur ein paar handgeschriebene 
Notizen findet, eine Firmware auszuwerfen.
Die Fertigung, die selbst anständige Fertigungsunterlagen hat (sauber 
dokumentierter Schaltplan etc.), braucht jetzt eine neue/überarbeitete 
Firmware, weil der verwendete µC durch einen nicht binärkompatiblen 
ersetzt werden muss, und das vom alten Entwickler gelieferte Binary 
nicht mehr funktioniert.

Der Entwickler, der den Kram bislang verbrochen hat, ist weg. Aus 
welchen Gründen auch immer.

von Monk (roehrmond)


Lesenswert?

Harald K. schrieb:
> Der Entwickler, der den Kram bislang verbrochen hat, ist weg. Aus
> welchen Gründen auch immer.

Vielleicht, weil er den Chef zu sehr damit genervt hat, mehr Zeit für 
eine ordentliche Struktur und das Erstellen der fehlenden Dokumentation 
zu bekommen.

Mir ging es jedenfalls in mehreren Firmen immer wieder so. Erst in der 
aktuellen Firma akzeptiert der Chef, dass Doku und Testen mehr kosten, 
als schnelles hin-sauen von Code.

: Bearbeitet durch User
von Lotta  . (mercedes)


Lesenswert?

Der Thread zeigt wieder einmal, was unser Andy hier für
kompetente Leute versammelt hat.
Respekt! :-O

Wie sollte der TO nun beginnen?

Wenn ich mich in fremden Quelltexten umschaue, benutze ich
ein UML- Programm oder ein altes Proggy von Siemens,
"Easycode / Easycase", das aus Quelltexten
Nassi-Shneiderman-Diagramme macht und umgekehrt.

Was benutzen Profis heut so? C-Lion?

mfg

von Xanthippos (xanthippos)


Lesenswert?

> Wie sollte der TO nun beginnen?

Kommt drauf an. Was ist das Ziel?

Den Quelltext in eine lesbare Form bringen und danach wieder 
unkoordiniert Anforderungen dranfrickeln bis die heutigen Probleme 
wieder zurück kommen?

Oder eine Vorgehensweise, mit der sich auch noch in ein paar Jahren 
Erweiterungswünsche umsetzen lassen?

> Was benutzen Profis heut so?

Üble Sache. Im Bauwesen gibt es unterschiedliche Arten von Profis. Die 
einen können Architekturen ausarbeiten. Die anderen können Statik 
berechnen. Noch andere können Bagger fahren... In der 
Softwareentwicklung gibt es nur mehr Profis für Codezeilen dranscrumeln. 
Gibt keine Profis für Anforderungslisten und Softwarearchitekturen.

von Lotta  . (mercedes)


Lesenswert?

Xanthippos schrieb:
>
>> Was benutzen Profis heut so?
>
> Üble Sache. Im Bauwesen gibt es unterschiedliche Arten von Profis. Die
> einen können Architekturen ausarbeiten. Die anderen können Statik
> berechnen. Noch andere können Bagger fahren... In der
> Softwareentwicklung gibt es nur mehr Profis für Codezeilen dranscrumeln.
> Gibt keine Profis für Anforderungslisten und Softwarearchitekturen.

Ich ahnte es, auch Embarcadero fängt in seinem C++-Builder
erst jetzt an auch an ein vernünftiges Testen und Refactoring
zu denken.
Und das auch noch mit Zuhilfenahme ner Fremdfirma, der "whole Tomato".

Also alles von Vorn Neumachen?
Da war doch UML mal "das Ding" in der Softwarearchitektur.
Ist der Rausch inzwischen vorbei?

mfg

von Xanthippos (xanthippos)


Lesenswert?

> Da war doch UML mal "das Ding"

Das geht komplett am Problem vorbei.

Willst du eine erweiterbare Architektur ausarbeiten hast 2 große 
Probleme.

Während Implementierung und Test kommen neue Anforderungen rein. 
Eigentlich müsstest du die Änderungswünsche voraussehen und deine 
Architektur für die unbekannten Anforderungen auslegen.

Bei dem Thema Firmware für MC gibt es schon 100 brauchbare Systeme. 
Willst du etwas konkurrenzfähiges entwickeln, musst du erst mal die 
guten Ideen und die Fehlentscheidungen aus den bestehenden Architekturen 
rekonstruieren. Das bezahlt dir keiner, musst du in deiner Freizeit 
machen.

Du musst zwar alte Anforderungen und Lösungsideen aus dem alten 
Quelltext rekonstruieren. Aber damit findest du nicht mal 1/100 der 
Anforderungen und Lösungen. Damit wird dein neues System auch nicht 
besser als das alte.

von Bruno V. (bruno_v)


Lesenswert?

Morty S. schrieb:
> Nope, es ist sehr wahrscheinlich das man, falls man mit sauberen Konzept
> startet, etliches an Qualität (Stabilität) gewinnt und einiges an
> Ressourcen (Budget) einspart. Denn, "Eine Stunde programmieren spart 5
> Minuten nachdenken".

Ich beziehe mich nur auf den TO. Die wenigen Informationen des TO (der 
sich ja schon verabschiedet hat), machen Szenarien wahrscheinlich, die 
eine Neuentwicklung schwierig machen.

Mir scheint es, dass der TO wenig Erfahrung (<5 Jahre) als bezahlter 
SW-Entwickler hat und auch erst 1-2 Jahre dabei ist (weil er sonst 
konkreter geworden wäre).

Wenn das Team klein ist, ist es oft auch das Budget und ein paar 
Mannjahre "zum schön machen" werden gar nicht erst bewilligt.

Wenn das Team größer ist (>=3 Leute am Trunk und >=5 weitere Leute), 
dann wird er sein Blaues Wunder erleben: Ein paar der Altgedienten 
wissen auf einmal sehr genau, wie man es richtig macht. Nur einigen oder 
Verantwortung übernehmen, das werden sie nicht.  (Das ist als "zweites 
System" bekannt)

von Monk (roehrmond)


Lesenswert?

Xanthippos schrieb:
> Gibt keine Profis für Anforderungslisten und Softwarearchitekturen.

Doch, die gibt es durchaus. Ich habe mut welchen arbeiten dürfen.

Lotta  . schrieb:
> Da war doch UML mal "das Ding" in der Softwarearchitektur.
> Ist der Rausch inzwischen vorbei?

UML ist nur eine Sprache für Diagramme. Man kann gute Diagramme auch 
ohne UML erstellen. ML nimmt einem diese Arbeit nicht ab. Was mir gar 
nicht gefällt: Aus UML heraus Code zu generieren oder umgekehrt. Das 
macht alles nur unmötig umständlich. Dadurch gewinnt man zwar 
vollständige Diagramme, aber so vollständig sind sie schnell zu komplex, 
unverständlich, und dadurch nutzlos. Dann sind mir hand gemalte Bilder, 
welche die gerade relevanten Zusammenhänge darstellen (in UML oder 
nicht) dreimal lieber.

: Bearbeitet durch User
von Bruno V. (bruno_v)


Lesenswert?

Lotta  . schrieb:
> Wie sollte der TO nun beginnen?

Sich andere Architekturen anschauen und deren Eigenschaften (Vor- und 
Nachteile) erforschen.

Das Ziel von jeglicher Programmiersprache ist es, mit möglichst großer 
Ausdruckskraft Probleme zu lösen. Das gleiche gilt für die in dieser 
Sprache verwendete Architektur, Namenssystem, Funktionen etc.

Jede Veränderung sollte die Ausdruckskraft steigern. Wenn 
Matlab/Simulink/Stateflow für Teilaspekte ausdrucksstärker ist, dann 
binde das ein. Wenn Codegeneratoren sinnvoll sind um Excel-Tabellen (die 
als Vorgabe reinkommen) in Code umzusetzen, dann mach das. Wenn die 
Variablen/Funktionen in der Programmiersprache auch der Fachsprache 
entsprechen können, dann nutze das (nichts ist schlimmer als unnötige 
Übersetzungen)

> Wenn ich mich in fremden Quelltexten umschaue, benutze ich
> ein UML- Programm oder ein altes Proggy von Siemens,
> "Easycode / Easycase", das aus Quelltexten
> Nassi-Shneiderman-Diagramme macht und umgekehrt.

Honestly: die Sprache fließend lernen und geeignete IDEs benutzen. Zum 
lernen und als Darstellung für nicht-Programmierer mag das wirklich gut 
sein. Wenn Du eine Architektur maßgeblich ändern willst, musst Du Code 
flüssig lesen können, d.h. insbesondere überfliegen können. Wenn der 
Code nicht das tut, was er vorgibt, nützen dir kein Tool was. Dann geht 
es ans eingemachte (Profiling, Debugger, Lint, ... )

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

No N. schrieb:
> Diese Firmware oder auch Software Architektur ist nun sehr anfällig bei
> Erweiterungen. Probleme wie nicht offensichtliche Abhängigkeiten,
> schwere Lesbarkeit tun ihr übriges.

Das klingt alles sehr ungut.
Das alte Programmgerüst muß es vertragen, daß man neue Funktionen 
konfliktfrei hinzufügen kann. Geht das nicht, muß man es komplett 
wegschmeißen und neu von vorne anfangen. Man ist in einer Sackgasse 
gelandet und mindestens einer weiß es sogar.

von No N. (pascee)


Lesenswert?

Wow ich bin überwältigt! Danke bis hierhin.



Bruno V. schrieb:
> Ich beziehe mich nur auf den TO. Die wenigen Informationen des TO (der
> sich ja schon verabschiedet hat), machen Szenarien wahrscheinlich, die
> eine Neuentwicklung schwierig machen.
Im Gegenteil. Ich verfolge die Diskussion zu jeder Zeit und denke dann 
erstmal nach. Ohne dir jetzt nahe treten zu wollen. Ich habe etwas 
länger wie fünf Jahre Softwareentwicklung auf dem Buckel, jedoch hatte 
ich es noch nie mit einem Refactoring dieser Größenordnung und solch 
vielfältigen Umständen gleichzeitig zu tun.




Zum Thema Budget und Zeit:
Beides ist genehmigt und man ist sich dessen bewusst, dass dies nicht 
auf einen Schlag funktionieren wird. Aktuell ist die Vorstellung das 
Refactoring inkrementell durchzuführen. Jedoch liegt hier mein Problem.
Es soll gleichzeitig ein Refactoring und die Weiterentwicklung 
geschehen.
Das Team nur für die Implementierung von Code umfasst ca. 15 Personen.

Zum Thema Prozess:
Auch dieser wird gerade im Unternehmen neu aufgestellt.
Es ist Ziel in Zukunft nach dem Prinzip des V-Modells zu Entwickeln. 
Angefangen bei den Requirements - Architektur - Implementierung. Testing 
mit eingeschlossen. Dabei wird in Zukunft bei der Architektur die 
Software möglichst per UML geplant, dennoch nicht extrahiert. Hier soll 
der Entwickler seine Kreativität ausleben dürfen, sich jedoch an die 
Vorgaben halten.

Meine Gedanken gerade:
1)
Eine Handschrift ist zu lesen. Auch gibt es eine Trennung von 
Hardware-Modulen, zu Anwendungsmodulen. Ich sage explizit 
Anwendungsmodule, weil eine Applikationsebene ebenfalls besteht, in der 
sich jedoch eine Haupt-Statemachine befindet. Jedes Anwendungsmodul 
ebenfalls nochmal eine.
Jedoch wüsste ich auf Anhieb nicht, zu welchem Typ ich die jetzige 
Architektur zuordnen würde.

2)
Es gibt ein Anwendungsmodul welches über 6500 Zeilen Code beinhaltet. 
Ein klassischer Monolith. Mir erschließt sich noch nicht, wie ich das 
trimmen soll. Allein die Statemachine besteht hier aus 2500 Zeilen. Auch 
ist es vorgekommen, dass der Developer selbst, nicht mehr den eigenen 
Code versteht. 🚨🚨🚨

3)
Der Code ist so aufgebaut, das sich verschiedene Varianten bauen lassen. 
Alles über #defines bzw. übers Makefile gesteuert. Man könnte anfangen, 
viele Funktionalitäten in Bibliotheken zu packen um daraus die Varianten 
zu bauen. Jedoch bedarf es auch hierfür zunächst einen riesen Umbau mit 
Anlehnung an eine neue Architektur-Idee.

4)
Oft findet man jedoch Entourage anti-pattern im Code, welches das 
zertrennen einzelner Module fast unmöglich macht bzw. auch das Testing, 
welches so in seiner Form hinfällig ist, da nicht einzelne 
Module/Komponenten getestet werden können, sondern nur eine Abfolge von 
Modulen im ganzen.

5)
Klassisches Beispiel bei der Fehlersuche:
Man geht den Code durch in einem Gedankenexperiment angefangen bei Modul 
A, welches eine Funktion von Modul B aufruft. Nun wird eine statisch 
definierte Variable aus Modul B in dieser Funktion abgefragt, welche 
aber an gefühlt 100 weiteren Stellen benutzt / gesetzt wird. Es ist also 
de facto nun unmöglich das Gedankenexperiment weiter durchzuspielen, da 
mir der Zustand bzw. der Wert nicht bekannt ist. Ich müsste nun mit 
Mutmaßungen, weiterdenken.
Kann man machen, jedoch ist das für mich ein Indiz dafür, das etwas 
gewaltig  stinkt 💩

Lotta  . schrieb:
> Wenn ich mich in fremden Quelltexten umschaue, benutze ich
> ein UML- Programm oder ein altes Proggy von Siemens,
> "Easycode / Easycase", das aus Quelltexten
> Nassi-Shneiderman-Diagramme macht und umgekehrt.

Tatsächlich habe ich bereits mit entsprechenden Tools aufgerüstet, 
welche in der Lage sind die Architektur zu durchleuchten und auch 
grafisch darzustellen. Auch hier zeigt sich im Grunde genommen schon ein 
Teil der Problematik. Es ist primär ein Top-Down Ansatz zu sehen , gibt 
es dann oft circular dependencies bzw einen mix aus Top-Down und 
Bottom-Up.

Bruno V. schrieb:
> Das RTOS ist "proprietär" und durch Queues und Mailboxen "aufgepimpt".
> Das ist für mich noch kein Indiz für Frickelware. Ich glaube zu jedem OS
> gibt es Firmen, die eigene Queues oder Mailboxen gebaut haben, weil
> irgendwas nicht passt. Angefangen bei der Definition des Speichers.

Exakt. Jedoch war dieses proprietäre OS niemals für solche Anforderungen 
gedacht, wie sie heute umgesetzt werden oder wurden. Dies hat letzten 
endes auch zu diesen Monolithen geführt. Da ich ja den Code im Detail 
kenne, bin ich der Auffassung, das sich viel weg optimieren ließe, würde 
man z.B. ein FreeRtos nutzen, welches viele features anbietet und 
dadurch workarounds erspart blieben würden.

: Bearbeitet durch User
von Bruno V. (bruno_v)


Lesenswert?

Vielen Dank für die Rückmeldung. Das klingt alles sehr vernünftig!

No N. schrieb:
> Es gibt ein Anwendungsmodul welches über 6500 Zeilen Code beinhaltet.
> Ein klassischer Monolith. Mir erschließt sich noch nicht, wie ich das
> trimmen soll. Allein die Statemachine besteht hier aus 2500 Zeilen. Auch
> ist es vorgekommen, dass der Developer selbst, nicht mehr den eigenen
> Code versteht. 🚨🚨🚨

Wenn das nur eines der 90 Module ist, dann sorge Dich nicht. Das wäre 
eine normale "Verteilung" bei Anwendungen mit mehreren 100 kLoC. Bei 15 
Programmieren findest Du Dreizeiler, wo der der Developer nicht weiß, 
was da passiert.

No N. schrieb:
> Der Code ist so aufgebaut, das sich verschiedene Varianten bauen lassen.
> Alles über #defines bzw. übers Makefile gesteuert.

Varianten im Sinne von USE_MODUL_A? Oder bestimmen #defines, ob in Modul 
A Sensor7 oder 8 verwendet wird oder Methode 4 statt 7.

Das erste kann man schnell umbauen, dass zweite klingt nach C und 
größeren Problemen. (Falls es C ist, solltest Du die Sprache nicht 
nennen :-)

No N. schrieb:
> da nicht einzelne  Module/Komponenten getestet werden können,
> sondern nur eine Abfolge von Modulen im ganzen.

Das kann Nachlässigkeit sein, oder (in autonomen Embedded Systemen) 
manchmal dem globalen Kontext (der physikalischen Welt) geschuldet sein.

No N. schrieb:
> Da ich ja den Code im Detail
> kenne, bin ich der Auffassung, das sich viel weg optimieren ließe, würde
> man z.B. ein FreeRtos nutzen, welches viele features anbietet und
> dadurch workarounds erspart blieben würden.

Kapsel die Workarounds so, wie Du es mit einem "richtigen" RTOS machen 
würdest. Dann steht dem Wechsel später nichts im Wege.

Wenn Du ein Ziel hast oder erkennen kannst, Nutze Wrapper, die so 
funktionieren als wäre das Ziel schon erreicht.

von Gustl B. (gustl_b)


Lesenswert?

Bruno V. schrieb:
> solltest Du die Sprache nicht nennen :-)

Wurde schon in der Überschrift genannt.

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.