11. Anlage
 
zurück
11.3.6 Behandlung von gemeinsamen Variablen


Objekte in einem gemeinsamen Speicher können verwendet werden, um Daten zwischen Ada-Prozessen, zwischen einem Ada-Programm und einem gleichzeitigen Nicht-Ada-Softwareprozeß oder zwischen einem Ada-Programm und Hardware-Geräten auszutauschen. Siehe auch das Kapitel Parallele Prozesse.
Die folgenden Darstellungspragmas steuern die Verwendung von gemeinsamen Variablen:
pragma Atomic ( lokaler_Name );

Atomic - Unteilbar bedeutet, daß das Lesen und Verändern eines Typs unteilbar ist. Ein Typ, auf den das Pragma "Atomic" angewendet wird, ist unteilbar. Ein Objekt (einschließlich einer Komponente), auf das das Pragma "Atomic" angewendet wird, oder eine Komponente eines Feldes, auf die das Pragma "Atomic_Component" angewendet wird, oder jedes Objekt eines unteilbaren Typs, ist unteilbar.
pragma Volatile ( lokaler_Name );

Volatile - Flüchtig bedeutet, daß das Lesen und Verändern eines Objektes direkt im Speicher ausgeführt wird.
Ein Typ, auf den das Pragma "Volatile" angewendet wird, ist flüchtig. Ein Objekt (einschließlich einer Komponente), auf das das Pragma "Volatile" angewendet wird, oder eine Komponente eines Feldes, auf die das Pragma "Volatile_Component" angewendet wird, oder jedes Objekt eines flüchtigen Typs, ist flüchtig. Zusätzlich ist jeder unteilbare Typ und jedes unteilbare Objekt als flüchtig vereinbart. Schließlich, wenn ein Objekt flüchtig ist, so sind es auch seine Unterkomponenten (für unteilbar gilt dies nicht). Die Pragmas "Volatile" und "Volatile_Components" stellen zusätzlich sicher, daß sich ein Objekt immer im Speicher befindet (und z. B. nicht zur Optimierung in einem Register). Ein Beispiel für die Verwendung des Pragmas "Volatile" ist eine Hardware-Uhr, die vom Programm gelesen wird.
pragma Atomic_Components ( Feld_lokaler_Name );
pragma Volatile_Components ( Feld_lokaler_Name );

Der lokale Name im Pragma "Atomic" oder "Volatile" soll entweder eine Objektvereinbarung, eine nicht geerbte Komponentenvereinbarung oder eine vollständige Typvereinbarung bezeichnen. Der lokale Name eines Feldes im Pragma "Atomic_Components" oder "Volatile_Components" soll einen Feldtyp oder ein Feldobjekt von anonymem Typ bezeichnen.
Es ist unzulässig, das Pragma "Atomic" oder "Atomic_Components" auf ein Objekt oder einen Typ anzuwenden, wenn die zugrundeliegende Hardware das unteilbare Lesen und Verändern nicht unterstützen kann.
Es ist unzulässig, das Größenattribut ‘Size für ein unteilbares Objekt, das Attribut 'Component_Size für einen Feldtyp mit unteilbaren Komponenten oder die Darstellungsattribute einer unteilbaren Komponente so anzugeben, daß die zugrundeliegende Hardware die Ausführung des unteilbaren Lesens und Veränderns nicht unterstützen kann.
Zwei Aktionen werden nacheinander ausgeführt, wenn jede ein Lesen oder Verändern des gleichen unteilbaren Objektes ist.
Wenn ein unteilbares Objekt als Parameter übergeben wird, dann soll der Typ des Formalparameters entweder unteilbar sein oder die Parameterübergabe durch Kopieren erlauben (d. h. er darf kein nicht unteilbarer Verweistyp sein). Wenn ein unteilbares Objekt als Aktualparameter für ein generisches formales Objekt im Ein-/Ausgabemodus verwendet wird, dann muß
der Typ des generischen formalen Objekts unteilbar sein. Wenn der Präfix eines Attributverweises auf ein Zugriffsattribut ein unteilbares Objekt bezeichnet (einschließlich einer Komponente), dann muß der sich ergebende Zugriffstyp unteilbar sein. Wenn ein unteilbarer Typ als Aktualparameter für einen generischen formalen Typ verwendet wird, dann muß der Vorgänger des formalen Typs unteilbar sein oder die Parameterübergabe durch Kopieren erlauben. Entsprechende Regeln gelten für flüchtige Objekte und Typen. Wenn ein Aktualparameter unteilbar oder flüchtig ist, und der entsprechende Formalparameter ist es nicht, dann wird der Parameter durch Kopieren übergeben.
Eine importierte flüchtige oder unteilbare Konstante verhält sich wie eine Konstante (d. h. nur lesend) hinsichtlich anderer Teile des Ada-Programms. Sie kann aber noch von einer "externen Quelle" verändert werden. Wenn ein Pragma "Volatile", "Volatile_Components", "Atomic" oder "Atomic_Components" auf ein eigenständiges konstantes Objekt angewendet wird, dann muß auch das Pragma "Import" verwendet werden.


Das folgende Beispiel zeigt die Verwendung der Pragmas auf den Komponenten eines Verbundes für die speicherabgebildetete Ein-/Ausgabe:

type IO_Rec_Type is record
   Start_Address: System.Address;
   pragma Volatile ( Start_Address );
   Length: Integer;
   pragma Volatile ( Length );
   Operation: Operation_Type;
   pragma Atomic ( Operation );
   Reset: Boolean;
   pragma Atomic ( Reset );
end record;
-- Speichern in die Komponente Operation stößt eine
-- Ein-/Ausgabeoperation an.
-- Lesen der Komponente Reset beendet die aktive Operation.
IO_Rec: IO_Rec_Type;
for IO_Rec’Address use ... ;


Durch die Vereinbarung von "Operation" und "Reset" als unteilbar, stellt der Nutzer sicher, daß das Lesen und Schreiben auf diesen Feldern nicht durch Optimierung entfernt und unteilbar ausgeführt wird. Durch die Vereinbarung von "Start_Address" und "Length" als flüchtig, erzwingt der Nutzer die sofortige Ausführung von Speicheroperationen, ohne daß lokale Kopien verwendet werden.

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