Справочник по Ada 2012
D.15 События тайминга
В этом подпункте описан пакет, определяемый языком, для выполнения пользовательских защищенных процедур в указанное время без необходимости использования задачи или оператора задержки.
Статическая семантика
Существует следующий определяемый языком библиотечный пакет:
package Ada.Real_Time.Timing_Events is
type Timing_Event is tagged limited private;
type Timing_Event_Handler
is access protected procedure (Event : in out Timing_Event);
type Timing_Event_Handler
is access protected procedure (Event : in out Timing_Event);
procedure Set_Handler (Event : in out Timing_Event;
At_Time : in Time;
Handler : in Timing_Event_Handler);
procedure Set_Handler (Event : in out Timing_Event;
In_Time : in Time_Span;
Handler : in Timing_Event_Handler);
function Current_Handler (Event : Timing_Event)
return Timing_Event_Handler;
procedure Cancel_Handler (Event : in out Timing_Event;
Cancelled : out Boolean);
At_Time : in Time;
Handler : in Timing_Event_Handler);
procedure Set_Handler (Event : in out Timing_Event;
In_Time : in Time_Span;
Handler : in Timing_Event_Handler);
function Current_Handler (Event : Timing_Event)
return Timing_Event_Handler;
procedure Cancel_Handler (Event : in out Timing_Event;
Cancelled : out Boolean);
function Time_Of_Event (Event : Timing_Event) return Time;
private
... -- не определено языком
end Ada.Real_Time.Timing_Events;
... -- не определено языком
end Ada.Real_Time.Timing_Events;
Тип Timing_Event представляет время в будущем, когда должно произойти событие. Тип Timing_Event требует завершения (см. 7.6).
Объект типа Timing_Event называется установленным, если он ассоциирован с ненулевым значением типа Timing_Event_Handler, и очищенным в противном случае. Все объекты Timing_Event изначально очищены.
Тип Timing_Event_Handler идентифицирует защищенную процедуру, которая должна быть выполнена реализацией при возникновении события тайминга. Такая защищенная процедура называется обработчиком.
Динамическая семантика
Процедуры Set_Handler связывают обработчик Handler с событием Event: если Handler имеет значение null, событие очищается; в противном случае, оно устанавливается. Первая процедура Set_Handler устанавливает время выполнения события на At_Time. Вторая процедура Set_Handler устанавливает время выполнения события на Real_Time.Clock + In_Time.
Вызов процедуры Set_Handler для события, которое уже установлено, заменяет обработчик и время выполнения; если Handler не равен null, событие остается установленным.
Как только возможно после установленного времени события, обработчик выполняется, передавая событие в качестве параметра. Обработчик выполняется только если событие тайминга находится в установленном состоянии в момент выполнения. Первым действием выполнения обработчика является очистка события.
Если политика Ceiling_Locking (см. D.3) активна при вызове процедуры Set_Handler, производится проверка, что приоритет потолка Handler.all равен Interrupt_Priority'Last. Если проверка не пройдена, возбуждается Program_Error.
Если процедура Set_Handler вызывается с нулевым или отрицательным In_Time или с At_Time, указывающим на время в прошлом, то обработчик выполняется как можно скорее после завершения вызова Set_Handler.
Функция Current_Handler возвращает обработчик, связанный с событием Event, если это событие установлено; в противном случае, она возвращает null.
Процедура Cancel_Handler очищает событие, если оно установлено. Cancelled присваивается True, если событие было установлено до его очистки; в противном случае, ему присваивается False.
Функция Time_Of_Event возвращает время события, если событие установлено; в противном случае, она возвращает Real_Time.Time_First.
В рамках завершения объекта типа Timing_Event, Timing_Event очищается.
Если несколько событий тайминга установлены на одно и то же время, они выполняются в порядке очереди FIFO (первым пришёл — первым обслужен) в соответствии с установкой.
Исключение, переданное из обработчика, вызванного событием тайминга, не имеет эффекта.
Требования к реализации
Для данного объекта Timing_Event реализация должна выполнять объявленные в этом пакете операции атомарно относительно любых таких операций с тем же объектом Timing_Event. Замена обработчика вызовом Set_Handler должна выполняться атомарно относительно выполнения обработчика.
Метрики
Реализация должна документировать следующие метрики:
- Верхняя граница задержки выполнения обработчика. То есть максимальное время между указанным временем события и фактическим вызовом обработчика, предполагая, что во время этого интервала не выполняется ни другой обработчик, ни задача.
Рекомендации по реализации
Защищенная процедура-обработчик должна выполняться непосредственно механизмом прерывания реального времени.
ПРИМЕЧАНИЯ
48 Так как вызов Set_Handler не является потенциально блокирующей операцией, его можно вызвать внутри обработчика.
49 Обработчик Timing_Event_Handler может быть связан с несколькими объектами Timing_Event.