Source Code Generierung aus UML Modellen – für jedes Zielsystem

By Renate Stuecka | 14/09/2022 | Reading time: 6 min

Nutzen Sie die Vorteile der UML Modellierung für die Entwicklung von Embedded Software? Dann wissen Sie, dass Sie daraus für Ihre Projekte vielfältigen Nutzen ziehen, z.B. bessere Zusammenarbeit, weniger Missverständnisse und Implementierungslücken, leicht verständliche Dokumentation, granulare Traceability, um nur einige zu nennen. Die automatische Generierung von Sourcecode, maßgeschneidert für Ihr Zielsystem, aus dem bereits getesteten und verifizierten UML Modell, ist ein weiterer Nutzen dieses Ansatzes, der Ihnen hilft, die Qualität Ihres Produktes zu erhöhen.

Doch oft liegen genau in dieser Anpassung an das Zielsystem die Tücken: je nachdem, welches UML-Werkzeug verwendet wird, und was für die Anpassung auf die Plattform Ihres Embedded Systems erforderlich ist. Daraus ergeben sich unterschiedliche, teilweise zeitraubende Umwege, damit das Produkt am Ende im Kontext von Betriebssystem (RTOS), Prozessmanagement, Message Handling, Bibliotheken, etc. lauffähig ist. Häufig muss das UML-Applikationsmodell um Dinge ergänzt werden, die eigentlich nicht auf die logische Ebene der Modellierung gehören. Dazu gehört z.B.

  • Der Einbau von RTOS Aufrufen in das UML Modell
  • Die Nachbildung von Funktionen im Modell, die in C/C++ nicht enthalten sind
  • Die Berücksichtigung spezifischer Taskwechselmechanismen

Das Zielsystem punktgenau ansteuern

Der Codegenerator von IBM Engineering Systems Design Rhapsody erzeugt Sourcecode in C oder C++. Weit verbreitete Zielplattformen werden bei der Codegenerierung per Parameter ausgewählt. Jedoch sind oft weitere Anpassungen erforderlich, welche – eigentlich unerwünschte – Eingriffe in das UML Modell erfordern. In Kombination mit dem SodiusWillert Embedded UML RXF und dem IBM OXF sind solche spezifischen „Adapter-Kapseln“ nicht notwendig, da diese Frameworks als Abstraktionsebene die Verbindung zwischen dem UML Modell und der Laufzeitumgebung auf dem Zielsystem herstellen. So werden Anpassungen an andere Plattformen schnell durchgeführt, ohne Eingriff in das Modell, das daher auch leicht portierbar bleibt.

Nun gibt es Zielsysteme, die über eine eigene Abstraktionsebene verfügen. Dazu zählen unternehmensspezifische Lösungen oder auch Design-Umgebungen wie Qt mit einem eigenen Framework Backbone, welches auf Plattformen in der Automobilbranche, Unterhaltungselektronik, Medizintechnik oder Fertigungsautomatisierung läuft. Das bedeutet jedoch nicht, dass sich die UML-Modellierung – mit anschließender Generierung von Sourcecode aus dem Modell – und die Entwicklung von Qt-basierten Systemen gegenseitig ausschließen. Ganz im Gegenteil, auch in diesem Szenario können Sie bei der Codegenerierung aus einem UML-Modell die Qt-Services nutzen und lauffähigen Sourcecode für Qt-basierte Systeme automatisch generieren.

Anpassung an die Qt Umgebung – Konzept

Alle Frameworks für die Codegenerierung in IBM Rhapsody setzen zunächst auf einer API auf, die den Zugriff auf relativ generische Operationen ermöglicht. Diese API wird in den Werkzeugeinstellungen definiert und implementiert die häufig verwendeten Grundfunktionen einmalig in der Form von Basisklassen. Somit wird dieser Code nicht mehrfach generiert, sondern Ressourcen schonend in generiertem Applikationscode wiederverwendet. Beispiele aus der UML dafür sind Zustandsautomaten, Aktive Klassen, Eventhandling, Timing und Mutual Exclusion (Mutex).

