~~NOTOC~~ ===== tn_sem_acquire() ===== Сервис предназначен для захвата семафора. Если счетчик свободных ресурсов семафора больше нуля (семафор свободен), то задача, которая пытается захватить семафор продолжает выполнение, а счетчик ресурсов уменьшается на единицу. Если счетчик свободных ресурсов семафора равен нулю (семафор захвачен), то задача, которая пытается захватить семафор ставится в конец очереди задач ожидающих семафор и переводится в состояние ожидания. Счетчик ресурсов семафора не меняется. Параметр ''timeout'' задает время ожидания семафора в системных тиках. Если в течении этого времени семафор не будет захвачен задачей, она удаляется из очереди ожидающих семафор и переводится в состояние готовых к выполнению. Сервис возвращает значение ''TERR_TIMEOUT''. Если значение параметра ''timeout'' равно ''TN_WAIT_INFINITE'', то будет ожидать семафор до тех пор, пока он не освободиться. **Вызов:** TN_RETVAL tn_sem_acquire (TN_SEM *sem, TN_TIMEOUT timeout); **Разрешен вызов:** \\ В контексте задачи **Параметры функции:** ; ''sem'' : указатель на структуру семафора ; ''timeout'' : таймаут в течение которого задача ожидает семафор \\ **Возвращаемые значения:** ; ''TERR_WRONG_PARAM'' : некорректное значение параметра (__замечание:__ данный код возврата возможен только в случае использования сервисов с проверкой параметров) ; ''TERR_NOEXS'' : попытка захвата объекта, не являющегося семафором. ; ''TERR_WCONTEXT'' : попытка захвата семафора в прерывании или в пользовательской критической секции ; ''TERR_TIMEOUT'' : выход из сервиса по таймауту ; ''TERR_DLT'' : выход из сервиса, так как ожидаемый семафор удален ; ''TERR_NO_ERR'' : успешное выполнение \\ **Пример вызова:** TN_SEM sem_test; tn_sem_acquire(&sem_test, 10); \\ ---- [[tnkernel:ref:sem:intro#Сервисы управления семафорами|К списку сервисов]]