# Timing Definition Language

Die Timing Definition Language (TDL) ist eine deklarative Programmiersprache zur Beschreibung des Zeitverhaltens einer komponentenbasierten Echtzeitanwendung basierend auf dem Konzept der logischen Ausführungszeit (Logical Execution Time, LET). Die LET abstrahiert von der tatsächlichen (physischen) Ausführungszeit auf einer bestimmten Ausführungsplattform und erlaubt die Simulation solcher Anwendungen unter Beibehaltung des Echtzeitverhaltens, ohne dass sämtliche Plattformdetails (CPU, Speicher, Topologie) bekannt sein müssen. Grundlage für die Ausführung einer TDL-Anwendung auf einer bestimmten Ausführungsplattform ist das Wissen über die im schlechtesten Fall zu erwartende Ausführungszeit (Worst Case Execution Time, WCET) der einzelnen Rechenaufgaben (Tasks). Die Ermittlung der WCET ist nicht Gegenstand von TDL.

## Geschichte

Die konzeptionellen Grundlagen für TDL stammen aus dem Giotto-Projekt der University of California, Berkeley, das in den späten 1990er Jahren begonnen wurde. Giotto führte das Konzept der LET (Logical Execution Time) ein und definierte ein Echtzeitprogramm als einen deterministischen endlichen Automaten (DFA), der in jedem seiner Zustände eine Menge von periodischen Aktivitäten durchführt (multi-mode), die jeweils eine eigene Ausführungsperiode besitzen können (multi-rate) und bedingt ausgeführt werden können (guarded activities). Die Aktivitäten sind Task-Aufrufe, Setzen von Aktuatoren und Zustandswechsel.
TDL baut auf diesen Konzepten auf und führt einige Erweiterungen sowie leistungsfähige Werkzeuge ein, mit deren Hilfe TDL-Programme entwickelt werden können. Die Erweiterungen von TDL bestehen in einem Komponentenmodell und in der Integration von asynchronen Aktivitäten. Die Entwicklung von TDL begann im Jahr 2003 an der Universität Salzburg (Österreich) als Teil des MoDECS-Projektes (Model based Development of Embedded Control Systems). Ab dem Jahr 2007 erfolgte die Weiterentwicklung von TDL als Teil eines CD-Labors (Christian Doppler Laboratory for Embedded Software Systems) ebenfalls an der Universität Salzburg.

## Komponentenmodell

TDL erlaubt die gleichzeitige Ausführung von mehreren Giotto-artigen Echtzeitprogrammen, die jeweils in einem benannten Programmkonstrukt, dem Modul, gekapselt sind. Durch die LET-Eigenschaft von Task-Aufrufen können einem System zusätzliche Module hinzugefügt werden, ohne dass sich das Zeitverhalten der vorher schon existierenden Module ändert. Das gilt natürlich nur solange die CPU oder CPUs in der Lage ist bzw. sind, die zusätzlichen Module zu rechnen.
Im einfachsten Fall sind die Module unabhängig voneinander und dienen nur dazu mehrere Funktionen auf einem Knoten zu implementieren. Man spricht dann auch von ECU-Konsolidierung. Im allgemeinen Fall können Module aber auch voneinander abhängig sein, was in TDL durch eine import-Deklaration ausgedrückt wird. Der Datenfluss zwischen mehreren Modulen kann auch zyklisch sein.
TDL-Module dienen auch als Basis für die Verteilung einer Anwendung auf mehrere Knoten eines verteilten Systems. In diesem Fall kann ein Werkzeug die erforderliche Netzwerkkommunikation automatisch aus den beteiligten Modulen und deren Knotenzuordnung und Netzwerkeigenschaften ermitteln. Das beobachtbare (logische) Zeitverhalten der entstehenden verteilten Anwendung entspricht dem einer nicht-verteilten. Man spricht deswegen auch von transparenter Verteilung.

## Integration von asynchronen Aktivitäten

TDL erlaubt neben den zeitgesteuerten (synchronen) Aktivitäten auch die Spezifikation von ereignisabhängigen (asynchronen) Aktivitäten wie Task-Aufruf und Aktuator-Setzen. Diese können mit einem Hardware-Interrupt, einem periodischen asynchronen Zeitgeber oder mit einem Update auf einem Ausgabe-Port angestoßen werden. Synchrone und asynchrone Aktivitäten können untereinander auch Daten austauschen, wobei das Schreiben von Ergebniswerten bzw. das Lesen von Eingabewerten so synchronisiert sind, dass sie jeweils eine untrennbare Einheit darstellen.
Generell gilt, dass asynchrone Aktivitäten nicht sofort ausgeführt werden, sondern zuerst in eine Prioritätswarteschlange eingetragen werden, aus der sie durch einen Hintergrundprozess, der mit niedrigster Priorität läuft, ausgelesen und ausgeführt werden.

## TDL-Werkzeugkette

Im Zentrum der TDL-Werkzeugkette steht der TDL:Compiler, der eine Menge von TDL-Modulen in sogenannten E-Code (embedded code) transformiert. Der E-Code wird für jeden Mode jedes Moduls berechnet und beschreibt die Folge von Aktivitäten für die Dauer einer Mode-Periode. Anschließend wiederholen sich die Aktivitäten. Die E-Code-Befehle stellen Instruktionen einer virtuellen Maschine dar, der sogenannten E-Maschine.
Neben der Erstellung des E-Codes erlaubt der TDL-Compiler auch die Erzeugung von plattformspezifischen Ausgaben durch Verwendung von Erweiterungen (Plug-ins), die für eine bestimmte Zielplattform erstellt werden können.
Die Organisation des Compileraufrufes mit allfälligen Parametern wie der Angabe der WCET für die einzelnen Tasks und der Zuordnung der Module zu Knoten eines verteilten Systems erledigt ein Werkzeug namens TDL:VisualDistributor.
Als Alternative für die Beschreibung eines TDL-Moduls in Textform kann mit dem Werkzeug TDL:VisualCreator ein graphisches Frontend verwendet werden.
Zur Überwachung, Protokollierung und Analyse der Netzwerkaktivitäten auf einem FlexRay-Netzwerk kann das Werkzeug TDL:VisualAnalyzer eingesetzt werden.
Für die Simulation von TDL-Anwendungen existiert eine Version von TDL:VisualCreator, die in das Simulationswerkzeug Matlab/Simulink integriert ist. Für die Erzeugung von plattformspezifischem Code steht eine in Simulink integrierte Version von TDL:VisualDistributor zur Verfügung.