Perfektes Timing

In Embedded-Systemen kommt es häufig auf das richtige Timing der Ein- und Ausgangssignale an. Gleich einem separaten, kleinen Mikrocontroller kümmert sich die programmierbare Enhanced-Time-Processor-Unit um diese Aufgaben und entlastet damit den Controller-Kern.

In Embedded-Systemen kommt es häufig auf das richtige Timing der Ein- und Ausgangssignale an. Gleich einem separaten, kleinen Mikrocontroller kümmert sich die programmierbare Enhanced-Time-Processor-Unit um diese Aufgaben und entlastet damit den Controller-Kern.

Die Anforderungen an Mikrocontroller, die in Embedded-Systemen für Echtzeit-Anwendungen zum Einsatz kommen sollen, konzentrieren sich in erster Linie auf akkurates und effizientes Timing und erst in zweiter Linie auf Rechenleistung. Der Prozessor muss die Erzeugung der Steuersignale in Abhängigkeit von den Eingangsstimuli gewährleisten. Die Grenzen für die zugrunde liegenden mathematischen Aufgaben des Steuerungsalgorithmus sind durch die Verarbeitungszeiten zwischen Ein- und Ausgängen vorgegeben. Jeder Prozessor kann nur mit einem bestimmten Leistungsdurchsatz aufwarten. Dieser hängt von der Art der Anwendung ab. Betrachtet man beispielsweise einen Prozessor in einem Logikanalysator, wo die Abtastung des Eingangssignals eine sehr schnelle Logik, aber fast keine Berechnungen erfordert, dann liegt der Schwerpunkt anders als bei einem MP3-Diktiergerät, wo die mathematischen Berechnungen im Vordergrund stehen.

Anwendungen mit kritischem Timing setzen eine rasche Abarbeitung von Interrupts voraus. Die Abarbeitung eines Interrupt beginnt mit dem Speichern des aktuellen Task-Kontexts der CPU und endet mit dessen Wiederherstellung – auch „Service-Overhead“ genannt. Es hat sich gezeigt, dass der Service-Overhead für einen solchen Interrupt in manchen Anwendungen bis zu 70 % der CPU-Zeit ausmachen kann.

Das beschriebene Problem lässt sich auf mehrere Weisen lösen, beispielsweise, indem man der CPU einen zweiten Hauptregistersatz spendiert. Der Kontext des aktuellen Task muss dann vor der Abarbeitung eines Interrupts nicht gespeichert werden, sondern die CPU schaltet lediglich auf den zweiten Registersatz um. Ist die Bearbeitung des Interrupts beendet, schaltet die CPU auf den ersten Registersatz zurück, in dem der Kontext unverändert zur Verfügung steht. Diese Methode weist einige Einschränkungen auf – so können die Interrupts beispielsweise nicht geschachtelt werden. Als Lösungsansatz kommen noch spezielle Hardwaremodule für bestimmte Aufgaben in Frage. Das PWM-Modul beispielsweise erzeugt unabhängig von der CPU PWM-Signale, und die CPU legt lediglich die benötigte Periode und das Tastverhältnis des zu erzeugenden Signals fest. Das UART-Modul erledigt die serielle Kommunikation und tauscht mit der CPU lediglich die empfangenen und zu sendenden Daten aus. Je mehr Peripheriemodule ein Prozessor hat, desto universeller ist er einsetzbar.

Die „eTPU“ (enhanced Time Processor Unit) gehört ebenfalls zu den Peripheriemodulen; ihre Funktion besteht darin, Aufgaben mit anspruchsvollem Timing zu verarbeiten und damit die CPU zu entlasten. Sie stellt ein programmierbares Modul dar, das sich von anderen Bausteinblöcken unterscheidet. Man kann sagen, die eTPU ist ein Co-Prozessor, ein kleiner Mikrocontroller, der parallel zur Haupt-CPU arbeitet. Sie wurde speziell dafür konzipiert, zeitkritische Aufgaben zu erledigen. Freescale Semiconductor setzt das eTPU-Modul vor allem ein in seinen 32-bit-Prozessoren der Baureihen MCF523x (ColdFire-Familie) und MPC5500 (Power Architecture-Familie).

Bisher wurden Aufgaben und interne Struktur der eTPU beschrieben, nun geht es um den praktischen Einsatz der eTPU in einer echten Applikation. Für den Einsatz der eTPU-Bibliothek reichen zwei einfache Schritte aus.

Ziel des ersten Schrittes ist es, den binären Programmcode für die eTPU zu erzeugen. Der Codespeicher der eTPU ist nicht groß genug, um die ganze eTPU-Bibliothek aufnehmen zu können. Außerdem benötigt keine Anwendung alle Funktionen gleichzeitig. Es reicht aus, die benötigten Funktionen aus der Bibliothek auszuwählen und diese zu verlinken. Für diesen Zweck steht auf der Website von Freescale [1] ein einfaches Compilertool zur Verfügung. Wie in Bild 2 gezeigt, wählt der Anwender die eTPU-Funktionen, die er in seiner Anwendung nutzen will. Mit einem Klick auf die Schaltfläche „Compile“ wird der binäre Programmcode der eTPU erzeugt und für den Download auf den Computer des Anwenders vorbereitet.

Auslastung der eTPU

Die Zuordnung der Kanäle durch die eTPU-Funktionen und die Einstellung der Funktionsparameter sind die bestimmenden Faktoren für die Auslastung der eTPU. Die Auslastung lässt sich mit Hilfe des „eTPU Graphical Configuration Tool“ abschätzen und in Prozent ausdrücken. In den meisten Fällen fällt das Ergebnis überraschend gut aus; nur in wenigen Anwendungen kommt man zu einer signifikanten Auslastung der eTPU. In diesem Fall ist es wichtig, sich das Timing der auf der eTPU laufenden Funktionen etwas genauer anzusehen. Man muss prüfen, ob die maximal für einen Servicevorgang anfallende Wartezeit nicht so lang wird, dass sie die korrekte Funktion beeinträchtigt. Diese Aufgabe ist alles andere als trivial. Man muss den Scheduler-Algorithmus, die Zuordnung der Kanäle durch die eTPU-Funktionen, die Funktionsparameter, die Parameter der Eingangssignale, die Kanalprioritäten und alle Servicezeiten mit einbeziehen. Der einfachere Weg besteht darin, den eTPU-Simulator zu nutzen, um die kritischste Situation zu simulieren und sich das Timing anzusehen.