Auch mit C++ lassen sich im Automotive-Bereich effiziente Programme entwerfen C++ in der Automotive-Software-Entwicklung

In vielen Bereichen der Embedded-Entwicklung hat sich C++ bereits als Programmiersprache durchgesetzt. Auch die Software im Automobil erreicht mittlerweile eine Komplexität, die neue Wege in der Programmierung erfordert.

Auch mit C++ lassen sich im Automotive-Bereich effiziente Programme entwerfen

In vielen Bereichen der Embedded-Entwicklung hat sich C++ bereits als Programmiersprache durchgesetzt. Auch die Software im Automobil erreicht mittlerweile eine Komplexität, die neue Wege in der Programmierung erfordert.

Neue Anforderungen an die Software im Automobil, u.a. auch vom Gesetzgeber, führen dazu, dass sowohl der Funktionsumfang als auch der Grad der Vernetzung der Funktionen untereinander ansteigen. Der Ansatz, mehr Funktionen auf einer höheren Anzahl verbauter Steuergeräte zu partitionieren, ist allerdings nur im begrenzten Maße möglich. Er skaliert sehr schlecht aufgrund der erhöhten Kosten, der gesteigerten Vernetzungskomplexität und nicht zuletzt wegen des begrenzten Bauraums im Auto. Eine Lösung besteht in der höheren Integration der Software-Module. Dies erfordert ein präzises Design der logischen und dynamischen Funktionen sowie ihrer Abhängigkeiten in einem hoch integrierten Umfeld. Diese Komplexität zu beherrschen, stellt die Software-Entwicklung vor völlig neue Herausforderungen.

Traditionell wird in der Embedded-Software-Entwicklung im Automobil-Umfeld bevorzugt ANSI-C als High-Level-Programmiersprache eingesetzt. Dies erlaubt eine hardwarenahe Implementierung bei zugleich hoher Portabilität, da gute Compiler für nahezu jeden Controller verfügbar sind. Mit zunehmend größeren und komplexe-ren Systemen (mit teilweise mehr als 100 000 Code-Zeilen bei 32-bit-Mikrocontrollern) steigt die Herausforderung, verständliche, wieder verwendbare, testbare und wartbare Software zu entwickeln. Die Erfahrungen aus anderen Softwarebereichen haben gezeigt, dass klassische Entwicklungsansätze, in welchen die Software (wie in C) aus einer Addition von Prozeduren oder Funktionen zusammengestellt wird, hier an ihre Grenzen geraten. Um diese Art der Entwicklung noch beherrschen zu können, benötigen die Programmierer neue und mächtigere Werkzeuge. Hierbei haben sich die Paradigmen der Datenabstraktion, Objekt-orientierung sowie der generischen Programmierung in umfangreichen Software-Projekten verbreitet durchgesetzt.

C++ ist eine Sprache, die diese Paradigmen unterstützt und gleichzeitig allen Anforderungen aus dem Embedded-Umfeld (wie z.B. Ressourcen-Anforderungen und Performance) gerecht wird. Für viele Anwendungen im Embedded-Bereich wie etwa Mobiltelefone, PDAs etc. ist der Einsatz von C++ heute bereits Standard. In der Automotive-Welt hingegen hat die objektorientierte Programmierung in C++ nur in sehr geringem Umfang Einzug gehalten.

Gegen C++ im Embedded-Bereich werden oft Punkte angeführt wie: „C++ ist langsamer als C“, „C++ ist viel schwieriger zu verstehen als C“, „C++-Programme brauchen mehr Platz als C-Programme“ oder „Abstraktion bedeutet Ineffizienz“. Diese Aussagen müssen aber im passenden Kontext gesehen werden. Sie entstehen, weil die meisten Programmierer nicht wissen, wie die verwendeten Sprachmerkmale tatsächlich vom Compiler umgesetzt werden. Dieser Artikel zeigt, welche Konzepte von C++ für den Einsatz in der Embedded-Programmierung geeignet sind und die helfen können, zukunftsfähige Software-Systeme zu entwickeln.

Kurzer Abriss zu C++

Integration von C-Code

Bei C++ erzeugt der Compiler durch das so genannte Name Mangling andere Symbolnamen für Funktionen und Methoden (das ermöglicht u.a. das Überladen). Deshalb kann dem Compiler angezeigt werden, dass er dies für bestimmte Code-Passagen unterlassen soll. Diese werden mit einem extern "C"-Block gekennzeichnet. Ein entsprechender Ausschnitt einer C++-Datei könnte so aussehen:

#include "MyCppHeaderFile.h"
extern "C" {
#include "my_legacy_c_header_file.h"
}

Besser noch werden allerdings die Header-Dateien angepasst, da dann die Änderungen nur an einer Stelle notwendig sind:

//...
#ifdef __cplusplus
extern "C" {
#endif
//declarations
#ifdef __cplusplus
} //extern "C"
#endif
//...

Im Folgenden wird ein (stark vereinfachtes) Framework für Embedded-Anwendungen mit Kommunikation über den in der Automobilindustrie weit verbreiteten CAN-Bus (Controller Area Network) entwickelt und einige Details von C++ anhand dieses Beispiels erläutert. Bild 1 zeigt das UML-Klassendiagramm des Szenarios.

Datenabstraktion

Bei CAN werden Daten in Frames übertragen, die eine maximale Länge von 8 byte haben. Jeder Frame wird über seine ID (Identifikator) eindeutig identifiziert. Zentraler Bestandteil des Frameworks ist deshalb die Klasse CANFrame. Sie stellt den kleinsten gemeinsamen Nenner dar, den Applikationen zum Transport von Daten über den Bus nutzen.