11. Anlage
 
zurück
11.4.5 Monotones Zeitpaket


Echtzeitprogramme müssen die Fähigkeit besitzen, zeitabhängige Operationen mit einer hohen Genauigkeit durchzuführen. Das im Ada-Kern definierte Paket "Ada.Calendar" stellt dem Programmierer Möglichkeiten zur Verfügung, um die aktuelle Zeit zu ermitteln und arithmetische Operationen mit den Werten vom privaten Typ "Ada.Calendar", die Punkte auf der Zeitgeraden darstellen, und vom Festpunkttyp "duration", die Distanzen zwischen Punkten auf der Zeitgeraden darstellen, durchzuführen. Ada-Übersetzer, die die Anforderungen der Anlage "Echtzeitsysteme" erfüllen, stellen zusätzlich ein Paket "Ada.Real_Time" zur Verfügung, das die gleichen Möglichkeiten wie das Paket "Ada.Calendar" bietet, aber in der Lage ist, genauer mit kleineren Zeitintervallen zu arbeiten.

Der Typ "Ada.Real_Time.Time" repräsentiert eine Echtzeit-Uhr mit einer größeren Genauigkeit als die Tageszeit-Uhr von "Ada.Calendar.Time". Der Wert von "Ada.Real_Time.Clock" ist im Gegensatz zu "Ada.Calendar.Clock", die vom Operator vor- oder zurückgesetzt werden kann, garantiert monoton nicht abnehmend.

Es folgen zwei Programmbeispiele, die die Verwendung der Pakete "Ada.Calendar" und "Ada.Real_Time"

Das folgende Beispiel zeigt einen parallelen Prozeß, der jede Nacht um Mitternacht "erwacht" und eine Logging-Funktion ausführt.

with Ada.Calendar; use Ada.Calendar;
task body Um_Mitternacht is
Ein_Tag : constant Calendar.Day_Duration := 86_400.0;
Jetzt : Calendar.Time := Calendar.Clock;
Mitternacht: Calendar.Time := Calendar.Time_Of(
Year => Calendar.Year(Jetzt),
Month => Calendar.Month(Jetzt),
Day => Calendar.Day(Jetzt),
Seconds => 0.0);
begin
loop
Mitternacht := Mitternacht + Ein_Tag;
delay until Mitternacht;
Log_Daten;
end loop;
end Um_Mitternacht;


Da die "delay until"-Anweisung (delay_until_statement <BNF>) eine absolute Zeitangabe und kein Zeitintervall spezifiziert, gibt es keine Möglichkeit zur Unterbrechung innerhalb des Zeitintervalls.
Daher wird der parallele Prozeß genau zur spezifizierten Zeit aktiv. Die Zeitangabe wird durch die Uhr von "Ada.Calendar.Clock" gesteuert, so daß eine Veränderung dieser Uhr eine Veränderung der "Aufwachzeit" des parallelen Prozesses zur Folge hätte.

Ein weiteres Beispiel soll den Gebrauch des Pakets "Ada.Real_Time" verdeutlichen. Ein paralleler Prozeß fragt alle zehn Millisekunden ein Gerät ab. Die Periodenlänge wird sich nicht wie im vorherigen Beispiel verschieben. Es wird "Ada.Real_Time.Time" an Stelle von "Ada.Calendar.Time" verwendet, da das Beispiel unabhängig von Veränderungen der Uhr von "Ada.Calendar.Clock" sein soll.

with Ada.Real_Time; use Ada.Real_Time;
task body Abfrage_Geraet is
Abfrage_Zeit: Real_Time.Time := <time_to_start_polling>;
Periode: constant Real_Time.Time_Span :=
Real_Time.Milliseconds(10);
begin
loop
delay until Abfrage_Zeit;
... -- Geraet abfragen
Abfrage_Zeit := Abfrage_Zeit + Periode;
end loop;
end Abfrage_Geraet;



 
zurück
 Index   Ada Tour - Dokumentation  
© 2003 Förderverein Ada Deutschland e.V.