tn_task_create()

Разрешен вызов только в контексте задачи

Функция предназначена для создания задачи. Поле 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
параметр создания задачи, может принимать одно из двух значений:

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);
    }
}



К списку сервисов