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