Forum: Mikrocontroller und Digitale Elektronik C++ Code Generator for Embedded Applications


von Michael S. (msb)


Lesenswert?

Ich habe gute Erfahrungen mit generiertem Code gemacht, den ich meisst 
mit Python Scripten erzeuge. Wenn das Grundprinzip einmal validiert ist 
vermeidet das Fehler und spart viel Arbeitszeit. Mein "Meisterstück" ist 
ein Statemachine Generator, der aus einem Satz beliebig komplexer UML 
Diagramme plus ein paar Grunddefinitionen lauffähige und dabei gut 
aussehende C++ Klassen macht. Ich benutze das erfolgreich sowohl auf 
Linux, Windows und ARM7/M3/M4 oder PIC32 Microcontrollern.

Ich überlege einen Generator zu schreiben der für verschiedene uC 
komplette Programme in C++ (vielleicht optional auch C) erzeugen kann, 
von der Chip Initialisierung bis zur Anwendung, aber mit der Möglichkeit 
auch handkodierte Teile dazuzufügen.

Für die Anwendungsebene gäbe es ausser State Machines auch 
konfigurierbare handgeschriebene Module, die ein festgelegtes Interface 
haben und in sich getestet sind. Davon könnten über die Zeit viele 
verschiedene entstehen. Das ganze ist so aufgebaut, dass man die 
Funktion einzelner Anwendungsmodule, z.B. über ein Python Script  gut 
separat testen kann.

IO und Schnittstellen würden über ein GUI und/oder eine übersichtliche 
Konfigurationsdatei abstrakt eingestellt. Diese Einstellung und die 
Codeumsetzung basiert auf  prozessorspezifischen Parametern, in der die 
Möglichkeiten und das Procedere des jeweiligen Prozessors definiert 
sind.

Das ganze ist nicht als Spielerei gedacht, sondern um Production Quality 
Embedded Applications zu erzeugen.

Wie findet Ihr die Grundidee?
Würde sich da eine Community finden, die das als open source aktiv mit 
entwickelt?
Oder ist das eher etwas für ein kommerzielles Produkt?

von Nils (Gast)


Lesenswert?

Michael S1. schrieb:
> Mein "Meisterstück" ist
> ein Statemachine Generator, der aus einem Satz beliebig komplexer UML
> Diagramme plus ein paar Grunddefinitionem lauffähige und dabei gut
> aussehende C++ Klassen macht.

Es gibt doch genügend Tools, die das direkt machen ohne ein paar 
Grunddefinitionen ( was auch immer das ist ). Oder?

von Michael S. (msb)


Lesenswert?

Ich kenne kein wirklich gutes Tool. Habe damals lang recherchiert.

Kennst Du eines?

Die Grunddefinitionen stellen haupsächlich folgendes dar:
- die Verbindung zum IO System
- die Verbindung zu einer zentralen Parametrierung
- gemeinsame Speicherbereiche volatile, non-volatile
- Systemevents
- Abkürzungen um Diagramme kompakter und weniger redundant
  zu halten

von Blackbird (Gast)


Lesenswert?

Etwa so (ohne UML) wie das Simplicity Studio von Energy Micro für die 
EFM32-Controller?

State Machines, etc. sind Anwendungen, abhängig vom Können des 
Anwenders. Die kann man, muß man aber nicht verwenden.
Parametrierungen der Funktionseinheiten im Mikrocontroller sind dagegen 
Grundfunktionen, die auch jeder Anfänger braucht.

Dazwischen sollte man unterscheiden.


Blackbird

von Erik L. (erikl)


Lesenswert?

Hallo Michael,

Grundidee halte ich für gut, wir haben bei uns auch an diversen Stellen 
Codegeneratoren im Einsatz, das sind aber immer sehr spezialisierte 
Ecken.

Deine Gedanken zur Konfiguration halte ich auch für sinnvoll.

Ob sich hier eine Community zur Entwicklung zusammenfinden würde bin ich 
nicht ganz sicher kann mich da aber täuschen (Anwendungsanforderungen 
sind ja dann schnell unterschiedlich, das macht das Ding immer 
komplexer)

