Die in den Zwischenschichten
vorgenommenen Verfeinerungen münden in einer Implementierung, die
Realzeitgarantien verlangt. Diese können durch eine Worst-Case-Ausführungszeit-Analyse
bereitgestellt werden (Arbeitspaket 7), in der der
angenommene zugrundeliegende Prozessor eine wesentliche Rolle spielt.
Das im Projekt zum Einsatz
kommende Laufzeitanalysewerkzeug aiT
ermittelt zwar obere Schranken für Laufzeiten im schlimmsten Fall,
allerdings ohne Berücksichtigung von Unterbrechungen. Diese werden
beim systemweiten Nachweis der Echtzeiteigenschaften mitberücksichtigt.
aiT arbeitet auf ausführbaren Programmen („executables“),
die für einen bestimmten Prozessor compiliert sind. Die nebenstehende
Abbildung zeigt die innere Struktur von aiT.
Eingabe ist das ausführbare Programm und eine sogenannte
AIS-Datei, die Zusatzinformationen enthält, die normalerweise vom Benutzer
stammen, im Projektkontext aber von anderen Werkzeugen soweit wie möglich
erzeugt werden (Integration mit Ada- und Java-Compilern und Information
aus höheren Schichten).
Die Eingabe wird in einen Kontrolflußgraphen im
Zwischenformat CRL („Control-flow graph Representation Language“)
übersetzt. Auf diesem setzen dann verschiedene Analysatoren auf,
die die maximalen Laufzeiten der Basisblöcke in ausgewählten
interprozeduralen Kontexten unter Berücksichtigung des Cache-
und Pipelineverhaltens bestimmen. Diese Analysatoren werden mit
AbsInts Programm-Analysatoren-Generator
PAG aus problemnahen
Beschreibungen gemäß der Methodik der Abstrakten Interpretation im
Rahmen des Arbeitspakets 7 generiert.
Schließlich wird die maximale Laufzeit des
Gesamtprogramms als Lösung eines ganzzahligen linearen
Optimierungsproblems (ILP) bestimmt. Die Ergebnisse werden
in AbsInts Graphvisualierungswerkzeug
aiSee
übersichtlich dargestellt.
Dabei erfordern sehr genaue Vorhersagen von
Prozeßlaufzeiten sehr präzise Analysen der Speicherzugriffe
in den Programmen. Basierend auf abstrakter Interpretation
sind in Arbeitspaket 8 statische
Programmanalysen zu entwickeln, die Auskunft über „Data-Alignments“
geben und Zuordnungen von Speicherzugriffen auf Speicherblöcke und
Cachezeilen liefern. Technisch erforderlich dafür ist eine genaue
Analyse der verwendeten Adreßarithmetik des Prozessors. Konkret
sollen dabei mindestens folgende Arten von Beziehungen zwischen
Registerinhalten analysiert werden:
Affine Beziehungen: z.B., daß alle Speicherzugriffe an einem
bestimmten Programmpunkt stets von der Form
x + 4x sind.
Kongruenz-Beziehungen: z.B., daß alle Speicherzugriffe stets auf
die gleiche Adresse modulo 16 gehen.
Lineare Ungleichungs-Beziehungen. Die Basistechnologie
für solche Analysen geht auf Cousot/Halbwachs (1978) zurück, in dem konvexe
Polytope zur Beschreibung von Variablenabhängigkeiten vorgeschlagen werden.
Da der Umgang mit solchen Gebilden jedoch sehr teuer ist, kommt es darauf an,
hier geeignete Kompromisse zwischen Effizienz der Analyse und Genauigkeit
der Ergebnisse zu finden. Generell müssen dazu die Charakteristika der
Anwendungen sehr sorgfältig berücksichtigt werden.
|