You are here

FreeRTOS ИПП: xTaskCreate()

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

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

 

xTaskCreate()

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

BaseType_t xTaskCreate(    TaskFunction_t pvTaskCode,
                            const char * const pcName,
                            configSTACK_DEPTH_TYPE usStackDepth,
                            void *pvParameters,
                            UBaseType_t uxPriority,
                            TaskHandle_t *pxCreatedTask
                      );

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

Настройка configSUPPORT_DYNAMIC_ALLOCATION в файле FreeRTOSConfig.h должна быть установлена в 1 (или оставлена неопределённой - в этом случае по-умолчанию она будет равна 1), чтобы эта функция FreeRTOS была доступна.

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

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

Параметры:

pvTaskCode Указатель на функцию входа в задачу (только имя функции, реализующей задачу - см. пример ниже).
Задачи как правило реализуются в виде бесконечного цикла. Функция, реализующая задачу, никогда не должна пытаться вернуться или выйти. Однако задачи могут удалять сами себя.
pcName Описательное имя задачи. В основном используется для облегчения отладки, но также может использоваться для получения дескриптора задачи.
Максимальная длина имени задачи определяется константой configMAX_TASK_NAME_LEN в файле FreeRTOSConfig.h.
usStackDepth Глубина стека. Количество слов (не байт!), выделенных для использования в качестве стека задачи. Например если стек имеет ширину 16 бит, а usStackDepth указана 100, то для размещения стека задачи будет выделено 200 байт. В качестве другого примера, если ширина стека 32 бита и usStackDepth равна 400, то для размещения стека задачи будет выделено 1600 байт.
Глубина стека, умноженная на ширину стека, не должна превышать максимальное значение, которое может содержаться в переменной типа size_t.
Дополнительно смотрите ЧаВо: Насколько большим должен быть стек?
pvParameters Значение, передаваемое как параметр создаваемой задаче. Если pvParameters указывает на переменную, то переменная всё ещё должна существовать во время выполнения созданной задачи, поэтому нельзя передавать адрес переменной, размещаемой в стеке.
uxPriority Приоритет, с которым будет выполняться задача.
Системы с поддержкой MPU могут дополнительно создавать задачу в привилегированном (системном) режиме, установив бит portPRIVILEGE_BIT в uxPrriority. Например, для создания привилегированной задачи с приоритетом 2, необходимо указать значение uxPrriority равным ( 2 | portPRIVILEGE_BIT ).
Приоритет должен быть меньше, чем значение configMAX_PRIORITIES. Если configASSERT не определён, приоритет автоматически ограничивается значением (configMAX_PRIORITIES - 1).
pxCreatedTask Используется для передачи дескриптора созданной задачи из функции xTaskCreate(). pxCreatedTask является необязательным и может иметь значение NULL.

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

Если задача была успешно создана, возвращается значение pdPASS. В противном случае возвращается значение errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY.

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

/* Код задача, которая будет создана. */
void vTaskCode( void * pvParameters )
{
    /* Значение параметра ожидается равным 1, т.к. это значение передаётся
    в вызове xTaskCreate() ниже. */
    configASSERT( ( ( uint32_t ) pvParameters ) == 1 );

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

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

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

    if( xReturned == pdPASS )
    {
        /* Задача была успешно создана. Используем дескриптор задачи для удаления задачи. */
        vTaskDelete( xHandle );
    }
}
Hobby's category: