~~NOTOC~~
===== tn_event_wait() =====
Функция предназначена для перевода вызвавшей ее задачи в состояние ожидания до тех пор, пока условие совпадения с битовой маской флага ''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'' : режим ожидания, формирующий условие, может принимать одно из двух значений:
{| class = "fpl"
|-
| ''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);
\\
----
[[tnkernel:ref:event:intro#Сервисы управления флагами|К списку сервисов]]