当前位置: 首页 > news >正文

vTaskDelete 的作用

以下是添加了详细中文注释的 vTaskDelete函数,逐段解释其逻辑和关键操作:


函数定义与变量声明

void vTaskDelete(TaskHandle_t xTaskToDelete)
{TCB_t *pxTCB;  // 指向任务控制块(TCB)的指针
  • 功能​:删除指定的FreeRTOS任务。

  • 参数​:

    • xTaskToDelete:要删除的任务句柄(若为NULL则删除当前任务)。


进入临界区

taskENTER_CRITICAL();  // 进入临界区,防止任务调度干扰{
  • 作用​:保护任务删除操作的原子性。


获取任务TCB

/* 若参数为NULL,则删除当前正在运行的任务 */pxTCB = prvGetTCBFromHandle(xTaskToDelete);
  • 关键点​:

    • prvGetTCBFromHandle:将任务句柄转换为TCB结构体指针。

    • 若传入NULL,内部会自动获取当前任务的TCB。


从就绪/阻塞列表中移除任务

/* 将任务从就绪/阻塞列表中移除 */if (uxListRemove(&(pxTCB->xStateListItem)) == (UBaseType_t)0){taskRESET_READY_PRIORITY(pxTCB->uxPriority);  // 若该优先级无其他任务,清除就绪位}else{mtCOVERAGE_TEST_MARKER();  // 覆盖率测试标记(无实际代码)}
  • 逻辑​:

    • uxListRemove:从列表移除任务,返回剩余任务数。

    • 若返回0,表示该优先级无其他就绪任务,需重置优先级位图。


检查事件等待列表

/* 检查任务是否在等待事件(如信号量、队列) */if (listLIST_ITEM_CONTAINER(&(pxTCB->xEventListItem)) != NULL){(void)uxListRemove(&(pxTCB->xEventListItem));  // 从事件列表中移除}else{mtCOVERAGE_TEST_MARKER();}
  • 作用​:确保任务不会因删除导致事件列表出现悬空指针。


更新任务编号

/* 递增任务编号,便于调试工具检测任务列表变化 */uxTaskNumber++;
  • 用途​:内核感知型调试器可通过此值判断任务列表是否需要刷新。


处理当前任务自删除

if (pxTCB == pxCurrentTCB)  // 如果是当前任务删除自身{/* 将任务TCB插入终止列表,由空闲任务负责内存回收 */vListInsertEnd(&xTasksWaitingTermination, &(pxTCB->xStateListItem));/* 通知空闲任务有任务待清理 */++uxDeletedTasksWaitingCleanUp;/* 调用跟踪钩子函数(用于调试) */traceTASK_DELETE(pxTCB);/* 平台特定的删除前钩子(如Windows模拟器清理) */portPRE_TASK_DELETE_HOOK(pxTCB, &xYieldPending);}
  • 关键流程​:

    1. 自删除任务无法立即释放资源(需切换上下文)。

    2. 将TCB放入终止列表,由空闲任务异步回收内存。

    3. 钩子函数用于平台特定清理(如模拟器环境)。


处理其他任务删除

else  // 删除其他任务{--uxCurrentNumberOfTasks;  // 更新全局任务计数器traceTASK_DELETE(pxTCB);   // 调试跟踪prvDeleteTCB(pxTCB);       // 直接释放TCB和栈内存/* 重置下一个任务解除阻塞时间(避免引用已删除任务) */prvResetNextTaskUnblockTime();}
  • 区别​:

    • 非自删除任务可直接同步释放资源。

    • 需检查并更新调度器的时间基准。


退出临界区

}taskEXIT_CRITICAL();  // 退出临界区
  • 作用​:恢复中断和任务调度。


触发任务调度

/* 若删除的是当前任务且调度器已启动,强制触发上下文切换 */if (xSchedulerRunning != pdFALSE){if (pxTCB == pxCurrentTCB)  // 自删除场景{configASSERT(uxSchedulerSuspended == 0);  // 确保调度器未挂起portYIELD_WITHIN_API();                   // 主动让出CPU}else{mtCOVERAGE_TEST_MARKER();}}
}
  • 关键点​:

    • 自删除任务必须立即切换上下文,否则会继续执行非法内存。

    • portYIELD_WITHIN_API:触发调度器选择下一个就绪任务。


总结流程图

开始│├─ 进入临界区│   ├─ 获取TCB│   ├─ 从就绪/阻塞列表移除│   ├─ 从事件列表移除(若存在)│   ││   ├─ 如果是自删除任务:│   │   ├─ 加入终止列表│   │   ├─ 通知空闲任务清理│   │   └─ 调用平台钩子│   ││   └─ 如果是其他任务:│       ├─ 释放TCB内存│       └─ 重置解除阻塞时间│└─ 退出临界区│└─ 若自删除且调度器运行:└─ 强制上下文切换
结束

注意事项

  1. 内存安全​:

    • 自删除任务的栈和TCB由空闲任务回收,需确保空闲任务有执行机会。

  2. 资源泄漏​:

    • 任务删除前应释放其占用的所有资源(如动态内存、外设句柄)。

  3. 实时性​:

    • 在中断中调用时,需使用 xTaskDeleteFromISR并处理上下文切换请求。

http://www.dtcms.com/a/521244.html

相关文章:

  • 【笔记】ComfyUI KeyError: ‘tensorrt‘ 错误的完整解决方案
  • 网站下载软件wordpress修改上传文件路径
  • 加盟招商网站建设方案木卢seo教程
  • 【javaFX基础】实现图形能够根据窗口大小自动调整位置
  • 针对餐饮公司推广做网站方法河间网站
  • 接口和继承类的对比
  • 瑞安自适应网站建设建设一个公司的网站需要多少钱
  • 婚庆网站哪个网站好手机网站的好处
  • RCLAMP2402B.TCT ESD保护二极管/TVS二极管 Semtech升特 电路保护方案解析
  • 广东网站优化公司上海seo优化服务公司
  • 索引失效的问题如何排查?
  • 小九源码-springboot099-基于Springboot的本科实践教学管理系统
  • 单位网站设计建议书世界500强企业排行榜
  • 深圳制作网站多少费用电子商务有哪些职业
  • 【Spring Security】授权(二)
  • 塘沽网站开发企业站网页制作实训步骤
  • jsp电影网站开发教程单位外部网站建设价格
  • 哈尔滨住房和城乡建设厅网站做网站原型现成的框架
  • 做网站实现发送信息功能号卡分销系统源码
  • 用Python Streamlit Sqlite3 写一个简单商品管理系统
  • LazyLLM 创新实践:LLM 与工具协同,构建智能客服问答与知识库检索助手
  • 网站主体负责人邮箱wordpress国外空间
  • 网站建设公制度网页设计与制作实训报告两千字
  • 算力赋能,智见未来 | 国鑫亮相ICG-20,共赴组学与AI新纪元
  • 阿里巴巴网站的功能win 无法卸载 wordpress
  • 慧园区:科技赋能下的城市空间新范式
  • 网站建设费一般是什么费用网页设计的背景代码大全
  • 现在网站开发语言有各大网站搜索引擎提交入口
  • 【MCU控制 初级手札】1.4 化合物 【化学基础】
  • 基于SpringBoot+Vue的DIY手工社预约管理系统(Echarts图形化、腾讯地图API)