Systemanalyse Blick unter die Haube

Multitasking-Systeme können viele Überraschungen bergen – abhängig davon, wie sich Systemparameter und äußere Bedingungen verhalten. Um das Verhalten unter realen Bedingungen zu analysieren, ist nicht immer teure In-Circuit Hardware nötig.

Embedded-Systeme haben sich in den letzten Jahren stark weiterentwickelt, weil immer mehr Funktionen eines Systems in Software abgebildet werden. Am offensichtlichsten tritt diese Entwicklung im Bereich der Kommunikation zutage. Die heute gebräuchlichen 32-bit-Mikrocontroller sind in der Lage, neben ihren eigentlichen Aufgaben relativ komplexe Kommunikationsprotokolle abzuarbeiten. Um die vielen anfallenden Rechenprozesse zu koordinieren und zu verwalten, kommt meist ein Echtzeit-Betriebssystem zum Einsatz. Der Einsatz eines Echtzeit-Betriebssystems ist kaum mit nennenswertem Overhead verbunden; die gebräuchlichen CPU-Architekturen wurden auf den Einsatz solcher Betriebssysteme hin ausgelegt. Dadurch ist ihre Implementierung relativ einfach. Die Software-Infrastruktur rund um ein Echtzeit-Betriebssystem enthält meist eine Reihe von Middleware-Komponenten wie Dateisystem, Treiber und Kommunikationsprotokolle, die die Entwicklung beschleunigen. Der Hauptvorteil eines Echtzeit-Betriebssystems liegt in der Verwaltung und Überwachung der Rechen-Tasks. Sofern nicht ein Multicore-Prozessor genutzt wird, kann die CPU zu jeder Zeit nur eine Task ausführen – das Betriebssystem sorgt dafür, dass die Tasks schnell aufgerufen und angehalten werden und zwischen ihnen umgeschaltet wird. Diese Multitasking-Fähigkeit ist der eigentliche Grund, warum ein Betriebssystem eingesetzt wird.

Universal-Betriebssysteme wie Linux, die auf Hochleistungscomputern laufen, sind nichtdeterministisch: Hier ist genug Rechenleistung vorhanden, um eine große Anzahl von zeitunkritischen Tasks quasi-parallel abzuarbeiten. In Echtzeit-Systemen ist das nicht der Fall. Die Rechen- und Speicherressourcen sind begrenzt und es müssen zeitliche Randbedingungen eingehalten werden. Der Begriff „Echtzeit“ bedeutet, dass bestimmte Aufgaben innerhalb einer festgelegten Zeit abgearbeitet werden müssen. Wenn diese Zeitschranken nicht eingehalten werden, ist das Rechenergebnis ungültig oder unbrauchbar oder das System reagiert mit Fehlverhalten. Der Herausforderung bei der Entwicklung solcher Echtzeit-Systeme besteht darin, die Einhaltung der zeitlichen Bedingungen sicherzustellen, während mehrere Tasks – von denen jede ihre eigenen zeitlichen Anforderungen haben kann – gleichzeitig ausgeführt werden sollen.

Scheduling: Der Nächste bitte!

Um diese Bedingungen zu erfüllen, nutzen Echtzeit-Betriebssysteme einen Scheduler. Der Scheduler legt fest, wann welche Task zur Ausführung kommt, und viele Echtzeit-Betriebssysteme nutzen dazu das sog. Fixed-Priority Scheduling. Dabei erhält jede Task eine feste Priorität. Wenn mehrere Tasks zur Ausführung bereit sind, kommt diejenige mit der höchsten Priorität als nächste dran und wird bis zu ihrem Ende ausgeführt, solange nicht eine Task mit noch höherer Priorität die Warteschlange betritt. Wenn das der Fall ist, wird die aktuelle Task unterbrochen, auf Wartestatus gesetzt und die höher priorisierte Task ausgeführt. Dieses einfache Verfahren dient dazu, dass die Tasks jeweils mit der korrekten Priorität ausgeführt werden, um die Funktion der Gesamtanwendung sicherzustellen. Die Prioritäten, die der Entwickler festlegt, spezifizieren die Dringlichkeit, mit der eine Task ausgeführt werden muss. Tasks, die am dringendsten beendet sein müssen, werden als erste ausgeführt. Man sieht also: Es hat keinen Sinn, allen Tasks höchste Priorität zuzuweisen. Trotz „vernünftiger“ Prioritätsvergabe kann es aber sein, dass niedrig priorisierte Tasks möglicherweise nie zur Ausführung kommen, weil die höher priorisierten Tasks relativ oft ausgeführt werden müssen. Um solche Bedingungen zu erkennen, hilft es, das System unter kontrollierten Bedingungen zu simulieren. Allerdings weicht das reale Laufzeitverhalten von solchen Laborbedinungen meist ab. Hier ist der Einblick in das reale, laufende System nötig, um zu erkennen, was unter Echtzeit-Bedingungen wirklich passiert und wie oft niedrig priorisierte Tasks tatsächlich von der Ausführung verdrängt werden, was dann zu unvorhergesehenen Zuständen und Fehlfunktionen führen kann.

Analyse-Software zeigt Task-­Diagramm

Das Tool Tracealyzer ermöglicht die Analyse des Task Scheduling in einem Echtzeit-Betriebssystem zur Laufzeit. Das Werkzeug stellt 25 interaktive Ansichten auf das System bereit. Der Entwickler sieht in einer grafischen Ansicht, wie oft eine Task ausgeführt wird und wann es zu Unterbrechungen durch höher priorisierte Tasks oder Interrupts kommt. Das Bild zeigt die Hauptansicht von Tracealyzer, die eine vertikale Zeitleiste enthält, an der entlang die Tasks mit Anmerkungen eingezeichnet sind. Dort sind auch API-Aufrufe des Echtzeit-Betriebssystems und Log-Einträge sichtbar. Der Tracealyzer bietet also einen informativen Einblick in das Ablaufverhalten des Embedded-Systems. Mit dem Werkzeug kann der Verhalten unterstützter Echtzeit-Betriebssysteme analysiert werden, um das Laufzeitverhalten zu überwachen und zu optimieren. Zu den unterstützten Betriebssystemen zählen FreeRTOS, Micrium µC/OS, Linux, Segger embOS, VxWorks, On Time RTOS-32 und Wittenstein Safe-RTOS. Die Unterstützung weiterer Echtzeit-Betriebssysteme ist in Planung. Mehr Informationen dazu gibt es auf der Internetpräsenz des Herstellers: percepio.com.