Software-Tipp: C++ mit einem Echtzeitbetriebssystem verwenden
Bei Einsatz eines Echtzeitbetriebssystens in Embedded-Anwendungen kann die hohe Anzahl komplexer APIs, die zum Abrufen vieler RTOS-Funktionen nötig sind, unerfahrene Entwickler unter Einsatz von C abschrecken. Die Eigenschaften von C++ lassen sich hier aber gut nutzen, um auf einfache Weise zu sauberen und lesbaren Code zu kommen.
Anbieter zum Thema

Wenn Ihre Embedded-Anwendung ein Echtzeitbetriebssystem (Real-Time Operating System, RTOS) wie Nucleus verwendet, müssen Sie die API (Application Program Interface) kennen lernen. Die API besteht aus einer Reihe von Funktionsaufrufen, die es dem Anwendungscode ermöglichen, die Funktionen des RTOS zu nutzen. Dazu gehören die Steuerung von Tasks, das Timing, die Kommunikation zwischen den Tasks sowie die Synchronisation und das Speichermanagement. Da ein modernes RTOS eine Vielzahl von Funktionen bietet, kann sich die Anzahl der verfügbaren Aufrufe auf Hunderte belaufen.
Obwohl C die am weitesten verbreitete Programmiersprache für Embedded-Systeme ist, interessieren sich viele Entwickler für die Verwendung von C++. Dies eröffnet eine alternative Möglichkeit zur Interaktion mit einem RTOS.
Da ein modernes RTOS meist über viele Funktionen verfügt, können die API-Aufrufe recht komplex sein. Dies schreckt unter Umständen unerfahrene Entwickler ab. Natürlich kann man sagen, dass die meisten Ingenieure die Einzelheiten des RTOS-Betriebs nicht kennen müssen und sich auf ihr spezifisches Fachgebiet konzentrieren sollten. Hier ist C++ eine große Hilfe. In diesem Posting werde ich skizzieren, wie sich die Vorteile der C++-Eigenschaften auf sehr einfache Art und Weise nutzen lassen, um solideren und lesbaren Code zu schreiben.
In Embedded-Code – insbesondere in Echtzeitanwendungen – sind paarweise Operationen durch aus üblich. Dies sind komplementäre Aktionen, die zusammen ausgeführt werden müssen. Beispiele hierfür sind das Aktivieren/Deaktivieren von Interrupts, das Sperren/Entsperren von Geräten und die Speicherzuweisung/Freigaben.
Manchmal ist es notwendig, „kritischen“ Code zu schreiben, der ohne Unterbrechung abgeschlossen werden muss. Eine Möglichkeit besteht darin, Interrupts vor dem Codieren zu deaktivieren und danach wieder zu aktivieren. Dies ist in Ordnung, solange die Reaktivierung tatsächlich stattfindet. In C++ können wir eine Klasse erstellen, die hilft:
{
public:
critical()
{
disable_interrupts();
};
~critical()
{
enable_interrupts();
};
};
Ein Objekt, das aus dieser Klasse instanziiert wird, führt dazu, dass Interrupts deaktiviert werden, wenn es erstellt wird, und wieder aktiviert werden, wenn es gelöscht wird (z.B., wenn es nicht mehr gültig ist). So können wir einen kritischen Abschnitt kodieren, indem wir den entsprechenden Code in einem Block platzieren, der über ein lokales Objekt verfügt, das von der Klasse „critical“ instanziiert wurde:
{
critical section;
// critical code goes here
}
... // back to normal code
Der Abschnitt Objekt/Variable ist nur ein Dummy – bloß ein Mittel, um die Ausführung des Konstruktors und Destruktors zu gewährleisten. Er liefert aber durchaus lesbaren Code.
Performance von Echtzeit-Betriebssystemen richtig messen
C++17 – Was gibt’s Neues? Ein Überblick über die wichtigsten Erweiterungen
Echtzeit mit Linux
Der Autor

* Colin Walls verfügt über fast 40 Jahre Erfahrung in der Elektronikindustrie, hauptsächlich im Bereich Embedded Software. Er ist Embedded-Software-Technologist bei Mentor, a Siemens business, mit Sitz in Großbritannien. Walls hält regelmäßig Vorträge auf Konferenzen und Seminaren. Zudem ist er Autor zahlreicher Fachartikel sowie zweier Bücher über Embedded Software und betreibt ein Blog auf http://blogs.mentor.com/colinwalls.
(ID:45187179)