Синхронизация и взаимодействие программных потоков в операционной среде реального времени. Дорогов А.Ю. - 61 стр.

UptoLike

Составители: 

61
4.2. Таймеры
Таймеры являются источниками событий, которые служат для синхро-
низации вычислительного процесса во времени. QNX Neutrino обеспечива-
ет полный набор таймерных возможностей, определяемых стандартом
POSIX. POSIX-модель позволяет иметь:
абсолютную дату;
относительную дату;
циклический режим.
Циклический режим наиболее важен, поскольку в большинстве случаев
периодический источник событий подталкивает программный поток к вы-
полнению какого-либо действия. Поскольку таймеры являются источниками
событий, то они также используют процедуру доставки событий, подобную
MsgDeliverEvent() со структурой sigevent.
Таймерэто объект ядра, который обрабатывает прерывания, посту-
пающие от аппаратного генератора синхроимпульсов, размещенного на ма-
теринской плате или в кристалле процессора. Для того чтобы работать с
таймером, необходимо:
1) создать объект типа «таймер»;
2) выбрать тип уведомления о событии;
3) выбрать нужный тип таймера (абсолютный, относительный, перио-
дический, однократный);
4) запустить таймер.
Первый этап (создание таймера) выполняется с помощью функции
timer_create():
int TimerCreate( clockid_t id, // временная база
const struct sigevent *event ); // уведомление о событии
Функция возвращает идентификатор таймера, который дальше используется во всех вы-
зовах.
Аргументы:
id – временная база системных часов;
event – указатель к структуре sigevent, которая содержит тип события, генерируемого
при срабатывании таймера.
POSIX-стандарт утверждает, что на различных платформах можно ис-
пользовать различные типы временных базисов, но любая платформа
должна, по меньшей мере, поддерживать базис CLOCK_REALTIME. В QNX
Neutrino есть 3 временных базиса:
- CLOCK_REALTIME – таймеры, основанные на этой временной базе,
будут пробуждать процессор в любых режимах. Часы, основанные на этой
временной базе, допускают подстройку, которую можно выполнить с помо-
щью функции ClockAdjust();