Ist in Deinen Augen der generierte Code zur Weiterpflege von Hand 
gedacht ?
Wenn nicht wäre zu überlegen, ob man nicht gleich C-Code generiert.
Wir haben damit weniger Probleme (wir verwenden verschiedene 
Target-Compiler, die machen C++ manchmal nur als Frontend vor dem 
C-Compiler)

Bei Code-Generator und Projekten mit großen Stückzahlen (automotive) 
stellt sich immer gleich die Frage "ist das immer richtig was generiert 
wird" und "(Software-Pflege): wenn ich eine kleine Änderung am Input 
mache, kommt ja gleich ganz anderer Code raus, dann muss ich alles noch 
mal testen"
Das schränkt den Einsatzbereich u.U. etwas ein.
(Ist aber nur die Brille durch die wir so was sehen ;-)) )

Nur ein paar Ideen von mir.

Gruß,
Erik

von Oliver S. (oliverso)


Lesenswert?

Michael S1. schrieb:
> Wie findet Ihr die Grundidee?
> Würde sich da eine Community finden, die das als open source aktiv mit
> entwickelt?

Ganz ehrlich: Da draussen tummeln sich 2 zillionen open-source-Projekte, 
99% davon dümpeln ohne jedes Interesse vor sich hin. Darunter durchaus 
sehr gute Ansätze für alles Mögliche, auch einige mehr oder weniger 
fertige Codegeneratoren.

Erfolgreiche Open-Source-Projekte fangen so an:
1
Hello everybody out there using minix - I’m doing a (free) operating system 
2
(just a hobby, won’t be big and professional like gnu) for 386(486) AT
3
 clones. This has been brewing since april, and is starting to get ready.

Der entscheidenede Teil ist "and is starting to get ready". Du musst da 
schon in Vorleistung gehen.

> Oder ist das eher etwas für ein kommerzielles Produkt?

Wenn du das alleine gewuppt bekommst. Sowas fängt normalerweise mit 
einer Markt- und Zielgruppenanalyse an.

Oliver

von Erik L. (erikl)


Lesenswert?

Hallo Oliver,

> Du musst da
> schon in Vorleistung gehen.

etwas hat Michael ja schon

> Wenn du das alleine gewuppt bekommst. Sowas fängt normalerweise mit
> einer Markt- und Zielgruppenanalyse an.

Markt- und Zielgruppenanalyse läuft doch hier gerade, oder ? ;-)


Gruß Erik

von Michael S. (msb)


Lesenswert?

Hallo Erik,
wir haben da eine ähnliche Brille was Testbarkeit angeht. Ich habe den 
Statemachine Generator bereits in komplexen Medizinprodukten eingesetzt 
mit Validierung des Generators und mit einem automatischen Test der 
einzelnen Module gegen die Requirements.
Der Code ist übersichtlich genug um Ihn manuell weiter zu pflegen, was 
wir in vereinzelten Fällen auch schon gemacht haben. Das ist aber zu 
vermeiden, da es eine Einbahnstrasse ist.
Mein Statemachine Code generator ist schon so modular gemacht, dass man 
auch C erzeugen könnte. Ich bin halt ein C++ Fan ;)

Mein Ziel ist nicht, die letzten Bytes aus dem Prozessor zu kitzeln, 
sondern eine verlässliche Platform zu schaffen, die Fehler im Ansatz 
vermeidet und mit moderaten Resourcen auskommt.

von Nils (Gast)


Lesenswert?

Vielleicht kannst du deinen Generator ( bisheriger Stand ) ja mal 
veröffentlichen? Dann kann man sich die Sache mal in ruhe anschauen.

von Kindergärtner (Gast)


Lesenswert?

