Перевод может содержать ошибки. Читайте первоисточник: FreeRTOS Task Creation API Functions - xTaskCreate()
Назад: [TaskHandle_t] | Вверх: [ИПП: Создание задач] | Вперёд: [xTaskCreateStatic()] |
Функция объявляется в файле 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 );
}
}