~~NOTOC~~
===== tn_task_create() =====
{{tnkernel:ref:attr_call_task.png|Разрешен вызов только в контексте задачи}}
Функция предназначена для создания задачи. Поле ''id_task'' TCB задачи ''task'' должно быть равно нулю до момента создания задачи, таким образом уже созданные задачи защищаются от повторного создания. Память для управляющей структуры TCB ''task'' и для стека задачи должна быть выделена до момента создания задачи. Память может быть выделена на этапе компиляции (объявление глобальной переменной типа ''TN_TASK'' для TCB задачи и массива с элементами типа ''TN_UWORD'' для стека задачи), либо динамически, если пользовательское приложение использует менеджер памяти.
Размер стека задачи ''tn_task_size'' должен быть выбран исходя из количества локальных переменных в функции задачи, дерева вызовов, количество и вложенности прерываний и других специфичных для конкретного приложения параметров. В любом случае стек должен полностью вмещать контекст задачи. В любом случае размер массива должен быть больше или равен ''TN_MIN_STACK_SIZE''.
Стек задачи - это массив элементов типа ''TN_UWORD'', разрядность ''TN_UWORD'' соответствует разрядности машинного слова микроконтроллера. Для ARM7 ''sizeof(TN_UWORD) = 4'', для PIC24/dsPIC ''sizeof(TN_UWORD) = 2''.
Параметр ''task_stack_start'' является указателем на вершину стека. Если в используемой архитектуре стек растет от младшего адреса к старшему (PIC24/dsPIC), то параметр ''task_stack_start'' должен быть равен адресу первого элемента массива. В противном случае параметр должен быть равен последнему элементу массива.
**Вызов:**
TN_RETVAL tn_task_create(TN_TCB *task,
void (*task_func)(void *param),
TN_UWORD priority,
TN_UWORD *task_stack_start,
TN_UWORD task_stack_size,
void *param,
TN_UWORD option
);
**Разрешен вызов:** \\
В контексте задачи
**Параметры функции:**
; ''task'' : указатель TCB задачи. Структура TCB должна быть создана до момента вызова функции, статически или динамически
; ''(*task_func)(void *param)'' : указатель на функцию задачи. Функция задачи имеет следующий прототип: ''void (*task_func)(void *param)''
; ''priority'' : приоритет задачи. Пользовательские задачи могут иметь приоритет от 1 до ''TN_NUM_PRIORITY - 1'' включительно(приоритеты 0 и ''TN_NUM_PRIORITY'' зарезервированы для служебных задач)
; ''task_stack_start'' : указатель на стек задачи. Для PIC24/dsPIC - указатель на первый элемент массива стека задачи
; ''task_stack_size'' : размер стека задачи в машинных словах (количество элементов в массиве стека)
; ''param'' : параметр передаваемый в функцию задачи
; ''option'' : параметр создания задачи, может принимать одно из двух значений:
{| class = "fpl"
|-
| ''TN_TASK_DORMANT_ON_CREATION''
| после создания задача переводится в состояние //DORMANT//
|-
| ''TASK_START_ON_CREATION''
| после создания задача переводится в состояние //RUNNABLE//
|}
**Возвращаемые значения:**
; ''TERR_WRONG_PARAM'' : некорректное значение параметра (__замечание:__ данный код возврата возможен только в случае использования сервисов с проверкой параметров)
; ''TERR_WCONTEXT'' : попытка создания задачи в прерывании или в пользовательской критической секции
; ''TERR_EXS'' : попытка создания задачи, которая уже создана
; ''TERR_NO_ERR'' : успешное выполнение
\\
**Пример вызова:**
#define TASK_1_STACK_SIZE 128 /* размер стека задачи */
#define TASK_1_PRIORITY 11 /* приоритет задачи */
TN_TCB tcb_Task1 TN_DATA; /* TCB задачи */
TN_UWORD stk_Task1[TASK_1_STACK_SIZE] TN_DATA; /* стек задачи */
void TN_TASK Task1(void *par); /* прототип функции задачи */
/* ... создание задачу... */
tn_task_create(&tcb_Task1,
Task1,
TASK_1_PRIORITY,
stk_Task1,
TASK_1_STACK_SIZE,
TN_NULL,
TN_TASK_START_ON_CREATION
);
/* ... */
void TN_TASK Task1 (void *par) /* функция задачи */
{
for (;;)
{
tn_task_sleep(10);
}
}
\\
----
[[tnkernel:ref:task:intro#сервисы_управления_задачами|К списку сервисов]]