Это моё решение для моего собственного вопроса. Я нашел это Ada Gem # 20 , описывающее использование прагмы Shared_Passive
. Справочное руководство по GNAT предоставляет больше подробной информации .
Следующий исходный код демонстрирует обмен случайно сгенерированными данными датчика между записывающим устройством и программой датчика.
Файл: memory.ads
package Memory is
pragma Shared_Passive;
type Sensor_Storage_Type is
record
Sequence_Numer : Natural := 0;
Humidity : Float := 0.0;
end record;
protected Shared is
function Read return Sensor_Storage_Type;
procedure Write (Humidity : Float);
private
Current_Value : Sensor_Storage_Type;
end Shared;
end Memory;
Файл: memory.adb
package body Memory is
protected body Shared is
function Read return Sensor_Storage_Type is
begin
return Current_Value;
end Read;
procedure Write (Humidity : Float) is
begin
Current_Value.Sequence_Numer := Current_Value.Sequence_Numer + 1;
Current_Value.Humidity := Humidity;
end Write;
end Shared;
end Memory;
Файл: sensor_writer.adb
with Ada.Text_IO;
with Ada.Numerics.Float_Random;
with Memory;
procedure Sensor_Writer is
Generator : Ada.Numerics.Float_Random.Generator;
package Float_IO is new Ada.Text_IO.Float_IO (Num => Float);
Random_Humidity : Float;
begin
while True loop
Random_Humidity := Ada.Numerics.Float_Random.Random (Generator) * 100.0;
Memory.Shared.Write (Random_Humidity);
Ada.Text_IO.Put ("Wrote sensor value: ");
Float_IO.Put (Random_Humidity, Exp => 0);
Ada.Text_IO.New_Line;
delay 5.0;
end loop;
end Sensor_Writer;
Файл: sensor_reader.adb
with Ada.Text_IO;
with Memory;
procedure Sensor_Reader is
Sensor_Value : Memory.Sensor_Storage_Type;
begin
while True loop
Sensor_Value := Memory.Shared.Read;
Ada.Text_IO.Put_Line ("Read sensor values:");
Ada.Text_IO.Put_Line (" Sequence number: " & Sensor_Value.Sequence_Numer'Image);
Ada.Text_IO.Put_Line (" Humidity: " & Sensor_Value.Humidity'Image);
delay 1.0;
end loop;
end Sensor_Reader;