Ein Angebot von

Software-Tipp: Weitere Programmiertechniken zu C++ mit einem RTOS

| Autor / Redakteur: Colin Walls * / Sebastian Gerstl

Die möglichkeit zur Klassenerstellung in C++ eröffnet eine Reihe von potentiellen Anwendungsmöglichkeiten in Echtzeitsystemen - wenn dabei einige wichtige Aspekte im Auge behalten werden.
Die möglichkeit zur Klassenerstellung in C++ eröffnet eine Reihe von potentiellen Anwendungsmöglichkeiten in Echtzeitsystemen - wenn dabei einige wichtige Aspekte im Auge behalten werden. (Bild: gemeinfrei / CC0)

Im letzten C++ Tipp haben wir eine interessante Technik für Embedded-Anwendungen geschildert, die einen Embedded-Block mit einem lokalen Objekt verwendete, in dem der zugehörige Konstruktor und Destruktor auf neuartige Weise eingesetzt wurde. Dies kann sich aber auch drastisch auf das Verhalten eines Echtzeitsystems auswirken. Hier einige nähere Details.

Wie im letzten Software-Tipp beschrieben eröffnet C++ eine neue Möglichkeit zur Interaktion mit einem RTOS, die auf komplexe API-Aufrufe verzichten kann. Der zuvor beschriebene Ansatz, Interrupts aus- und wieder einzuschalten, sollte allerdings sparsam und mit großer Sorgfalt angewendet werden. Denn er kann sich drastisch auf das Verhalten und die Performance eines Echtzeitsystems auswirken.

In einem Multi-Threaded-(Multitasking-)System hat man üblicherweise eine Ressource – meist eine Hardwarekomponente –, die zu einem bestimmten Zeitpunkt nur von einer Task sinnvoll genutzt werden kann. Wenn es zum Beispiel eine textuelle Darstellung gibt, kann es sein, dass eine Task ausschließlich für die Ausgabe von Informationen verwendet wird. Versuchen zwei Tasks gleichzeitig auf die Hardwarekomponente zuzugreifen, würde deren Text durcheinandergeraten. Das übliche RTOS-Objekt, das zur Steuerung des Zugriffs auf eine Hardwarekomponente verwendet wird, ist eine binäre Semaphore. Wir könnten eine Klasse wie diese erstellen:

class Grab_Console
{
private:
   static Semaphore console_lock;
public:
   Grab_Console()
   {
      console_lock.obtain();
   };
   ~Grab_Console()
   {
      console_lock.release();
   };
};

Ein paar Dinge gilt es dabei zu beachten:

  • Es wird davon ausgegangen, dass eine Klasse Semaphore verfügbar ist. Diese verwendet die API des RTOS zum Erstellen und Verwalten einer binären Semaphore.
  • Diese Klasse hat als obtain() und release() bezeichnete Member-Funktionen (Methoden), die die Funktionalität bereitstellen.
  • Das Semaphore-Objekt console_lock wird als statisch deklariert, so dass eine einzige Instanz, die von Grab_Console instanziiert wurde, gemeinsam von allen Objekten genutzt wird.

Eine Task mit „Hello World“ könnte nun folgendermaßen kodiert werden:

...

{
   Grab_Console now;

   printf("Hello World!\n");
}

...

Offensichtlich gibt es für diesen Ansatz zahlreiche Anwendungsmöglichkeiten.

Nach meinem letzten Beitrag wurde mir mitgeteilt, dass dieser Ansatz besonders gut mit der Ausnahmebehandlung von C++ kompatibel ist. Obwohl die Ausnahmebehandlung aufgrund des zusätzlichen Overheads selten in Embedded-Anwendungen zum Einsatz kommt, können Sie sicher sein, dass der Destruktor trotzdem ausgeführt wird, wenn der „geschützte“ Code eine Ausnahme auslöst. Man könnte es auch als „EHS-sicher“ bezeichnen.

Software-Tipp: C++ mit einem Echtzeitbetriebssystem verwenden

Software-Tipp: C++ mit einem Echtzeitbetriebssystem verwenden

13.03.18 - 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. lesen

Echtzeit mit Linux

Echtzeit mit Linux

11.12.18 - 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

Echtzeit mit dem Raspberry Pi und Linux PREEMPT_RT

Echtzeit mit dem Raspberry Pi und Linux PREEMPT_RT

02.08.17 - Für das Raspberry Pi sind zahlreiche Betriebssysteme vorhanden, die jedoch Echtzeitanforderungen in der Regel nur unzureichend erfüllen. Mit dem PREEMPT_RT Patch können Sie auf dem Einplatinenrechner dagegen Echtzeiteigenschaften erreichen. lesen

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.

Kommentar zu diesem Artikel abgeben
I am not totally sure that I understand your question. In the example code: { Grab_Console...  lesen
posted am 26.03.2018 um 13:09 von Unregistriert

Welche Ressource soll denn bei diesem Beispiel durch die Semaphore vor konkurrierendem Zugriff...  lesen
posted am 20.03.2018 um 23:01 von Unregistriert


Mitdiskutieren
copyright

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