Функция предназначена для создания задачи. Поле 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
(*task_func)(void *param)
void (*task_func)(void *param)
priority
TN_NUM_PRIORITY - 1
включительно(приоритеты 0 и TN_NUM_PRIORITY
зарезервированы для служебных задач)task_stack_start
task_stack_size
param
option
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); } }