Bei einer Programmierung in C oder C++ bieten Laufzeitbibliotheken Funktionen für eine dynamische Speicherzuweisung und -entkopplung in der Form von malloc() und free(). Leider fragmentiert der wiederholte Einsatz dieser Funktionen den Speicher, sodass nachfolgende Speicheranfragen wahrscheinlich nicht mehr bedient werden können. Zudem ist die Ausführungszeit dieser Funktionen nicht deterministisch; verantwortlich hierfür sind die Zuweisungsalgorithmen zur Ermittlung zusammenhängender Speicherblöcke.
Als Lösung für dieses Problem bieten Echtzeitbetriebssysteme eine Speicher-Blockverwaltung mit festen Blockgrößen. Dabei erhält eine Anwendung Speicherblöcke in fester Größe aus einem zusammenhängenden Speicherbereich. Ist die Nutzung des Speichers abgeschlossen, wird der Speicherblock an das Betriebssystem zurückgegeben. Alle Blöcke in einer Partition haben die gleiche Größe. Sind Anwendungsblöcke mit unterschiedlicher Größe nötig, so würde das Betriebssystem eine weitere Partition mit Blöcken dieser Größe definieren. Egal wie viele Blöcke bereits zugewiesen sind, die erforderliche Zeit zum Erlangen eines weiteren Blocks ist konsistent und deterministisch.
Eines der Probleme bei der Entwicklung von Embedded-Software ist die Implementierung von Timeouts und Delay-Zeiten, während das System zur gleichen Zeit schnell auf asynchrone Ereignisse reagieren können muss. Ein Echtzeitbetriebssystem vereinfacht Timeouts, weil Operationen, die auf den Eintritt eines Ereignisses warten, in den meisten Fällen mit einem Timeout verknüpft werden können. Beim erneuten Beginn der Task-Ausführung lässt sich dann ein Statuswert abfragen, der anzeigt, ob das Ereignis aufgetreten oder ob die Timeout-Periode abgelaufen ist. Delay-Zeiten lassen sich über den »Sleep Blocking«-Aufruf eines Betriebssystems implementieren.
Viele Betriebssysteme bieten darüber hinaus One-Shot und periodische Timer, die beim Ablauf eine Callback-Funktion aufrufen können. Ein One-Shot-Timer ist sinnvoll, um beispielsweise die Hintergrundbeleuchtung eines Displays nach einigen Sekunden abzuschalten. Ein periodischer Timer eignet sich dafür, eine LED-Betriebsanzeige blinken zu lassen, anstatt dieser einfachen Funktion einen eigenen Task zuzuweisen.
Die Autoren:
Ian Hall ist Systems Applications Spezialist bei Renesas Electronics.
Günter Plechinger ist Marketing Engineer CID Business Unit bei Renesas Electronics.