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 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 );
}
}
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 );
}
}