Modellbasierte Software-Entwicklung eingebetteter Systeme Prof. Dr. Holger Schlingloff Institut für Informatik der Humboldt Universität und Fraunhofer Institut für offene Kommunikationssysteme FOKUS
Noch Fragen? Schema für Controller in C? Was ist ein Codegenerator? Prinzip der Übersetzung Scicos – C? Behandlung von Schleifen? Unterschied Gleitkomma-Festkomma? Codeoptimierungen – welche? Absicherung der Codegenerierung? X-in-the-Loop: Was ist X?
Codegenerierung Codegenerierung aus SysML/UML Codegenerierung aus State Machines Codegenerator ist „Compiler für Modelle“ Wiederverwendung schnelle Prototyp- und Produkterstellung erhöhte Zuverlässigkeit gegen Programmierfehler automatische Optimierung des generierten Codes Ziel: automatische Übersetzung von Modellen in ausführbaren (C-) Code
Codegenerierung aus SysML Requirement Diagramme (noch) nicht wirklich für Code verwendbar Blockdiagramme (BDD/IBD) VHDL-Code experimentelle Tools (RTaW, c-Lab U Paderborn) SysML to SystemC Aktivitätsdiagramme zur Spezifikation des Kontrollflusses Zustandsdiagramme
Example Source: Mura, Panda, Prevostini: Executable models and Verifivation from MARTE and SysML
UML Codegenerierung (Fast) jedes UML Tool behauptet, Code generieren zu können Wiki listet ca. 100 Tools auf (“Comparison of code generation tools”) Unterschiedliche Fähigkeiten Meist: Erzeugung von Schablonen Hohe Schule: Round-trip Engineering Für Eclipse-UML: Acceleo, Modelio (Softeam)
Modelio – Demo vertagt
UML Zustandsmaschinen neben Klassendiagrammen die am häufigsten zur Codegenerierung verwendete Diagrammart Übertragung der operationellen Semantik in die Zielsprache Beispiel: Hugo-RT, U Augsburg nimmt beliebiges (Papyrus-) Modell erzeugt Java und Promela (für Model-Checking)
Schema Paradigma für funktionale Systeme input-process-output Paradigma für eingebettete Systeme loop{sense-think-act} Hauptschleife, endlos wiederholt: - lies Sensorwerte - berechne Abweichung oder Aktion - schreibe Aktuatorwerte Innerhalb der Berechnung können verschiedenen Modi (Zustände) angenommen werden Codegeneratoren folgen diesem Paradigma
Beispiel Pacemaker
Example: VDI-Pacemaker Verhalten (vereinfacht) wait for an atrial pulse to be sensed wait for at most the AV delay if within this time a ventricular pulse is detected, goto step 1. otherwise, generate a ventricular pulse and goto step 1.
Allgemeines Übersetzungsschema s = off; while (true) { dequeue i from input stack; case s of off: case i of dn: s = tape; end; tape: case i of dn: s = memory; up: s = off; end; memory: case i of dn: s = play; play: case i of dn: s = tape; up: s = off; end; end; } off memory tape play dn up Variable s ist der aktuelle Zustand; Variable i ist der aktuelle Input
Sprungtabellentechnik table=[state]x[input][state]: table=[[off,dn,tape],[tape,up,off], [tape,dn,memory],...] s=off; while (true){ dequeue i from input stack; s=table[s,i]; } off memory tape play dn up Variable s ist der aktuelle Zustand; Variable i ist der aktuelle Input
Codegenerierung für Zustandsmaschinen Behandlung des Event-Pools Behandlung von Parallelität Hierarchisierung Completion Events History-States Übersetzungsschema s = s0; while (true) { dequeue (trigger); let Enabled = {tT | t=(s,(e,c,a),s´), c = true, e=0 or trigger e} if (Enabled not empty) { choose some t=(s,(e,c,a),s´) from Enabled; execute a; //potentially enqueing other triggers s = s´; }
Beispiel: VisualState Codegenerierung
Menschen- vs. maschinenlesbarer Code
Verifikation und Reportgenerierung Schlüsselwort: Modellprüfung (model checking)