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?
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?
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
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
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
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
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
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.
Vielleicht kannst du deinen Generator ( bisheriger Stand ) ja mal veröffentlichen? Dann kann man sich die Sache mal in ruhe anschauen.
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...?
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
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.
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.
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
@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.
War heute tagsüber zu busy um zu antworten, und anschliessend Party ;) Ich sag lieber morgen früh was sinnvolles.
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.
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.