Spec-Zone.ru › Ada 2022
Справочник Ada (Ada 2022)

D.15 События тайминга

Этот подпункт описывает пакет, определяемый языком, который позволяет выполнять пользовательские защищённые процедуры в указанное время без использования задачи или оператора задержки.

Статическая семантика

Существует следующий пакет библиотеки, определяемый языком:
package Ada.Real_Time.Timing_Events
with Nonblocking, Global => in out synchronized is
type Timing_Event is tagged limited private;
type Timing_Event_Handler
is access protected procedure (Event : in out Timing_Event)
with Nonblocking => False;
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);
function Time_Of_Event (Event : Timing_Event) return Time;
private
... -- не задано языком
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 должна выполняться атомарно по отношению к выполнению обработчика.

Метрики

Реализация должна задокументировать следующую метрику:
  • Верхняя граница опоздания выполнения обработчика. То есть максимальное время между указанным временем события и фактическим вызовом обработчика, предполагая, что в течение этого интервала никакой другой обработчик или задача не выполняются.

Рекомендации по реализации

Защищенная процедура-обработчик должна выполняться непосредственно механизмом прерывания реального времени.
ПРИМЕЧАНИЕ 1 Так как вызов Set_Handler не является потенциально блокирующей операцией, его можно вызвать изнутри обработчика.
ПРИМЕЧАНИЕ 2 Обработчик Timing_Event_Handler может быть связан с несколькими объектами Timing_Event.


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API