Diese als Framework bezeichneten Bibliotheksfunktionen greifen auf RTOS-Funktionen des jeweiligen Betriebssystems zu. Dies geschieht in der Regel über eine interne OS Abstraktionsebene, welche die OS Spezifika kapselt und für jedes RTOS individuell implementiert und bei Versionsupdates gepflegt werden muss.

An dieser Stelle kommen nun Qt Framework Libraries ins Spiel, in diesem Fall konkret die Qt Core Klassen, da sie genau das ebenfalls tun. Darüber hinaus bringen sie bereits für eine Vielzahl von Echtzeitbetriebssystemen und anderen Betriebssystemen eine derartige Anpassung mit. So kann zum Beispiel die Klasse QMutex statt einer OS-spezifischen Mutex Funktion verwendet werden, um auf einer Vielzahl von Zielplattformen eine Zugriffsserialisierung zwischen mehreren Threads zu realisieren. Auch alle im SodiusWillert Embedded UML RXF angesprochenen RTOS-Dienste können mittels einer Qt-Core Klasse adressiert werden.

Anpassung an die Qt Umgebung – Durchführung

Ähnlich wie für viele im RXF bereits existierende OS und RTOS Adapter kann Qt wie eine weitere Plattform betrachtet werden. Das Beispiel im folgenden Bild zeigt die Liste der angepassten Klassen für Linux im IBM Rhapsody RXF Modell. Mit überschaubarem und gut planbarem Aufwand kann Qt als neues RTOS-Paket in diese Liste aufgenommen werden, und die dortige Implementierung greift dann ausschließlich auf Qt Core Klassen zu, welche sich ihrerseits um den Zugriff auf das jeweilige OS bzw. RTOS kümmern.

Anpassung-an-die-Qt-Umgebung-Durchführung

Will man die Codegenerierung noch enger mit Qt verzahnen, können auch Container Klassen wie QList, QStack und QMap anstelle der RXF Container Klassen, der STL Container Klassen oder der IBM Rhapsody eigenen Container Klassen automatisch in der Rhapsody Codegenerierung für Assoziationen mit Multiplizität verwendet werden. Dazu bedarf es einer Erweiterung des Codegenerators, um ein weiteres Set an Container Properties in Rhapsody. Dieses Set wird dann anstelle des RXF Containers ausgewählt, um sicherzustellen, dass die Qt Container für die Implementierung von Assoziationen verwendet werden.

Anpassung-an-die-Qt-Umgebung-Durchführung-2

Fazit

Mit der Verwendung des Qt Frameworks für den OS/RTOS Zugriff erschließt man sich zunächst eine Vielzahl weiterer Target Plattformen, ohne sich im Detail mit der API des jeweiligen Betriebssystems beschäftigen zu müssen.

Wird mit IBM Rhapsody auch Funktionalität entwickelt, die sich hinter einer Qt-Grafikoberfläche verbirgt, so kann man sich den Workflow durch das Hinzufügen weiterer Qt Framework Add-Ons (wahlweise manuell oder mittels Reverse Engineering der jeweiligen Header API) vereinfachen, und weitere Qt Services wie Qt GUI, Qt Network oder Qt Bluetooth auf UML-Ebene komfortabel nutzen.

Sprechen Sie uns gern an für weitere Informationen über die hier vorgestellten Anpassungen an Qt- basierte und andere Systeme (mailto: info@sodiuswillert.de) oder besuchen Sie unsere Webseite.

Renate Stuecka

Renate Stuecka is a Consultant at SodiusWillert. Prior to joining SodiusWillert, Renate held various management positions in marketing and product marketing with a focus on advanced engineering tools for more than 20 years. Earlier, Renate had specialized in communication systems and led product management and software development teams in that industry. Renate has a Master of Science degree in Computer Science from Technical University Dortmund, Germany.

Leave us your comment

Most read articles

Subscribe to our blog

Watch the product demo

OSLC Connect for Jira: integrate Jira with IBM Engineering Lifecycle Management.

Icon_OSLC Connect for Jira_color_144*144px_SodiusWillert_2020_RVB

 

OSLC Connect for Jira leverages Open Services for Lifecycle Collaboration (OSLC) technology to collaboratively allow linking across design and implementation teams and better manage requirements and compliance.