Ein Angebot von

Software-Tipp: C++ mit einem Echtzeitbetriebssystem verwenden

| Autor / Redakteur: Colin Walls * / Sebastian Gerstl

Obwohl C die am weitesten verbreitete Programmiersprache für Embedded-Systeme ist, interessieren sich zunehmend viele Entwickler für die Verwendung von C++. Letztere eröffnet eine neue Möglichkeit zur Interaktion mit einem RTOS, die auf komplexe API-Aufrufe verzichten kann.
Obwohl C die am weitesten verbreitete Programmiersprache für Embedded-Systeme ist, interessieren sich zunehmend viele Entwickler für die Verwendung von C++. Letztere eröffnet eine neue Möglichkeit zur Interaktion mit einem RTOS, die auf komplexe API-Aufrufe verzichten kann. (Bild: Clipdealer)

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.

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:

class critical
{
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:

... // normal code

{
   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

Performance von Echtzeit-Betriebssystemen richtig messen

14.02.18 - Embedded Systeme müssen in einem strengen Korsett an Speicher- und Prozessorressourcen arbeiten - vor allem dann, wenn echtzeitkritische Leistung gefragt ist. Wie lässt sich aber die tatsächliche Performance des eingesetzten RTOS effizient und genau bestimmen? lesen

C++17 – Was gibt’s Neues? Ein Überblick über die wichtigsten Erweiterungen

C++17 – Was gibt’s Neues? Ein Überblick über die wichtigsten Erweiterungen

17.01.18 - Ende 2017 wurde es vollbracht: C++17 ist als neuer ISO-Standard einstimmig verabschiedet. Da stellt sich natürlich die Frage, was gibt es denn an konkreten Neuerungen in C++17? Und wir wirkt sich das für Softwareentwickler aus? lesen

Echtzeit mit Linux

Echtzeit mit Linux

04.08.17 - Mit Linux können Systeme mit harten Echtzeit-Anforderungen einfach umgesetzt werden. Doch welcher Ansatz ist der richtige? Und welche Latenzzeiten können damit erreicht werden? lesen

Der Autor

Colin Walls, Embedded-Software-Technologist bei Mentor, a Siemens business.
Colin Walls, Embedded-Software-Technologist bei Mentor, a Siemens business. (Bild: Caroline Mann)

* 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.

Kommentar zu diesem Artikel abgeben
Instead of enable_interrupts(); in the destructor, it may be better to call...  lesen
posted am 21.03.2018 um 11:13 von ftheile


Mitdiskutieren
copyright

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