Операционная система ЗОСРВ «Нейтрино» > Руководство разработчика > Программные интерфейсы общего назначения > Системные библиотеки > Системные библиотеки > Системная библиотека > Q > struct qtime_entry



struct qtime_entry

Сведения о параметрах времени в системной странице

Прототип:

#include <sys/syspage.h>
struct qtime_entry {
uint64_t cycles_per_sec; /* for ClockCycles */
uint64_t volatile nsec_tod_adjust;
uint64_t volatile nsec;
unsigned long nsec_inc;
unsigned long boot_time; /* UTC seconds when machine booted */
struct _clockadjust adjust;
unsigned long timer_rate; /* times 10^timer_scale */
long timer_scale;
unsigned long timer_load;
long intr;
unsigned long epoch;
unsigned long flags;
unsigned int rr_interval_mul;
unsigned long spare0;
uint64_t volatile nsec_stable;
unsigned long spare[4];
};

Описание:

Тип позволяет олучать из системной страницы сведения о параметрах времени. Структура включает следующие поля:

cycles_per_sec
Количество тактов ЦПУ в секунду для этой системы. Для получения дополнительной информации см. ClockCycles().
nsec_tod_adjust
Сумма этого поля и поля nsec равна количеству наносекунд с (00:00:00 UTC) 1 января 1970 года.
nsec
Это 64-разрядное поле содержит количество наносекунд с момента загрузки системы.

Note: Поле nsec всегда монотонно увеличивается и не изменяется при задании текущего времени с помощью функции ClockTime() или ClockAdjust(). Поскольку обработчик прерываний таймера изменяет оба поля nsec и nsec_tod_adjust, но их значения слишком велики для передачи в атомарную операцию чтения, для их считывания необходимо:
  • отключать прерывания или
  • дважды считывать значения и проверять, что они не изменились.

nsec_inc
Количество наносекунд, которые истекли на момент каждого прерывания часов.
boot_time
Количество секунд, прошедших с полуночи (00:00:00 UTC) 1 января 1970 года («эпохи Unix») (UTC - всемирное координированное время)) до момента загрузки системы.

Если вы вызываете ClockTime() для установки времени суток, ядро проверяет равно ли это поле нулю. Если это так, ядро устанавливает для него соответствующее значение. Для всех программ запуска существует опция -T, которая предотвращает установку этого поля, так что ядро установит его при первом вызове ClockTime() для изменения времени суток. Это полезно, если часы реального времени работают не в UTC.
adjust
Содержит текущие параметры корректировки отсчетного времени, которые задаются функцией ClockAdjust(); равно нулю при запуске системы.
timer_rate
timer_scale
Параметры timer_rate и timer_scale связаны с входной частотой микросхемы внешнего счетчика в герцах следующим образом: 1 / (timer_rate x 1 ^ timer_scale).

Это выражение подразумевает, что timer_scale имеет отрицательное значение, и используется для того, чтобы результат вычисления timer_rate содержал максимальное количество значимых цифр. Например, на платформе x86 со стандартным оборудованием значение timer_rate равно 838095345UL, а значение timer_scale = -15. Это означает, что период таймера измеряется в фемтосекундах (-15 означает 10-15); фактическое значение составляет 838 095 345 фемтосекунд (примерно 838 наносекунд).
timer_load
Значение делителя частоты микросхемы таймера. Модуль startup-* оставляет его равным нулю, а ядро устанавливает его в зависимости от последних значений ClockPeriod() и timer_rate / timer_scale. Затем значение делителя частоты записывается микросхему таймера callout-ами ядра timer_load() / timer_reload().
intr
Содержит вектор прерываний, который используется микросхемой часов.
epoch
В настоящее время равно 1970, но не используется.
flags
Указывает, что аппаратный таймер обслуживается процессором с номером 0.
rr_interval_mul
Множитель ticksize для интервала карусельной дисциплины планирования (Round-Robin scheduling).
nsec_stable
Устаревшее поле.

Классификация:

ЗОСРВ «Нейтрино»

Тематические ссылки:

struct syspage_entry, ClockCycles(), ClockTime(), SYSPAGE_ENTRY()

Руководство по разработке модуля startup




Предыдущий раздел: Описание API системной библиотеки