freertos任务创建和删除api函数(正点原子笔记)

发布时间:2026/7/31 5:59:49
freertos任务创建和删除api函数(正点原子笔记) 1.任务的创建和删除本质就是调用FreeRTOS的API函数xTaskCreate() //动态创建任务 xTaskCreateStatic() //静态创建任务 vTaskDelete() //删除任务动态创建xTskcreate()任务控制块TCB、任务栈内存全部是有freertos自有堆自动分配也就是在FreeRTOSConfig.h头文件这个宏定义动态创建所需的内存会在这个堆区中分配。//系统所有总的堆大小 #define configTOTAL_HEAP_SIZE ((size_t)(10*1024))静态创建xTskcreateStatic()TCB缓冲区、任务栈数组全部由用户提前自定义分配不占用FreeRTOS的堆空间占用芯片全局的RAM。动态创建任务函数BaseType_t xTaskCreate ( TaskFunction_t pxTaskCode, /* 指向任务函数的指针 */ const char * const pcName, /* 任务名字最大长度configMAX_TASK_NAME_LEN */ const configSTACK_DEPTH_TYPE usStackDepth, /* 任务堆栈大小注意字为单位 */ void * const pvParameters, /* 传递给任务函数的参数 */ UBaseType_t uxPriority, /* 任务优先级范围0 ~ configMAX_PRIORITIES - 1 */ TaskHandle_t * const pxCreatedTask /* 任务句柄就是任务的任务控制块 */ )返回值pdPASS任务创建成功errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY堆内存不足创建失败使用前需要将FreeRTOSConfig.h中的动态分配内存宏定义开启//支持动态内存申请 #define configSUPPORT_DYNAMIC_ALLOCATION 1底层执行流程1.从 FreeRTOS 堆中申请两块独立内存任务栈空间 TCB 任务控制块空间2.对 TCB 结构体所有成员赋值栈顶指针、优先级、任务名、链表节点等3.初始化任务栈预先写入任务函数入口地址模拟任务第一次运行的上下文4.将当前 TCB 挂载到系统就绪任务链表任务进入就绪态等待调度器调度5.将 TCB 地址赋值给任务句柄供外部 API 操作该任务。TCB控制块tcb是每个任务的专属身份证一个任务对应唯一一块tcbtypedef struct tskTaskControlBlock { volatile StackType_t * pxTopOfStack; // 栈顶指针任务切换保存/恢复上下文核心 ListItem_t xStateListItem; // 就绪/阻塞/挂起链表挂载节点 ListItem_t xEventListItem; // 等待信号量、队列时挂载事件链表 UBaseType_t uxPriority; // 任务优先级数值越大优先级越高 StackType_t * pxStack; // 任务栈内存起始地址 char pcTaskName[configMAX_TASK_NAME_LEN]; // 任务名称 // 省略延时计数、内核标记等条件编译成员 } tskTCB;静态创建任务函数TaskHandle_t xTaskCreateStatic ( TaskFunction_t pxTaskCode, const char * const pcName, const uint32_t ulStackDepth, void * const pvParameters, UBaseType_t uxPriority, StackType_t * const puxStackBuffer, // 用户自定义任务栈数组 StaticTask_t * const pxTaskBuffer // 用户自定义TCB存储缓冲区 );返回值NULL用户传入内存非法创建失败非空指针任务句柄TCB 地址创建成功。使用前需要配置静态分配宏#define configSUPPORT_STATIC_ALLOCATION 1同时必须实现两个系统接口给空闲任务、定时器任务提供静态内存vApplicationGetIdleTaskMemory()提供空闲任务 TCB 与栈内存vApplicationGetTimerTaskMemory()提供软件定时器任务 TCB 与栈内存。任务删除函数void vTaskDelete(TaskHandle_t xTaskToDelete);入口参数是待删除任务句柄传入null代表删除当前运行任务自身使用前配置删除功能宏定义#define INCLUDE_vTaskDelete 1底层执行逻辑通过任务句柄找到对应的TCB将该任务从就绪、阻塞、挂起、事件全部链表中移除删除其他任务时直接释放动态分配的TCB、栈内存存回freertos堆区删除自身任务时尽标记为待删除内存回收交给空闲任务完成之后刷新系统阻塞链表超时时间避免调度异常