ClockPeriod(), ClockPeriod_r()

Получить или установить период системного таймера (системный тик)

Прототип:

#include <sys/neutrino.h>
int ClockPeriod( clockid_t id,
const struct _clockperiod *new,
struct _clockperiod *old,
int reserved );
int ClockPeriod_r( clockid_t id,
const struct _clockperiod *new,
struct _clockperiod *old,
int reserved );

Аргументы:

id
Тип часов (clock ID). Этот параметр должен быть равен CLOCK_REALTIME, поскольку это тип часов обеспечивает ведение системного времени.
new
NULL, или указатель на структуру struct _clockperiod, содержащую значение системного тика.
old
NULL, или указатель на структуру struct _clockperiod, в которой функция сохранит текущее значение системного тика, который действовал до изменения его на значение из new.
reserved
Этот параметр необходимо устанавливать в 0.

Библиотека:

libc

Описание:

Системные вызовы ClockPeriod() и ClockPeriod_r() позволяют установить или получить системного тика.


Note: Для получения периода системного таймера рекомендуется использовать функцию clock_getres() вместо прямого системного вызова.

Данные функции идентичны за исключением способа возврата ошибок.


Note:
  • Для установки периода системного таймера требуются права суперпользователя.

  • При использовании механизма адаптивного партиционирования ресурсов изменение системного тика необходимо производить до определения размера окна планировщика адаптивного партиционирования. Это связано с тем, что ЗОСРВ «Нейтрино» для внутреннего использования преобразует размер окна из миллисекунд в такты таймера.


Все таймерные функции вида timer_*() работают с точностью, не превышающей значение системного тика. Каждый момент срабатывания системного таймера называется tick. Начальное значение (значение по умолчанию) системного тика зависит от тактовой частоты ЦПУ:

Частота ЦПУ: Значение по умолчанию:
≥ 40MHz 1 миллисекунда
< 40MHz 10 миллисекунд

Слишком малое значение системного тика приводит к увеличению числа прерываний от таймера и нагрузки на систему. В связи с этим минимальное значение системного тика ограничено 10 микросекундами.

При попытке установить значение системного тика, которое ядро считает небезопасным, вызов завершается с ошибкой EINVAL. Квант времени для дисциплин планирования (дисциплин диспетчеризации) для типов “round-robin” и “other” всегда в четыре раза больше значения системного тика и не может быть изменен.

Состояния блокировки:

Данные вызовы являются неблокируемыми.

Возвращаемое значение:

ClockPeriod()
Если возникла ошибка функция возвращает -1, код ошибки записывается в errno. Любое другое возвращенное значение считается успешным завершением.
ClockPeriod_r()
EOK возвращается при успешном завершении. Функция НЕ устанавливает errno. При возникновении ошибки функция возвращает один из представленных ниже кодов.

Коды ошибок:

EFAULT
Произошла ошибка при доступе ядра к буферам памяти.
EINVAL
Некорректный тип clock ID, либо была попытка установки для системного тика значения, не находящегося в "безопасном" диапазоне.
EPERM
Процесс не имеет прав суперпользователя, необходимых для проведения регулировки часов.

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

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

Безопасность использования
Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

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

struct _clockperiod, clock_getres(), ClockAdjust()




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