Entwicklungswerkzeuge

mbeddr - Embedded-Entwicklung mit erweiterbarem C

| Autor / Redakteur: Bernd Kolb, Markus Völter * / Franz Graser

Die zentrale Idee von mbeddr ist, dass sich Anwender eigene Erweiterungen bauen, passend für die entsprechende Domäne. Nach einer Einarbeitung in MPS lassen sich solche Erweiterungen unserer Erfahrung nach innerhalb von Stunden oder Tagen entwickeln. Nichtsdestotrotz umfasst mbeddr bereits eine Reihe von Erweiterungen, die allgemein genug gehalten sind, dass sie in vielen Embedded-Projekten sinnvoll eingesetzt werden können. In Folgenden zeigen wir exemplarisch einige dieser Erweiterungen anhand des Roboter-Beispiels.

Hello, Robot!

Wie in jeder neuen Umgebung beginnen wir mit einem „Hello World“-Programm. Nachdem wir die Header-Dateien zum Zugriff auf die Sensoren und Aktuatoren des Roboters in MPS importiert haben, beginnen wir mit der Implementierung einer C-Funktion, die auf dem Display unseres Roboters eine Nachricht ausgibt:

Bereits hier sind einige kleinere Änderungen im Vergleich zu normalem C-Code zu erkennen. Zum einen wird die Funktion ecrobot_device_initialize in einem Module angelegt (Bild 3). Module sind Namespaces und dienen zur Sichtbarkeitskontrolle. Insofern sind sie ein Ersatz für Header-Files. Wie im Beispiel zu sehen ist, werden die Funktionen auch direkt implementiert. Eine Trennung der Deklaration eines Funktionsprototypen und der Implementierung ist in mbeddr nicht notwendig. Funktionen können als exported markiert werden.

So kann der Nutzer die Sichtbarkeit außerhalb eines Modules steuern. Nur für exportierte Funktionen wird deren Prototyp im generierten Header erstellt. Andernfalls landet dieser in derselben C-Datei wie die Funktion selbst. Außerdem ist im Beispielcode zu sehen, dass ein anderes Modul importiert wird. Diese und andere Abweichungen erleichtern dem Programmierer die Arbeit und adaptieren bewährte Konzepte aus anderen Sprachen, soweit diese keinen Laufzeit-Overhead mit sich bringen. mbeddr verzichtet vollständig auf den Einsatz des Präprozessors und ersetzt ihn durch geeignete Spracherweiterungen.

Komponenten- und Unit-Testing, Logging

Mit der zuvor gezeigten Implementierung haben wir uns an die API des Mindstorms gebunden. Ein Test ohne die entsprechende Hardware ist nun nicht mehr ohne Weiteres möglich. Um solche engen Kopplungen zu vermeiden, hat mbeddr Komponenten als Sprachkonstrukte eingeführt. Diese erlauben es, die Interfacebeschreibung von deren Implementierung zu trennen und bei Bedarf unterschiedliche Implementierungen zu verwenden (Bild 4).

Die Komponente spezifiziert, welche Interfaces von ihr implementiert (provides EcRobot robot) werden und welche anderen Interfaces zur Implementierung benötigt werden. Dabei ist wichtig, dass auch bei den benötigten Interfaces (requires ...) nicht direkt auf eine andere, die Implementierung bereitstellende, Komponente verwiesen wird, um die direkte Kopplung zu vermeiden.

Für Interface-Operationen können Vor- und Nachbedingungen angegeben werden. Diese erlauben es, Erwartungen an alle Implementierungen zu beschreiben und können mit in den C-Code kompiliert werden. Bei einem Fehlschlag wird zur Laufzeit eine entsprechende Fehlermeldung ausgelöst. Mit Vorbedingungen lassen sich die Erwartungen an Funktionsparameter beschreiben. Nachbedingungen können zusätzlich verwendet werden, um das Ergebnis der Funktion zu überprüfen.

Für die Überprüfung steht die volle Mächtigkeit von C-Expressions zur Verfügung. Auch Protokollzustandsmaschinen zur Beschreibung der gültigen Aufruf-Reihenfolge von Operationen werden unterstützt.

In der Zukunft wird mbeddr mit Hilfe von Modelverifikationsmethoden auch in der Lage sein, Teile der pre- & post-Conditions sowie Protokollzustandsmaschinen statisch zu prüfen.

Im Gegensatz zu C++ erlauben mbeddr-Komponenten keine dynamische Erzeugung und müssen bei Programmstart initialisiert werden. Dies geschieht durch das initialize-Statement. In diesem Statement wird die Instanziierung und Verdrahtung der Komponenten vorgenommen: Für jedes Interface, das von einer Komponente als required markiert wurde, muss eine Komponente mit dem zugehörigen provided-Port angegeben werden, der die Implementierung dafür zur Verfügung stellt.

Nun ist es möglich, die Funktionalität von ecrobot_device_initialize unabhängig von der Hardware zu testen, da die Implementierung der benötigten Schnittstellen einfach ausgetauscht werden kann.

Um das Testen weiter zu unterstützen, hat mbeddr test cases als First-Class Citizen eingeführt. Innerhalb von test case stehen assert und fail-Statements zur Verfügung. Eine test-Expression erlaubt das Ausführen von mehreren test cases. Als Ergebnis liefert sie die Anzahl der fehlgeschlagenen Tests. Neben test cases bietet mbeddr für viele weitere Spracherweiterungen Testunterstützung, so z. B. Stubs und Mocks für Komponenten.

Das Logging von Nachrichten ist in eingebetteten Systemen nicht einfach, da abhängig vom Zielgerät keine Konsole zur Verfügung steht, sondern die Nachrichten in einem Fehlerspeicher abgelegt werden müssen. Außerdem sollten deaktivierte Log-Nachrichten keinen Laufzeit-Overhead mit sich bringen. mbeddr kommt mit Sprachunterstützung für Logging, die durch anpassbare Generatoren für verschiedenste Ausgabeziele genutzt werden kann. Zunächst werden hierzu die Nachrichten mit dem zugehörigen Log-Level deklariert. Nachrichten können optional parametrisiert werden.

Danach können diese Fehlermeldungen mit Hilfe des report-Statement ausgelöst werden. Fehlermeldungen können zentral deaktiviert werden und tauchen damit nicht im generierten Code auf. In unserem Beispiel werden Log-Nachrichten für die Ausgabe des Textes in der Debug- Implementierung verwendet. Auch die Übersetzung der pre- und post-Conditions sowie Protokollzustandsmaschinen nutzt das report-Statement, um über Fehler zu informieren. (Bild 5)

Kommentar zu diesem Artikel abgeben

Schreiben Sie uns hier Ihre Meinung ...
(nicht registrierter User)

Kommentar abschicken
copyright

Dieser Beitrag ist urheberrechtlich geschützt. Sie wollen ihn für Ihre Zwecke verwenden? Infos finden Sie unter www.mycontentfactory.de (ID: 38022700 / Embedded Software Entwicklungswerkzeuge)