~~NOTOC~~
===== tn_task_exit() =====
{{tnkernel:ref:attr_call_task.png|Разрешен вызов только в контексте задачи}} {{tnkernel:ref:attr_call_ct_sw.png|Может привести к переключению контекста}}
Функция прекращает выполнение текущей задачи, при этом задача перемещается в состояние //DORMANT//. Все ресурсы ([[tnkernel:ref:mutex:intro|мютексы]]) занятые задачей разблокируются. Задача может быть дополнительно удалена, если сервис вызван с параметром ''TN_EXIT_AND_DELETE_TASK''.
Если счетчик запросов на активацию задачи больше 1, то счетчик декрементируется, а задача переводится в состояние //READY//. Как только задача станет наиболее приоритетной, она запустится с точки входа в функцию задачи (так же как и первый раз после создания). Следует заметить, что задача будет поставлена в очередь готовых к выполнению (этого же приоритета) последней.
Задача может быть выведена из состояния //DORMANT// с помощью сервисов ''tn_task_activate()'' и ''tn_task_iactivate()''. В этом случае задача будет запущена с точки входа в функцию задачи и поставлена в очередь готовых к выполнению (этого же приоритета) последней.
Функция ''tn_task_exit()'' может использоваться только для прекращения выполнения текущей задачи. Для прекращения выполнения другого потока необходимо использовать функцию ''tn_task_terminate()''.
**Вызов:**
void tn_task_exit (TN_UWORD attr);
**Разрешен вызов:** \\
В контексте задачи
**Параметры функции:**
; ''attr'' : параметр, который указывает, будет ли задача удалена после прекращения выполнения:
{| class = "fpl"
|-
| ''TN_EXIT_TASK''
| функция прекратит выполнение текущей задачи. Для запуска задачи необходимо использовать сервисы ''tn_task_activate()'' или ''tn_task_iactivate()''
|-
| ''TN_EXIT_AND_DELETE_TASK''
| после прекращения выполнения задача будет удалена. Для запуска удаленной задачи нужно создать ее заново функцией ''tn_task_create''
|}
\\
**Возвращаемые значения:**
нет
**Пример вызова:**
extern TN_TCB tcb_Task1 TN_DATA;
/* ... */
void Task1 (void *param)
{
for (;;)
{
if (need_restart_task_1)
tn_task_exit(TN_EXIT_TASK);
/* ... */
}
}
\\
----
[[tnkernel:ref:task:intro#сервисы_управления_задачами|К списку сервисов]]