Mit ihrer Arbeit gehört das gemeinnützige Forschungszentrum Informationstechnik GmbH - früher "Gesellschaft für Mathematik und Datenverarbeitung" - ,heute von der Bundesrepublik Deutschland (BMBF/Bundesminister für Bildung und Forschung) sowie den Ländern Nordrhein-Westfalen, Hessen und Berlin getragen, zur Spitze der informationstechnischen Forschung im nationalen und internationalen Bereich. Sie lebt von der Zusammenarbeit mit Partnern aus der Industrie, Wirtschaft und den Medien. Die GMD versteht sich auch als Katalysator für innovative Ideen auf dem Gebiet der Informationstechnik. Hier können Forscher innovative Ideen entwickeln und damit einen Beitrag zur Stärkung des Wirtschaftsstandorts Deutschland leisten.
GMD-FIRST ist das Forschungsinstitut für Rechnerarchitektur und Softwaretechnik innerhalb der GMD. Dort wird auch an Werkzeugen und Methoden für die Echtzeit-Programmierung geforscht. Der folgende Beitrag stellt einige Ergebnisse vor, die auch als Public-Domain-Software über den nebenstehenden Internet-Link verfügbar sind.
Der Anwender kann sie, so wie sie sind, benutzen oder kann die Klassen mittels Vererbung und überladen von Methoden/Operatoren auf seine Bedürfnisse spezialisieren (anpassen).
Dagegen bietet die Framework-Technologie komplette anpaßbare Strukturen von Klassen an. Ein Framework besteht aus mehreren Klassen mit einer Beziehungsstruktur von Vererbungen und Referenzen. Die Struktur hat eine komplexe Funktionalität, die der Benutzer an seine Aufgabe anpassen kann (Bild 1).
Einige Klassen der Struktur stellen den Anpassungsanschluß (eine Art Schnittstelle) zum Anwender dar. Andere Klassen stellen einen Funktionsanschluß zur Verfügung oder unterstützen dessen Funktion. Alle Klassen zusammen erfüllen die Funktionalität des Frameworks.
Um die Funktionalität des Frameworks an seine Bedürfnisse anzupassen, schreibt der Anwender neue Klassen, die von den Anpassungsanschluß-Klassen erben (Subklassen). Diese Subklassen sollen die Anpassungsanschluß-Methoden überladen, um ihre Funktionalität im Framework zu integrieren.
Die neuen Subklassen werden automatisch (durch Vererbung) in die Struktur integriert. Dadurch wird die Funktionalität des Frameworks um die gewünschte Funktionalität erweitert und an die gestellte Aufgabe angepaßt. Die Funktionalität des gesamten Frameworks wird durch Methoden der Funktionsanschluß-Klassen aufgerufen.
Als Beispiel kann das in Bild 2 gezeigte Java-Framework mit einem Echtzeitkern dienen.
Das Java-Framework bietet einen Interrupt-Mechanismus und einen zeitgesteuerten Scheduler (Zuteilungsprogramm) an. Diese Mechanismen aktivieren die passenden TimedEvents (Tasks) zur passenden zeit oder als Reaktion auf Interrupts.
Die im Framework aktivierten TimedEvents sind nur Platzhalter. Der Anwender soll seine gewünschte Funktion in eine Subklasse von TimedEvents schreiben (Vererben) und die entsprechende Methode handle() und/oder interruptHandle() überladen.
Ist dies geschehen, aktiviert das Framework automatisch die vom Anwender definierten Methoden zum passenden Zeitpunkt.
Der andere Anpassungsanschluß ist die OnGoing-Klasse- Damit ist ein ongoing (fortlaufender) zeitgebundener Task implementierbar. Der Task läuft unabhängig vom Scheduler und Interrupts, aber er kann sich mit Interrupts und/oder Zeit synchronisieren, indem er auf solche Ereignisse wartet.
Dafür stellt die OnGoing-Klasse Methoden zur Verfügung. Der Benutzer soll seine gewünschte Fumktionalität in einer Subklasse von OnGoing schreiben und die Methode run() überladen.
Das Java-Framework ist als Public-Domain-Software unter dem Link erhältlich. Als Hintergrund zur Scheduler-Steuerung folgen einige Grundlagen.
Rechnerunterstützte Regelung und Steuerung werden in der Regel mit parallel laufenden Echtzeit(Realtime)-reaktiven Tasks implementiert. Tasks werden als Reaktion auf Ereignisse aktiviert, nach gegebenen Zeitpunkten oder sie können auch kontinuierlich laufen (ongoing). Eie Klassifizierung solcher Echtzeit-Tasks wird in Bild 3 versucht.
Die Korrektheit der zeitgebundenen Tasks oder Tasks mit Zeitanforderungen besteht nicht nur darin, einen korrekten Output-Wert zu generieren, sondern auch zum richtigen Zeitpunkt und nicht einfach "so schnell wie möglich.
Die Tasks haben ein Reaktions-Zeitfenster mit einer gewissen Toleranz. Das Ende der Zeitfenster ist die Deadline. Meistens wird im Echtzeit-Kontext nur von Deadlines gesprochen und der Anfang der Zeitfenster wird ignoriert. Dies kann zu Timing-Fehlern führen, die wiederum zu einem Anlagenausfall oder Versagen führen können.
Die Tasks ohne Zeitanforderungen (nicht zeitgebunden) brauchen nur ihre Ergebnisse zu liefern, aber der Zeitpunkt ist nicht maßgebend.
Diese Tasks laufen deshalb im Hintergrund nur dann, wenn keiner der zeitgebundenen Tasks den Prozessor und andere konkurrierende Ressourcen braucht. Dies Tasks werden als Ongoing Prozesse implementiert.
Die Ongoing Tasks können suspendiert und an derselben Stelle wieder fortgesetzt werden, im Gegensatz zu den zeitgebunden Tasks, die immer wieder an derselben Stelle (handle-Funktion) aktiviert werden.
Der Echtzeit-Scheduler muß dafür sorgen, daß jede Task rechtzeitig aktiviert (zugeteilt) wird, damit er sein Reaktions-Zeitfenster trifft.
Um dies zu garantieren, ist eine Ausführungs-Abschätzung der Tasks nötig. Wenn bekannt ist, wie lange jeder Task braucht und wo jedes Reaktions-Zeitfenster liegt, kann festgestellt werden, ob das System überhaupt realisierbar ist.
Je mehr man über das Laufzeitverhalten des Systems weiß, umso sicherer kann der Scheduler gemacht werden. Sogar die Zeit-Slots für die aperiodischen zeitkritischen Tasks sind im voraus reservierbar.
Doch meistens ist die Zeitreservierung für alle aperiodischen Tasks nicht möglich, es sei denn, der Prozessor ist sehr niedrig belastet. Darüber hinaus muß auch genügend Prozessorzeit frei bleiben, so daß die Ongoing-Tasks laufen können - besonders, wenn sie zeitgebundene Aufgaben im Verborgenen durchführen.
In diesem Fall ist eine Analyse notwendig, wieviel Ausführungszeit diese Tasks pro Zeiteinheit (z.B. Sekunde oder "major Cycle") brauchen, um diese Zeit frei zu lassen.
Wenn alle Laufzeitdaten bekannt sind, kann ein Scheduler, der die Timing-Anforderungen garantiert, fest programmiert werden das ist unter diesen Bedingungen ein statischer Scheduler.
Wenn es nicht möglich ist, von Anfang an alle Tasks und ihr Verhalten zu kennen, muß ein dynamischer Scheduler angewendet werden, bei dem sich zur Laufzeit die Tasks anmelden. Der Scheduler versucht dann, die dynamischen Timing-Anforderungen zu erfüllen. Ob das möglich ist, kann aber nur sehr wenig vorausgesagt werden.
Ein experimentellen Echtzeit-Java-Scheduler ist in der oben angeführten Public-Domain-Software (siehe Link) enthalten.
GMD-Forschungszentrum Informationstechnik
Hintergrund-Dokumente zu Echtzeit-Programmierung
Download der Public-Domain-Software
Mein Buch: Sichere und Fehlertolerante Steuerungen
GMD-Forschungszentrum Informationstechnik (now Fraunhofer Gesellschaft)
Hintergrund-Dokumente zu Echtzeit-Programmierung
Download der Public-Domain-Software,http://www.first.fhg.de/~sergio/public_domain/