Ist nicht der Sinn von abstrahierenden Sprachen wie C++, dass man eine 
Reihe von Grundfunktionen in Klassen/"Module" packt und die auf 
Anwendungsebene nur noch verbinden muss - also genau das was du mit dem 
Codegenerator machen willst? Wäre es nicht eventuell sinnvoller einen 
Satz "Module" mit einem guten API zu schreiben, die alles können was der 
Generator an Einzelfunktionalitäten produzieren kann, und die man dann 
nur noch in ordinärem C++ Code zusammenstecken muss? Dann schreibt man 
statt UML Diagrammen & Python scripts halt direkt "high-level"-C++. Der 
Vorteil ist, dass man bei einem Generator irgendwann mal auf etwas stößt 
was er nicht kann, das man dann irgendwie kompliziert dazu "hacken" 
muss, was leicht Konflikte und Probleme generiert. C++ Code ist eben C++ 
Code und kann alles was der Compiler erlaubt und mit C++ Objekten so 
möglich ist. Code-Generierung hat so ein "Geschmäckle"...

PS: Machen Sachen wie Simulink, Mathlab etc. nicht genau das was du 
vorhast...?

von Erik L. (erikl)


Lesenswert?

Hallo Michael,

> Der Code ist übersichtlich genug um Ihn manuell weiter zu pflegen, was
> wir in vereinzelten Fällen auch schon gemacht haben. Das ist aber zu
> vermeiden, da es eine Einbahnstrasse ist.
das ist auch unsere Ansicht!

> Mein Statemachine Code generator ist schon so modular gemacht, dass man
> auch C erzeugen könnte. Ich bin halt ein C++ Fan ;)
wie sind Deine Erfahrungen damit auf embedded systemen ?
(ich bin da nicht so der Spezialist, inzwischen zu weit weg vom 
codieren, ich mache mher Automatisierung)
Ich nehme an Du verwendest quasi auch nur sehr eingeschränktes C++.

> Mein Ziel ist nicht, die letzten Bytes aus dem Prozessor zu kitzeln,
klar, dann würd man weder Generator noch C++ wollen
> sondern eine verlässliche Platform zu schaffen, die Fehler im Ansatz
> vermeidet und mit moderaten Resourcen auskommt.
ja!

Einsatzgebiet wäre wohl:
diverse ähnliche Projekte, unterschiedliche Hardware, eher relativ kurze 
abgeschlossene Produktzyklen

Bei uns kommt eine andere Sichtweise zum Tragen: lange Produktzyklen, 
viel Software-Pflege, diverse Varianten eines Produktes.
Diese Varianten-Haltung im Code in Verbindung mit Codegeneratoren 
"schafft immer wieder Herausforderungen" ;-))

Gruß Erik

von W.S. (Gast)


Lesenswert?

Michael S1. schrieb:
> Ich habe den
> Statemachine Generator bereits in komplexen Medizinprodukten eingesetzt

Hmm.. als was dort?
Ich grüble gerade darüber nach, was man denn mit sowas wie einer State 
Machine in einem Gerät machen kann und mir fällt dabei wirklich nix 
gescheites ein.

Möglicherweise meinst du sowas wie Low-Level-Treiber für Peripherie wie 
USB oder I2C, was man ja von der Denke einiger Peripherie-Core-Erfinder 
durchaus machen könnte, wenn keine Störungen dazwischenkommen.

W.S.

von A. S. (ferraith)


Lesenswert?

Wenn du dir die Mühe sparen möchtest selber etwas zu schreiben, dann 
gibt es für den professionellen Bereich IBM Rational Rhapsody (basiert 
auf die verschiedenen UML-Diagramme) mit einem sehr flexiblen und 
umfangreich konfigurierbaren Code-Generator.

Falls es nicht unbedingt UML sondern eine datenflussorientierte 
Modellierung sein darf, dann schau dir mal Matlab Simulink mit dem RTW, 
Embedded Encoder usw. Gibt auch noch weitere Drittanbieter Toolchains 
die auf Simulink basieren und Code generieren.

von arc net (Gast)


Lesenswert?

Michael S1. schrieb:
> Ich kenne kein wirklich gutes Tool. Habe damals lang recherchiert.

Brauchbare Tools, zumindest zur Generierung der gesamten 
Initialisierungen, gibt es z.B. von SiLabs und Cypress.
Precision32 AppBuilder bzw. PSoC Creator wobei letzterer aufgrund der 
MCU-Features "etwas" darüber hinausgeht.
Chip-Initialisierung heißt bei den SiM3 und noch mehr bei den PSoCs 
deutlich mehr als nur zu sagen, Modul XYZ bekommt den Satz Einstellungen 
S mit Takt T.

