Анализ функций 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
);
резюме
Создайте новый экземпляр задачи.
Каждая задача требует ОЗУ для сохранения состояния задачи (блок управления задачами или TCB) и используется задачей в качестве своего стека. Если задача была создана с помощью xTaskCreate (), вам необходимо автоматически выделить ОЗУ из кучи FreeRTOS. Если вы используете xTaskCreateStatic () для создания задачи, средство записи приложения предоставляет ОЗУ, что приводит к двум дополнительным параметрам функции, но позволяет статическое распределение ОЗУ во время компиляции.
Вновь созданная задача изначально находится в состоянии готовности, но если задача с более высоким приоритетом не может быть запущена, она немедленно станет запущенной задачей.
Задача может быть создана до и после запуска планировщика.
параметры
параметры | функция |
---|---|
pvTaskCode | Целевая функция |
PCNAME | Название задачи |
usStackDepth | Размер стека задач |
pvParameters | Параметр задачи |
uxPriority | Приоритет задачи |
pxCreatedTask | Дескриптор задачи |
Возвращаемое значение
Возвращаемое значение | смысл |
---|---|
pdPass | Указывает, что задача была успешно создана. |
errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY | Указывает, что задача не может быть создана, потому что FreeRTOS не имеет достаточно памяти в куче для выделения структуры данных и стека задачи. Если проект содержит heap_1.c, heap_2.c или heap_4.c, configTOTAL_HEAP_SIZE в FreeRTOSConfig определяет общий объем доступной кучи. Используйте функцию обратного вызова vApplicationMallocFailedHook () (или «ловушку»), чтобы перехватить ошибку при выделении памяти, и используйте функцию API xPortGetFreeHeapSize (), чтобы запросить оставшийся объем свободной памяти кучи. Если в проект включен файл heap_3.c, конфигурация компоновщика будет определять общий размер кучи. |
Используйте подпрограммы
/* Task to be created. */
void vTaskCode( void * pvParameters )
{
/* The parameter value is expected to be 1 as 1 is passed in the
pvParameters value in the call to xTaskCreate() below. configASSERT( ( ( uint32_t ) pvParameters ) == 1 );
for( ;; )
{
/* Task code goes here. */
}
}
/* Function that creates a task. */
void vOtherFunction( void )
{
BaseType_t xReturned;
TaskHandle_t xHandle = NULL;
/* Create the task, storing the handle. */
xReturned = xTaskCreate(
vTaskCode, /* Function that implements the task. */
"NAME", /* Text name for the task. */
STACK_SIZE, /* Stack size in words, not bytes. */
( void * ) 1, /* Parameter passed into the task. */
tskIDLE_PRIORITY,/* Priority at which the task is created. */
&xHandle ); /* Used to pass out the created task's handle. */
if( xReturned == pdPASS )
{
/* The task was created. Use the task's handle to delete the task. */vTaskDelete( xHandle );
}
}
объяснение
В FreeRTOSConfig.h configSUPPORT_DYNAMIC_ALLOCATION должен быть установлен в 1 (поддержка приложения с динамической памятью) или просто не определен, чтобы сделать эту функцию доступной.