You are here

FreeRTOS ИПП: xTaskCreateStatic()

Перевод может содержать ошибки. Читайте первоисточник: FreeRTOS Task Creation API Functions - xTaskCreateStatic()

Назад: [xTaskCreate()] Вверх: [ИПП: Создание задач] Вперёд: [xTaskCreateRestrictedStatic()]

 

xTaskCreateStatic()

Функция объявляется в файле task.h

TaskHandle_t xTaskCreateStatic(   TaskFunction_t pxTaskCode,
                                  const char * const pcName,
                                  const uint32_t ulStackDepth,
                                  void * const pvParameters,
                                  UBaseType_t uxPriority,
                                  StackType_t * const puxStackBuffer,
                                  StaticTask_t * const pxTaskBuffer
                              );

Вызов создаёт новую задачу и добавляет её в список задач, готовых к выполнению.

Настройка configSUPPORT_STATIC_ALLOCATION в файле FreeRTOSConfig.h должна быть установлена в 1, чтобы эта функция FreeRTOS была доступна.

Для каждой задачи требуется ОЗУ, которое используется для хранения состояния задачи и используется задачей в качестве стека. Если задача создаётся с помощью вызова xTaskCreate(), требуемая оперативная память автоматически выделяется из кучи FreeRTOS. Если задача создаётся с помощью вызова xTaskCreateStatic(), то ОЗУ предоставляется разработчиком приложения. Это требует увеличения количества параметров, но позволяет статически выделять ОЗУ во время компиляции. Дополнительную информацию можно найти на странице Статическое или динамическое выделение памяти.

При использовании FreeRTOS-MPU, рекомендуется использовать xTaskCreateRestricted() вместо xTaskCreateStatic(). 

Параметры:

pvTaskCode Указатель на функцию входа в задачу (только имя функции, реализующей задачу - см. пример ниже).
Задачи как правило реализуются в виде бесконечного цикла. Функция, реализующая задачу, никогда не должна пытаться вернуться или выйти. Однако задачи могут удалять сами себя.
pcName Описательное имя задачи. В основном используется для облегчения отладки, но также может использоваться для получения дескриптора задачи.
Максимальная длина имени задачи определяется константой configMAX_TASK_NAME_LEN в файле FreeRTOSConfig.h.
usStackDepth Параметр puxStackBuffer используется для передачи указателя на массив переменных типа StackType_t в xTaskCreateStatic(). А значение ulStackDepth должно быть установлено равным количеству индексов в массиве. Тип StackType_t определяется в файле portmacro.h.
Дополнительно смотрите ЧаВо: Насколько большим должен быть стек?
pvParameters Значение, передаваемое как параметр создаваемой задаче. Если pvParameters указывает на переменную, то переменная всё ещё должна существовать во время выполнения созданной задачи, поэтому нельзя передавать адрес переменной, размещаемой в стеке.
uxPriority Приоритет, с которым будет выполняться задача.
Системы с поддержкой MPU могут дополнительно создавать задачу в привилегированном (системном) режиме, установив бит portPRIVILEGE_BIT в uxPrriority. Например, для создания привилегированной задачи с приоритетом 2, необходимо указать значение uxPrriority равным ( 2 | portPRIVILEGE_BIT ).
Приоритет должен быть меньше, чем значение configMAX_PRIORITIES. Если configASSERT не определён, приоритет автоматически ограничивается значением ( configMAX_PRIORITIES - 1 ).
puxStackBuffer Этот параметр должен указывать на массив переменных типа StackType_t, имеющий как минимум индексы ulStackDepth (см. описание параметра ulStackDepth выше). Этот массив будет использоваться как стек задачи, поэтому он должен быть постоянным (не объявлен в стеке функции).
pxTaskBuffer Должен указывать на переменную типа StaticTask_t. Эта переменная будет использована для хранения структур данных (TCB - Task Control Block) новой задачи, поэтому переменная должна быть постоянной (не объявленной в стеке функции).

Возвращаемое значение:

Если ни puxStackBuffer, ни pxTaskBuffer не имеют значение NULL, то задача будет создана и будет возвращён дескриптор задачи. Если puxStackBuffer или pxTaskBuffer имеет значение NULL, задача не будет создана, а возвращено будет значение NULL.

Пример использования:

/*  Размер буфера, который будет использоваться задачей в качестве стека.
Примечание: это количество слов, которое может быть размещено в стеке.
Т.е. НЕ количество байт. Напрмер, если каждый элемент стека
является 32-битным словом и это значение задано 100, то для стека будет
выделено 400 байт (100 * 32бита). */
#define STACK_SIZE 200

/* Структура, в которой будет содержаться TCB (TaskControlBlock)
создаваемой задачи */
StaticTask_t xTaskBuffer;

/* Буфер, который создаваемая задача будет использовать в качестве стека.
Заметьте, что это массив переменных типа StackType_t. Размер StackType_t зависит
от конкретного порта FretRTOS. */
StackType_t xStack[ STACK_SIZE ];

/* Функция, реализующая задачу, которая будет создаваться. */
void vTaskCode( void * pvParameters )
{
    /* Значение параметра ожидается равным 1, т.к. в
    вызове xTaskCreateStatic() значение pvParameters передаётся именно 1. */
    configASSERT( ( uint32_t ) pvParameters == 1UL );

    for( ;; )
    {
        /* Собственно код задачи. */
    }
}

/* Функция, которая создаёт задачу. */
void vOtherFunction( void )
{
    TaskHandle_t xHandle = NULL;

    /* Создаём задачу без использования динамического распределения памяти. */
    xHandle = xTaskCreateStatic(
                  vTaskCode,       /* Функция, реализующая задачу. */
                  "NAME",          /* Текстовое имя задачи. */
                  STACK_SIZE,      /* Количество индексов в массиве xStack. */
                  ( void * ) 1,    /* Параметр, передаваемый задаче. */
                  tskIDLE_PRIORITY,/* Приоритет, с которым задача создаётся. */
                  xStack,          /* Массив, используемый в качестве стека задачи. */
                  &xTaskBuffer );  /* Переменная для хранения структуры данных задачи. */

    /* puxStackBuffer и pxTaskBuffer имеют значения отличные от NULL, поэтому
    задача была создана, и xHandle является дескриптором задачи. Используем
    дескриптор для приостановки задачи. */
    vTaskSuspend( xHandle );
}
Hobby's category: