Справочник по Ada 2005
D.8 Монотонное время
Этот пункт описывает пакет высокоточного монотонного таймера.
Статическая семантика
Существует следующий определенный языком библиотечный пакет:
package Ada.Real_Time is
type Time is private;
Time_First : constant Time;
Time_Last : constant Time;
Time_Unit : constant := определяемое реализацией действительное число;
Time_First : constant Time;
Time_Last : constant Time;
Time_Unit : constant := определяемое реализацией действительное число;
type Time_Span is private;
Time_Span_First : constant Time_Span;
Time_Span_Last : constant Time_Span;
Time_Span_Zero : constant Time_Span;
Time_Span_Unit : constant Time_Span;
Time_Span_First : constant Time_Span;
Time_Span_Last : constant Time_Span;
Time_Span_Zero : constant Time_Span;
Time_Span_Unit : constant Time_Span;
Tick : constant Time_Span;
function Clock return Time;
function Clock return Time;
function "+" (Left : Time; Right : Time_Span) return Time;
function "+" (Left : Time_Span; Right : Time) return Time;
function "-" (Left : Time; Right : Time_Span) return Time;
function "-" (Left : Time; Right : Time) return Time_Span;
function "+" (Left : Time_Span; Right : Time) return Time;
function "-" (Left : Time; Right : Time_Span) return Time;
function "-" (Left : Time; Right : Time) return Time_Span;
function "<" (Left, Right : Time) return Boolean;
function "<="(Left, Right : Time) return Boolean;
function ">" (Left, Right : Time) return Boolean;
function ">="(Left, Right : Time) return Boolean;
function "<="(Left, Right : Time) return Boolean;
function ">" (Left, Right : Time) return Boolean;
function ">="(Left, Right : Time) return Boolean;
function "+" (Left, Right : Time_Span) return Time_Span;
function "-" (Left, Right : Time_Span) return Time_Span;
function "-" (Right : Time_Span) return Time_Span;
function "*" (Left : Time_Span; Right : Integer) return Time_Span;
function "*" (Left : Integer; Right : Time_Span) return Time_Span;
function "/" (Left, Right : Time_Span) return Integer;
function "/" (Left : Time_Span; Right : Integer) return Time_Span;
function "-" (Left, Right : Time_Span) return Time_Span;
function "-" (Right : Time_Span) return Time_Span;
function "*" (Left : Time_Span; Right : Integer) return Time_Span;
function "*" (Left : Integer; Right : Time_Span) return Time_Span;
function "/" (Left, Right : Time_Span) return Integer;
function "/" (Left : Time_Span; Right : Integer) return Time_Span;
function "abs"(Right : Time_Span) return Time_Span;
Этот абзац был удален.
function "<" (Left, Right : Time_Span) return Boolean;
function "<="(Left, Right : Time_Span) return Boolean;
function ">" (Left, Right : Time_Span) return Boolean;
function ">="(Left, Right : Time_Span) return Boolean;
function "<="(Left, Right : Time_Span) return Boolean;
function ">" (Left, Right : Time_Span) return Boolean;
function ">="(Left, Right : Time_Span) return Boolean;
function To_Duration (TS : Time_Span) return Duration;
function To_Time_Span (D : Duration) return Time_Span;
function To_Time_Span (D : Duration) return Time_Span;
function Nanoseconds (NS : Integer) return Time_Span;
function Microseconds (US : Integer) return Time_Span;
function Milliseconds (MS : Integer) return Time_Span;
function Seconds (S : Integer) return Time_Span;
function Minutes (M : Integer) return Time_Span;
function Microseconds (US : Integer) return Time_Span;
function Milliseconds (MS : Integer) return Time_Span;
function Seconds (S : Integer) return Time_Span;
function Minutes (M : Integer) return Time_Span;
type Seconds_Count is range определяемый реализацией;
procedure Split(T : in Time; SC : out Seconds_Count; TS : out Time_Span);
function Time_Of(SC : Seconds_Count; TS : Time_Span) return Time;
function Time_Of(SC : Seconds_Count; TS : Time_Span) return Time;
private
... -- не определено языком
end Ada.Real_Time;
... -- не определено языком
end Ada.Real_Time;
В этом приложении, реальное время определяется как физическое время, наблюдаемое во внешней среде. Тип Time — это тип времени, как определено в 9.6; значения этого типа могут использоваться в оператор_ожидания_до. Значения этого типа представляют отрезки идеальной временной шкалы. Множество значений типа Time взаимно однозначно соответствует заданному реализацией диапазону математических целых чисел.
Значение Time I представляет полуоткрытый интервал реального времени, который начинается с E+I*Time_Unit и ограничен E+(I+1)*Time_Unit, где Time_Unit — определённое реализацией действительное число, а E — неопределённая начальная точка, эпоха, одинаковая для всех значений типа Time. Язык не определяет, синхронизированы ли значения времени с какой-либо стандартной временной отметкой. Например, E может соответствовать времени инициализации системы или эпохе некоторого временного стандарта.
Значения типа Time_Span представляют длительность реального времени. Множество значений этого типа взаимно однозначно соответствует заданному реализацией диапазону математических целых чисел. Значение Time_Span, соответствующее целому числу I, представляет длительность реального времени I*Time_Unit.
Time_First и Time_Last — это наименьшее и наибольшее значения типа Time соответственно. Аналогично, Time_Span_First и Time_Span_Last — это наименьшее и наибольшее значения типа Time_Span соответственно.
Значение типа Seconds_Count представляет прошедшее время, измеренное в секундах, с момента эпохи.
Динамическая семантика
Time_Unit — это наименьший отрезок реального времени, представимый типом Time; он выражается в секундах. Time_Span_Unit — это разность между двумя последовательными значениями типа Time. Это также наименьшее положительное значение типа Time_Span. Time_Unit и Time_Span_Unit представляют одну и ту же длительность реального времени. Тик таймера — это интервал реального времени, в течение которого значение таймера (наблюдаемое вызовом функции Clock) остаётся постоянным. Tick — это средняя длительность таких интервалов.
Функция To_Duration преобразует значение TS в значение типа Duration. Аналогично, функция To_Time_Span преобразует значение D в значение типа Time_Span. Для To_Duration результат округляется до ближайшего значения типа Duration (в сторону от нуля, если точно посередине между двумя значениями). Если результат выходит за пределы диапазона Duration, возникает Constraint_Error. Для To_Time_Span значение D сначала округляется до ближайшего целого кратного Time_Unit, в сторону от нуля, если точно посередине между двумя кратными. Если округлённое значение выходит за пределы диапазона Time_Span, возникает Constraint_Error. В противном случае значение преобразуется в тип Time_Span.
To_Duration(Time_Span_Zero) возвращает 0.0, а To_Time_Span(0.0) возвращает Time_Span_Zero.
Функции Nanoseconds, Microseconds, Milliseconds, Seconds и Minutes преобразуют входной параметр в значение типа Time_Span. NS, US, MS, S и M интерпретируются как количество наносекунд, микросекунд, миллисекунд, секунд и минут соответственно. Входной параметр сначала преобразуется в секунды и округляется до ближайшего целого кратного Time_Unit, в сторону от нуля, если точно посередине между двумя кратными. Если округлённое значение выходит за пределы диапазона Time_Span, возникает Constraint_Error. В противном случае округлённое значение преобразуется в тип Time_Span.
Действие операторов над Time и Time_Span аналогично действию операторов над целочисленными типами.
Функция Clock возвращает количество времени, прошедшее с момента эпохи.
Действие операций Split и Time_Of определяются следующим образом, рассматривая значения типа Time, Time_Span и Seconds_Count как математические целые числа. Действие Split(T,SC,TS) заключается в присвоении SC и TS таких значений, что T*Time_Unit = SC*1.0 + TS*Time_Unit, и 0.0 ≤ TS*Time_Unit < 1.0. Возвращаемое значение Time_Of(SC,TS) — это значение T такое, что T*Time_Unit = SC*1.0 + TS*Time_Unit.
Требования к реализации
Диапазон значений Time должен быть достаточным для уникального представления интервалов реального времени от запуска программы до 50 лет спустя. Tick не должен превышать 1 миллисекунды. Time_Unit должно быть меньше или равно 20 микросекундам.
Time_Span_First не должно быть больше -3600 секунд, а Time_Span_Last — не меньше 3600 секунд.
Скачок таймера — это разница между двумя последовательными различными значениями таймера (наблюдаемыми вызовом функции Clock). Не должно быть обратных скачков таймера.
Требования к документации
Реализация должна документировать значения Time_First, Time_Last, Time_Span_First, Time_Span_Last, Time_Span_Unit и Tick.
Реализация должна документировать свойства базовой временной шкалы, используемой для таймера и типа Time, такие как поддерживаемый диапазон значений и любые соответствующие аспекты используемого базового оборудования или операционной системы.
Реализация должна документировать наличие или отсутствие синхронизации с внешними временными отметками, и если такая синхронизация существует, источники синхронизации, частоту синхронизации и используемый метод синхронизации.
Реализация должна документировать любые аспекты внешней среды, которые могут повлиять на поведение таймера, как определено в этом пункте.
Метрики
В целях метрик, определённых в этом пункте, реальное время определяется как Международное атомное время (TAI).
Реализация должна документировать следующие метрики:
- Верхняя граница длительности интервала тика таймера в реальном времени. Это значение D такое, что если t1 и t2 — любые реальные времена такие, что t1 < t2 и Clockt1 = Clockt2, то t2 – t1 ≤ D.
- Верхняя граница размера скачка таймера.
- Верхняя граница скорости дрейфа Clock относительно реального времени. Это действительное число D такое, что
E*(1–D) ≤ (Clockt+E – Clockt) ≤ E*(1+D)
при условии: Clockt + E*(1+D) ≤ Time_Last.
при условии: Clockt + E*(1+D) ≤ Time_Last.
- где Clockt — значение Clock в момент времени t, а E — реальная временная продолжительность не менее 24 часов. Значение E, используемое для этой метрики, должно быть указано.
- Верхняя граница времени выполнения вызова функции Clock в тактах процессора.
- Верхние границы времени выполнения операторов типов Time и Time_Span в тактах процессора.
Разрешения реализации
Реализации, ориентированные на машины с размером слова меньше 32 бит, не обязаны поддерживать весь диапазон и точность типов Time и Time_Span.
Рекомендации по реализации
При необходимости реализации должны предоставлять механизмы настройки для изменения значения Tick.
Рекомендуется реализовывать Calendar.Clock и Real_Time.Clock как преобразования одной и той же временной базы.
Рекомендуется, чтобы «лучшая» временная база, существующая в базовой системе, была доступна приложению через Clock. «Лучшая» может означать наибольшую точность или наибольший диапазон.
ПРИМЕЧАНИЯ
35 Правила в этом пункте не подразумевают, что реализация может защитить пользователя от ошибок оператора или установки, которые могут привести к неправильному установлению времени.
36 Time_Unit — это точность типа Time. В отличие от этого, Tick представляет точность Real_Time.Clock. Нет требования, чтобы они были одинаковыми.