freertos中xTaskCreate和vTaskDelete详解
freertos中文资料官网,大家可以自行查看
https://www.freertos.org/zh-cn-cmn-s/Documentation/00-Overview
xTaskCreate
功能:创建一项新任务 并将其添加到准备运行的任务列表中。
// task.h
BaseType_t xTaskCreate( TaskFunction_t pvTaskCode,const char * const pcName,const configSTACK_DEPTH_TYPE uxStackDepth,void *pvParameters,UBaseType_t uxPriority,TaskHandle_t *pxCreatedTask);
configSUPPORT_DYNAMIC_ALLOCATION 必须在 FreeRTOSConfig.h 中设置为 1,或处于未定义状态(默认为 1), 才可使用此 RTOS API 函数。
每项任务都需要 RAM 来保存任务状态,并由任务用作其堆栈。如果 使用 xTaskCreate() 创建任务,则所需的 RAM 会自动 从 freertos堆分配。
参数:
pvTaskCode
指向任务入口函数的指针(即实现任务的函数名称,请参阅如下示例)。 任务通常已无限循环的形式实现;
注意:实现任务的函数 绝不能尝试返回或退出,但是任务可以使用API接口删除;
pcName
任务的描述性名称。此参数主要用于方便调试,但也可用于 获取任务句柄。任务名称的最大长度 由 FreeRTOSConfig.h 中的 configMAX_TASK_NAME_LEN 定义。
注意:任务名称长度一定不要大于最大程度,防止溢出;
uxStackDepth
要分配用作任务堆栈的字数(不是字节数!)。例如,如果 堆栈宽度为 16 位,uxStackDepth 为 100,则将分配 200 字节用作任务 堆栈。再举一例,如果堆栈宽度为 32 位,uxStackDepth 为 400, 则将分配 1600 字节用作任务堆栈。堆栈深度与堆栈宽度的乘积不得超过 size_t 类型变量所能包含的最大值。
注意:实际创建任务的时候,会*sizeof( StackType_t );
configTOTAL_HEAP_SIZE 定义的是字节数长度,两个宏一定要区分清楚;
static TCB_t * prvCreateTask( TaskFunction_t pxTaskCode,const char * const pcName,const configSTACK_DEPTH_TYPE uxStackDepth,void * const pvParameters,UBaseType_t uxPriority,TaskHandle_t * const pxCreatedTask )
{...pxStack = pvPortMallocStack( ( ( ( size_t ) uxStackDepth ) * sizeof( StackType_t ) ) );....
}
pvParameters
作为参数传递给所创建任务的值。如果 pvParameters 设置为某变量的地址, 则在创建的任务执行时,该变量必须仍然存在, 因此,不能传递堆栈变量的地址。
uxPriority
创建的任务将以该指定优先级执行。应断言优先级 低于 configMAX_PRIORITIES。如果 configASSERT 未定义,则优先级默认上限为 (configMAX_PRIORITIES - 1)。
注意:任务优先级数值越小,任务优先级越低
pxCreatedTask
用于将句柄传递至由 xTaskCreate() 函数创建的任务。pxCreatedTask 是可选参数, 可设置为 NULL。
注意:建议不要使用NULL, 后面很多API接口都是使用该句柄;
返回:
如果任务创建成功,则返回 pdPASS,
否则返回 errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY。
注意:可通过将函数返回值打印出来,观察任务是否创建失败;
用法示例:
/* Task to be created. */
void vTaskCode( void * pvParameters )
{/* The parameter value is expected to be 1 as 1 is passed in thepvParameters 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 );}
}
vTaskDelete
// task.h
void vTaskDelete( TaskHandle_t xTask );
INCLUDE_vTaskDelete
必须定义为 1,才可使用此函数。
从 RTOS 内核管理中移除任务。要删除的任务将从所有就绪、 阻塞、挂起和事件列表中移除。
注意:空闲任务负责释放由 RTOS 内核分配给已删除任务的 内存。因此,如果应用程序调用了
vTaskDelete()
,请务必确保空闲任务获得足够的微控制器处理时间。任务代码分配的内存不会自动释放, 应在任务删除之前手动释放。
参数:
xTask
要删除的任务的句柄。如果传递 NULL,会删除调用任务。 建议大家创建任务的时候使用 pxCreatedTask 参数
用法示例
void vOtherFunction( void )
{TaskHandle_t xHandle = NULL;// Create the task, storing the handle.xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );// Use the handle to delete the task.if( xHandle != NULL ){vTaskDelete( xHandle );}
}