Функция предназначена для перевода вызвавшей ее задачи в состояние ожидания до тех пор, пока условие совпадения с битовой маской флага evf
не будет выполнено. Условие определяется параметром wait_pattern
и режимом ожидания wait_mode
. Как только условие будет выполнено, битовая маска флага будет возвращена по указателю p_flags_pattern
.
Если на момент вызова функции условие выполняется, задача не будет переведена в состояние ожидания и сервис завершит свое выполнение.
Если на момент вызова функции условие не выполняется, то задача переводится в состояние ожидания и ставится в очередь ожидания флага. Функция может быть вызвана с таймаутом - если значение параметра timeout
не равно TN_WAIT_INFINITE
, то по прошествии timeout
системных тиков, функция вернет управление прерванной задаче с кодом возврата TERR_TIMEOUT
.
Если флаг evf
имеет атрибут TN_EVENT_ATTR_SINGLE
, а очередь ожидания флага не пуста, то функция вернет код ошибки TERR_ILUSE
, что означает попытку ожидания флага, предназначенного только для одной (уже ожидающей его) задачи.
Если флаг evf
имеет атрибут TN_EVENT_ATTR_CLR
, битовая маска флага обнуляется.
Параметр wait_mode
формирует условие ожидания флага. Если wait_mode == TN_EVENT_WCOND_OR
, то условие ожидания будет выполнено, если хотя бы один бит из битовой маски флага будет соответствовать wait_pattern
. Если wait_mode == TN_EVENT_WCOND_AND
, то для выполнения условия ожидания необходимо чтобы все биты битовой маски флага соответствовали параметру wait_pattern
.
Вызов:
TN_RETVAL tn_event_wait (TN_EVENT *evf, TN_UWORD wait_pattern, TN_UWORD wait_mode, TN_UWORD *p_flags_pattern, TN_TIMEOUT timeout );
Разрешен вызов:
В контексте задачи
Параметры функции:
evf
wait_pattern
wait_mode
TN_EVENT_WCOND_OR |
условие выполняется, если хотя бы один из битов маски флага совпадает с маской сравнения wait_pattern |
TN_EVENT_WCOND_AND |
условие выполняется только в том случае, если хотя все биты маски флага совпадают с маской сравнения wait_pattern |
p_flags_pattern
timeout
Возвращаемые значения:
TERR_WRONG_PARAM
TERR_NOEXS
TERR_WCONTEXT
TERR_ILUSE
TN_EVENT_ATTR_SINGLE
, если его очередь ожидания не пустаTERR_TIMEOUT
TERR_NO_ERR
Пример вызова:
TN_EVENT event_test; TN_UWORD flag; tn_event_wait(&event_test, 0x8000, TN_EVENT_WCOND_AND, &flag, TN_WAIT_INFINITE);