Infineons Dave geht etwas weiter in Richtung der Idee...
http://www.infineon.com/cms/en/product/microcontrollers/development-tools-software-and-kits/dave-tm-–-free-development-platform-for-code-generation/channel.html?channel=db3a30433580b37101359f8ee6963814

von Gs S. (gs-scarnight)


Lesenswert?

@msb:

Mit welchen Werzeugen erstellt ihr denn die UML Statecharts? Für eine 
Open Source Projekt wäre es ja auch notwendig, das die Basis für den 
Generator bereits frei verfügbar und hinreichend gut ist.

Ansonsten wäre ggf. auch ein hybrider Ansatz mögliche Opensource-Projekt 
mit Dienstleistungen bzw. Schulungen als Geschäftsmodell.

von Michael S. (msb)


Lesenswert?

War heute tagsüber zu busy um zu antworten, und anschliessend Party ;)
Ich sag lieber morgen früh was sinnvolles.

von Michael S. (msb)


Lesenswert?

Hallo Erik,

> wie sind Deine Erfahrungen damit auf embedded systemen ?
> (ich bin da nicht so der Spezialist, inzwischen zu weit weg vom
> codieren, ich mache mher Automatisierung)
> Ich nehme an Du verwendest quasi auch nur sehr eingeschränktes C++.

Ich habe sehr gute Erfahrungen mit C++ im embedded Bereich. Die 
Objektorientierung führt zu sauberen Designs. Die Kapselung hilft sehr 
Fehler zu vermeiden und die Software wartbarer zu machen. Auch lassen 
sich Objekte besser auf mehrere Teammitglieder verteilen.
Klar man muss wissen was man tun darf. Templates können sehr 
resourcenfressend sein, wenn man sie falsch oder excessiv anwendet. 
Dynamische Speichenallozierung nach der initialisierung ist bei kleinen 
Prozessoren zu vermeiden. Objekte als Rückgabewerte sollte man auch 
nicht nutzen.

> Einsatzgebiet wäre wohl:
> diverse ähnliche Projekte, unterschiedliche Hardware, eher relativ kurze
> abgeschlossene Produktzyklen

Nein, wir haben auch sehr langlebige Projekte. Deshalb ist es mir auch 
lieb, den Codegenerator selbst im Griff zu haben. Man ist sonst schnell 
in Sachzwängen gefangen, wenn ein Toolhersteller inkompatible Änderungen 
macht, aber man die alte Version nicht in einer neuen Umgebung laufen 
lassen kann.

Varianten, die ja eher bei grösseren Systemen (meisst Linux basiert) 
auftreten, versuchen wir wenn irgend möglich mit Parametern zu steuern, 
was auch meisst gelingt.

von Michael S. (msb)


Lesenswert?

@W.S.
Statemachines sind doch überall zu finden. Jeder Steueungsablauf ist im 
Grunde eine Statemachine. Und da gibt es sehr komplexe. Auch in 
medizinischen Geräten.

In  low level Treibers setzen wir den Generator bisher nicht ein.

@A.S.
Die IBM Software ist nach meiner Einschätzung eher für PC Programmierung 
gedacht, nicht für embedded.

Ja Mathlab/Simulink wird viel benutzt. Das habe ich mir angesehen. Die 
erzeugen ziemlichen Spaghetti. Wenn man das z.B. mit unseren I/O und 
Parametersystem kombinieren will, muss man 100te Funktionen schreiben, 
die dann in einem Medizinprodukt einzelne Unittests brauchen. Davon habe 
ich Abstand genommen. Es gibt aber sicher Anwendungen wo diese Tools gut 
einzusetzen sind.

@arc net
Das sind alles Proprietäre Lösungen. Im uC Bereich brauche ich PIC32 
(wir sind Microchip Design Partner) und ARM Cortex.
Aber trotzdem danke, werde mal schauen ob man da wa lernen kann.


@gs scarnight
Mein Favorit is Cadifra, kostet 30 EUR
Der Generator hat aber ein separates Modul, das UML in eine interne 
Darstellung einliest. Das kann man dadurch einfach auf andere UML Tool 
Formate anpassen.

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.