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