通过BUG(prvIdleTask、pxTasksWaitingTerminatio不断跳转问题)了解空闲函数(prvIdleTask)和TCB

一、前言与问题

在基于 FreeRTOS 的嵌入式系统中,我使用 STM32F1 开发一个 MQTT 客户端应用,涉及两个主要任务:

  • ATRecvParser:负责解析 Wi-Fi 模块的 AT 命令响应(如 OK、ERROR 和 +IPD 数据)。
  • MQTT_Client_Task:通过 MQTT 协议连接服务器,订阅主题并发布消息。

在运行过程中,程序出现以下异常:

  1. 调用栈跳转:调试器显示程序在 prvIdleTask(空闲任务)prvCheckTasksWaitingTermination(FreeRTOS 内部清理函数)之间反复跳转,无法正常运行。
  2. TCB 异常:任务控制块(TCB)的 pxTCB 值显示为 0xA5A5A5A5(未初始化值),表明 TCB 可能损坏。

    二、了解空闲任务prvIdleTask、pxTasksWaitingTerminatio、TCB

    1、什么是空闲任务-----prvIdleTask

    1.调用时间

    在没有其他任务可运行时(没有任何其他任务处于就绪态)保持 CPU 忙碌

    2.调用例子:

    系统中有三个任务:defaultTaskATRecvParser MQTT_Client_Task

    • defaultTask 调用 osDelay(1),几乎一直处于阻塞态。
    • ATRecvParser 因 HAL_AT_Secv 阻塞。
    • MQTT_Client_Task 已删除,不再调度。

    此时,当系统中无其他就绪任务时,调度器将 CPU 分配给 prvIdleTask。

      3.特征

    • 自动创建,优先级最低(通常为 0)。
    • prvIdleTask 是一个无限循环任务,包含 for(;;) 循环,定期检查系统状态。
    • 执行低优先级操作(如电源管理钩子)。
    • 调用 prvCheckTasksWaitingTermination 清理已删除任务。
    • (避免进入低功耗模式,视配置而定)。

    二、什么是pxTasksWaitingTerminatio

    • prvCheckTasksWaitingTermination
      • 这是 FreeRTOS 内部函数(定义在 tasks.c 中),负责检查并清理 pxTasksWaitingTermination 列表中的已删除任务。
      • 当任务被 vTaskDelete 标记为待删除时,FreeRTOS 将其 TCB 加入该列表。prvCheckTasksWaitingTermination 会释放 TCB 和栈内存,但前提是任务列表有效且资源可用。
      • 如果 TCB 指针无效或列表遍历出错,函数可能进入死循环或异常状态。

    关系:

    • prvIdleTask 是 prvCheckTasksWaitingTermination 的调用者之一。空闲任务在系统空闲时运行,负责清理工作,因此当 MQTT_Client_Task 删除后,prvIdleTask 会尝试调用 prvCheckTasksWaitingTermination。

    三、TCB

    TCB(Task Control Block,任务控制块) 是 FreeRTOS 中用于管理任务的核心数据结构。它存储了一个任务的所有关键信息,以便 FreeRTOS 调度器能够正确地创建、调度、暂停或删除任务。TCB 包含以下主要内容:任务的栈指针。任务状态:如运行态、就绪态、阻塞态等。任务优先级:决定调度顺序。任务名称:用于调试。

    以下是一个TCB的内容:在这里展现的是一个损坏的TCB,正常 TCB:pxTCB 应为有效地址(如 0x20001000),pxTopOfStack 指向栈顶,xStateListItem 包含有效列表项。

    问题:

    每个任务都有一个独立的 TCB。那我上面的prvCheckTasksWaitingTermination();有不是一个任务,为什么可以看见他的TCB?

    • pxTCB 并不是 prvCheckTasksWaitingTermination 自己的 TCB(因为它不是任务),而是它正在处理的某个已删除任务(如 MQTT_Client_Task)的 TCB。
    • FreeRTOS 的 TCB 是动态分配的,当任务删除时,TCB 被加入 pxTasksWaitingTermination,等待清理。prvCheckTasksWaitingTermination 从列表中取出 TCB,赋值给局部变量 pxTCB 进行处理。

    四、TCB损坏导致pxTasksWaitingTerminatio和prvIdleTask之间跳转

    正常情况下,MQTT_Client_Task 删除后,ATRecvParser 阻塞,系统中无就绪任务,prvIdleTask 运行并通过 prvCheckTasksWaitingTermination 清理资源,随后持续运行直到有任务就绪。

    TCB 损坏原因

    • 栈溢出:MQTT_Client_Task 的栈(2048 字节)可能不足,溢出覆盖 TCB 内存。
    • 内存不足:堆内存(2032 字节)可能无法分配 TCB 或栈,导致无效指针。
    • 任务删除异常:vTaskDelete(NULL) 在网络操作未完成时执行,TCB 状态不一致。
    • 互斥锁死锁:at_ret_mutex 未解锁,阻塞 ATSendCmd,影响 mqtt_connect,导致 TCB 未正确更新。

    我就是因为删除的任务重,at_ret_mutex 未解锁就把任务删除了,导致资源为释放,TCB损坏

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/908417.shtml

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    继MySQL之后的技术-JDBC-从浅到深-02

    目录 概念 编程六部曲 SQL注入和statement 工具类的封装 JDBC事务 模糊查询 批处理 数据库连接池 Apache-DBUtils BasicDao 概念 JDBC为访问不同的数据库提供了统一的接口,为使用者屏蔽了细节问题。 Java程序员使用JDBC,可以连接任何提供了JD…

    【配置 YOLOX 用于按目录分类的图片数据集】

    现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…

    浅谈python如何做接口自动化

    工具与环境准备 开发工具 PyCharm专业版:支持项目视图、代码导航、调试功能和主流框架开发官方资源:JetBrains PyCharm 数据库操作 使用mysqlclient库操作MySQL(Django官方推荐)安装命令:pip install mysqlclient1.3.…

    知识图谱技术概述

    一、概述 知识图谱(Knowledge Graph) 是一种基于图结构的语义网络,用于表示实体及其之间的关系,旨在实现更智能的知识表示和推理。它通过将现实世界中的各类信息抽象为 “实体-关系-实体” 的三元组结构,构建出复杂的知…

    NodeJS Koa 后端用户会话管理,JWT, Session,长短Token,本文一次性讲明白

    前言 前几天,我写了一篇文章,《我设计的一个安全的 web 系统用户密码管理流程》。其中着重点是讲的如何利用非对称加密进行安全的设计,并在讲述了原理之后,又写了 《node 后端和浏览器前端,有关 RSA 非对称加密的完整…

    0.5S 级精度背后:DJSF1352-RN-6 如何让储能电站的每 1kWh 都「有迹可循」?

    1、背景 在能源转型的时代洪流里,大型储能电站作为保障电网稳定运行、平衡能源供需的核心基础设施,其战略价值愈发凸显。而储能电站的高效运转,始终离不开精准的电能计量体系支撑。今日为您重点推介一款针对 1500V 储能系统研发的专业电能表…

    Linux运维笔记:服务器安全加固

    文章目录 背景加固措施1. 修改用户密码2. 使用公钥认证替代密码登录3. 强化系统安全4. 扫描与清理残留威胁5. 规范软件管理(重点) 注意事项总结 提示:本文总结了大学实验室 Linux 电脑感染挖矿病毒后的安全加固措施,重点介绍用户密…

    Pycharm 配置解释器

    今天更新了一版pycharm,因为很久没有配置解释器了,发现一直失败。经过来回试了几次终于成功了,记录一下过程。 Step 1 Step 2 这里第二步一定要注意类型要选择python 而不是conda。 虽然我的解释器是conda 里面建立的一个环境。挺有意思的

    【Linux】awk 命令详解及使用示例:结构化文本数据处理工具

    【Linux】awk 命令详解及使用示例:结构化文本数据处理工具 引言 awk 是一种强大的文本处理工具和编程语言,专为处理结构化文本数据而设计。它的名称来源于其三位创始人的姓氏首字母:Alfred Aho、Peter Weinberger 和 Brian Kernighan。 基…

    MS1023/MS1224——10MHz 到 80MHz、10:1 LVDS 并串转换器(串化器)/串并转换器(解串器)

    产品简述 MS1023 串化器和 MS1224 解串器是一对 10bit 并串 / 串并转 换芯片,用于在 LVDS 差分底板上传输和接收 10MHz 至 80MHz 的并行字速率的串行数据。起始 / 停止位加载后,转换为负载编 码输出,串行数据速率介于 120Mbps…

    跟我学c++中级篇——理解类型推导和C++不同版本的支持

    一、类型推导 在前面反复分析过类型推导(包括前面提到的类模板参数推导CTAD),类型推导其实就是满足C语言这种强类型语言的要求即编译期必须确定对象的数据类型。换一句话说,理论上如果编译器中能够自动推导所有的相关数据类型&am…

    vue3+TS+eslint9配置

    记录eslint升级到9.x的版本之后遇到的坑 在 ESLint 9 中,配置方式发生了变化。Flat Config 格式(eslint.config.js 或 .ts)不再支持 extensions 选项。所以vscode编辑器中的 extensions 需要注释掉,要不然保存的时候不会格式化。…

    书籍推荐 --- 《筚路维艰:中国经济社会主义路径的五次选择》

    萧冬连.筚路维艰:中国社会主义路径的五次选择[M]. 前不久看完的这本书,还是蛮受震撼的。 这本书比较细致地(引用了很多的史料)、从中央高层的视角讲解了从新中国成立一直到改革开放初期这30多年里(1949---1980年代)发生在我国的几次重大事件(三大改造、第一个五年计…

    C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

    名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序&#xff…

    (三)动手学线性神经网络:从数学原理到代码实现

    1 线性回归 线性回归是一种基本的预测模型,用于根据输入特征预测连续的输出值。它是机器学习和深度学习中最简单的模型之一,但却是理解更复杂模型的基础。 1.1 线性回归的基本元素 概念理解: 线性回归假设输入特征和输出之间存在线性关系。…

    二十五、面向对象底层逻辑-SpringMVC九大组件之HandlerMapping接口设计

    一、引言:MVC架构的交通枢纽 在Spring MVC框架中,HandlerMapping接口扮演着"请求导航仪"的关键角色,它决定了HTTP请求如何被路由到对应的Controller处理器。作为MVC模式的核心组件之一,HandlerMapping在请求处理的生命…

    凌晨四点的星光

    凌晨四点的城市像台停止运转的老旧机器,陈明裹紧外套踩着路灯的残影往家走。键盘敲击声仿佛还在耳边回响,他揉了揉酸涩的眼睛,手机屏幕突然亮起,是妻子发来的消息:“孩子又发烧了,我带他去医院。” 这是他…

    Kyosan K5BMC ELECTRONIC INTERLOCKING MANUAL 电子联锁

    Kyosan K5BMC ELECTRONIC INTERLOCKING MANUAL 电子联锁

    LeetCode 热题 100 74. 搜索二维矩阵

    LeetCode 热题 100 | 74. 搜索二维矩阵 大家好,今天我们来解决一道经典的算法题——搜索二维矩阵。这道题在 LeetCode 上被标记为中等难度,要求我们在一个满足特定条件的二维矩阵中查找一个目标值。如果目标值在矩阵中,返回 true&#xff1b…

    如何在 HTML 中添加按钮

    原文:如何在 HTML 中添加按钮 | w3cschool笔记 (请勿将文章标记为付费!!!!) 在网页开发中,按钮是用户界面中不可或缺的元素之一。无论是用于提交表单、触发动作还是导航&#xff0…