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

D.8 Монотонное время

Этот подраздел описывает пакет высокоточного монотонного таймера.

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

Существует следующий пакет библиотеки, определяемый языком:
package Ada.Real_Time is
type Time is private;
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;
Tick : constant Time_Span;
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, 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 "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 To_Duration (TS : Time_Span) return Duration;
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;
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;
private
... -- не определено языком
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 — значение 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. Нет требования, чтобы они были одинаковыми.


Spec-Zone.ru

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