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

UptoLike

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

62
- CLOCK_SOFTTIME – эта временная база подобна
CLOCK_REALTIME, за исключением режима сниженного энергопотребле-
ния, где ее не следует использовать;
- CLOCK_MONOTONIC – это временная база, которая приемлема для
всех режимов, но не допускает подстройку.
В структуре sigevent рекомендуется указывать следующие типы уве-
домлений для таймерных событий: SIGEV_SIGNAL, SIGEV_SIGNAL_CODE,
SIGEV_SIGNAL_THREAD, SIGEV_PULSE (см. табл. 3.10). Создав таймер,
необходимо выбрать его вид. Это осуществляется комбинированием аргу-
ментов функции timer_settime(), которая обычно применяется для запуска
таймера:
int TimerSettime( timer_t id, // идентификатор таймера
int flags, // флаги
const struct _itimer * itime, // текущие установки
struct _itimer * oitime ); // прежние установки
Аргументы:
id – идентификатор таймера, полученный при вызове TimerCreate();
flags – единственный поддерживаемый флагэто TIMER_ABSTIME. Если он установ-
лен, то поддерживается абсолютное время, начиная с нуля часов 1 января 1970 г. Когда флаг
сброшен, то таймер ведет отсчет относительного времени с момента запуска;
itime – указатель к структуре _itimer, которая специфицирует время первого срабаты-
вания таймера и период срабатывания. Если указанное время первого срабатывания уже ис-
текло, то событие, связанное с таймером, доставляется немедленно;
oitime – это NULL или указатель к структуре _itimer, где сохраняются прежние установ-
ки.
Структура _itimer состоит из двух полей:
– uint64_t nsec // время срабатывания таймера в наносекундах
– uint64_t interval_nsec // интервал срабатывания таймера в наносекундах
Если поле nsec = 0, то таймер запрещен. Ненулевое значение определяет момент пер-
вого срабатывания таймера. Если поле interval_nsec =0, то таймер сработает только одно-
кратно. Ненулевое значение определяет период срабатывания таймера, начиная с момента
первого срабатывания.
Если на момент вызова TimerSettime() таймер уже был запущен, то
этот вызов сбросит старые установки и заменит их на новые. Другие сис-
темные вызовы, связанные с временной синхронизацией, представлены в
табл. 4.2.
Вызов TimerAlarm() предназначен для формирования сигнала
SIGALRM («тревога») при срабатывании таймера:
int TimerAlarm( clockid_t id, // временная база
const struct _itimer * itime, // текущие установки
struct _itimer * otime ); // прежние установки
Аргументы функции подобны аргументам вызова TimerSettime(). Сиг-
нал SIGALRM доставляется к ожидающему потоку, который издал вызов
TimerAlarm(). Доставка сигналов не поддерживает очередности. Новый сиг-
нал заменяет старый, если старый не был обработан.