~~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#Сервисы управления флагами|К списку сервисов]]