C++ Framework für embedded Anwendungen
Ein Framework gibt dem Entwickler erprobte Konzepte und eine klare Struktur vor und ermöglicht die effiziente Lösungsfindung.
Der Entwickler kann sich auf die inhaltliche Lösungsfindung konzentrieren.
Der objektorientierte (OO) Ansatz kommt immer häufiger auch bei der Entwicklung von Anwendungen auf µControllern zum Einsatz. Als Programmiersprache in diesem Bereich hat sich C++ durchgesetzt. Doch allein die Verwendung des OO-Ansatzes und der Sprache C++ garantieren noch keinen Erfolg. Hinzu kommt, dass Frameworks wie sie im PC Umfeld zur Anwendung kommen oft ungeeignet sind.
Der Schlüssel liegt also in der Erfahrung der Mitarbeiter und in der Umsetzung geeigneter Konzepte. Das von CSA Engineering entwickelte Framework vereint beides.
Strukturen schaffen
In der Designphase ermöglichen UML-Elemente wie Package oder Component eine effektive Strukturierung, während bei der Implementierung Klassen und Namespaces oft nicht ausreichen, um zufriedenstellende Ergebnisse zu erzielen.
Das von CSA Engineering realisierte Framework bietet Vorlage für die Entwicklung sogenannter Building Blocks. Building Blocks sind eine definierte Anordnung von Klassen, die gemeinsam eine bestimmte Aufgabe übernehmen und eine klar festgelegte Input / Output Schnittstelle haben.
Diese klare Struktur trägt massgeblich dazu bei, dass das Geheimnisprinzip und das Lokalitätsprinzip eingehalten werden und dadurch Abhängigkeiten reduziert werden. Endlose Include-Ketten treten gar nicht erst auf, was sich positiv auf die Kompilationszeiten auswirkt.
Abbildung 1 Beispiel Klassendiagramm BuildingBlock A
Hohe Wiederverwendbarkeit dank klaren Schnittstellen
Entwickler mit wenig Erfahrung in der OO-Technik neigen dazu, den Vorteil dieses Ansatzes in der Wiederverwendung einzelner Klassen zu sehen. Tatsächlich ist jedoch der Nutzen der Wiederverwendung auf Stufe Klasse begrenzt.
Der wirklich grosse Nutzen wird durch Wiederverwendung ganzer funktionaler Einheiten erreicht. Damit dies gelingen kann, sind klare Schnittstellen eine Voraussetzung.
Building Blocks, wie sie im Framework realisiert sind, legen diese klaren Schnittstellen fest. Durch Anpassung einer einzigen Klasse lässt sich ein Building Block in einer komplett anderen Anwendung wiederverwenden
Abbildung 2 Das Model sieht noch ordentlich aus
Höhere Zuverlässigkeit
Das Konzept des Building Blocks sorgt dafür, dass kritische Transaktionen nur lokal stattfinden. Die Allokation und die Rückgabe - von Speicher findet in der Regel nur innerhalb von Building Blocks statt, meist innerhalb der selben Funktion. Dies reduziert das Risiko von Speicher-Fressern wesentlich.
Meist ist auch die Komplexität eines Building Blocks so bemessen, dass sich ein einzelner Entwickler um die Implementierung kümmert. Probleme, welche sich durch mangelnde Absprache ergeben können, entfallen.
Multitasking als integraler Bestandteil
Um die zeitliche Unabhängigkeit der verschiedenen Aufgaben in einer embedded Anwendung zu gewährleisten, werden nicht selten Echtzeit Betriebssysteme eingesetzt. Building Blocks sind ausgelegt, bei Bedarf auch in einem eigenen Task-Kontext zu arbeiten.
Wesentliche Aspekte einer Multitasking Anwendung wie
- Erzeugen von Tasks
- Terminierung von Tasks
- Kommunikation zwischen Tasks
- Synchronisation von Tasks
sind vereinheitlicht und werden bereits im Framework abgehandelt.
Ein Framework gibt dem Entwickler erprobte Konzepte und eine klare Struktur vor und ermöglicht die effiziente Lösungsfindung. Der Entwickler kann sich auf die inhaltliche Lösungsfindung konzentrieren.
Abbildung 3 Konzeptionelle Integration des OS in das Framework
Portierbarkeit
Um Portierbarkeit zu erreichen, sind die Zugriffe auf das Betriebssystem nur über spezielle Klassen realisiert. Innerhalb des Frameworks gibt es keine direkten Zugriffe auf das Betriebssystem.
Durch entsprechende Implementierung einiger weniger, für die Portierung vorgesehener Klassen lässt sich das Framework in kurzer Zeit auf ein beliebiges Betriebssystem portieren. Bereits realisiert wurden unter anderem Portierungen auf Keil RTX, für FreeRTOS sowie auf Win32.
Entwickeln, Debuggen und Testen auf dem PC
Auch bei der Erstellung von embedded Anwendungen ist es sehr angenehm, wenn einzelne Module auf dem PC entwickelt und getestet werden können. Hier erweist sich die vorhandene Portierung für Win32 als sehr hilfreich: In der gewählten IDE, wie z.B. MS Visual Studio Code, lässt sich das Framework vollumfänglich integrieren und mit Tools wie GoogleTest / GoogleMock kombinieren. Dadurch ist ein Codieren und Testen ohne die echte Hardware möglich. Das bringt Komfort und macht zeitlich unabhängiger von der HW.
Nicht in Stolperfallen tappen
Die erfolgreiche Anwendung des objektorientierten Ansatzes und die Verwendung von C++ verlangen Erfahrung. Es lauern verschiedene Stolperfallen, die leicht zu einer „Ernüchterung“ führen können. Prozedurale Programmierung mit Klassen oder Objektorientertes Over-Engineering seien hier nur stellvertretend genannt.
Ein Framework hilft, Misstritte zu vermeiden, indem es den Lösungsraum einschränkt und den Entwicklern eine Vorlage für die eigene Arbeit bietet.