Análisis de la función 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
);
Resumen
Crea una nueva instancia de tarea.
Cada tarea requiere RAM para guardar el estado de la tarea (bloque de control de tarea o TCB), y la tarea la utiliza como su pila. Si la tarea se creó usando xTaskCreate (), debe asignar RAM automáticamente desde el montón de FreeRTOS. Si usa xTaskCreateStatic () para crear una tarea, el escritor de la aplicación proporciona RAM, que da como resultado dos parámetros de función adicionales, pero permite la asignación de RAM estática en el momento de la compilación.
La tarea recién creada está inicialmente lista, pero si no se puede ejecutar una tarea de mayor prioridad, se convertirá inmediatamente en una tarea en ejecución.
La tarea se puede crear antes y después de iniciar el planificador.
Parámetro
Parámetro | Función |
---|---|
pvTaskCode | Función de la tarea |
pcName | Nombre de la tarea |
usStackDepth | Tamaño de pila de tareas |
pvParameters | Parámetro de la tarea |
uxPriority | Prioridad de la tarea |
pxCreatedTask | Manejador de tareas |
Valor de retorno
Valor de retorno | Significado |
---|---|
pdPass | Indica que la tarea se ha creado correctamente. |
errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY | Indica que la tarea no se puede crear porque FreeRTOS no tiene suficiente memoria de almacenamiento dinámico para asignar la estructura de datos de la tarea y la pila. Si el proyecto contiene heap_1.c, heap_2.c o heap_4.c, configTOTAL_HEAP_SIZE en FreeRTOSConfig define la cantidad total de almacenamiento dinámico disponible. Use la función de devolución de llamada (o "gancho") vApplicationMallocFailedHook () para detectar la falla al asignar memoria, y use la función API xPortGetFreeHeapSize () para consultar la cantidad restante de memoria libre. Si heap_3.c se incluye en el proyecto, la configuración del vinculador definirá el tamaño total del montón. |
Usa rutinas
/* 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 );
}
}
Explicación
En FreeRTOSConfig.h, configSUPPORT_DYNAMIC_ALLOCATION debe establecerse en 1 (admite la aplicación de memoria dinámica), o simplemente no está definido para que esta función esté disponible.