
跟着正点原子整理了一些笔记一、任务控制块 TCBtskTaskControlBlock每个任务都有独立 TCB相当于任务的身份证内核靠 TCB 管理任务typedef struct tskTaskControlBlock { volatile StackType_t * pxTopOfStack; /* 任务栈栈顶必须是TCB第一个成员上下文切换保存恢复用 */ ListItem_t xStateListItem; /* 任务状态列表项 */ ListItem_t xEventListItem; /* 任务事件列表项 */ UBaseType_t uxPriority; /* 任务优先级数值越大优先级越高 */ StackType_t * pxStack; /* 任务栈起始地址 */ char pcTaskName[configMAX_TASK_NAME_LEN];/* 任务名字 */ …… /* 其余省略 */ } tskTCB;二、动态创建任务xTaskCreate()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 /* 任务句柄操作任务的标识 */ );使用步骤上层调用宏configSUPPORT_DYNAMIC_ALLOCATION配置为1定义函数入口参数编写任务函数函数内部实现申请堆栈内存 TCB 任务控制块内存TCB 结构体成员赋值添加新任务到就绪列表创建后任务直接进入就绪态等待调度器调度运行三、静态创建任务xTaskCreateStatic()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任务控制块缓冲区地址 );使用步骤宏configSUPPORT_STATIC_ALLOCATION配置为1定义空闲任务 定时器任务 的任务堆栈及 TCB实现 2 个接口函数vApplicationGetIdleTaskMemory()vApplicationGetTimerTaskMemory()定义函数入口参数编写任务函数内部实现TCB 结构体成员赋值添加新任务到就绪列表对比小结·动态内核自动申请任务控制块内存简单内存碎片风险TaskHandle_t * const pxCreatedTask // 任务句柄操作任务的标识·静态用户预先分配任务控制块内存无 mallocStackType_t * const puxStackBuffer //栈缓冲区数组地址StaticTask_t * const pxTaskBuffer //TCB任务控制块缓冲区地址四、任务删除vTaskDeletevoid vTaskDelete(TaskHandle_t xTaskToDelete);功能将任务从就绪、阻塞、挂起、事件列表全部移除。重要注意点参数为NULL删除当前正在运行的任务自己内存释放规则空闲任务负责释放系统分配的内存用户自己 malloc 申请的内存必须在任务删除前手动释放否则内存泄漏使用步骤宏INCLUDE_vTaskDelete配置为1传入任务句柄NULL 代表删除自身内部执行流程根据任务句柄找到待删除任务的 TCBNULL 代表删自己将任务从所有关联链表就绪 / 阻塞 / 挂起 / 事件移除判断任务类型删除自身加入等待删除列表内存由空闲任务后续释放删除别的任务直接释放内存任务计数 - 1更新下一个任务的阻塞超时时间防止被删任务刚好是下一个超时任务