跳转到内容

FreeRTOS 任务死锁与栈溢出调试提示词范例

请直接帮我定位并修复当前 STM32 FreeRTOS 工程中采集任务偶发卡死、系统停止响应的问题。
你可以检查和修改当前工程代码,执行构建、烧录和调试;通过断点、RTT/UART 日志、任务状态与栈余量等真实运行证据完成验证。不要假设存在专用的 RTOS 感知调试器,也不要在没有证据时编造任务状态或死锁结论。请按“定位 -> 最小修改 -> 构建 -> 烧录 -> 运行验证 -> 总结”完成。
1. 项目背景
目标 MCU:STM32F407,FreeRTOS 内核。
任务模型:
- SensorTask:每 5ms 读取传感器并向 SampleQueue 发送数据;
- ControlTask:每 1ms 从 SampleQueue 取最新数据并执行控制;
- LoggerTask:每 100ms 经 UART/RTT 输出汇总状态;
- CommTask:处理通信命令。
同步对象:SensorTask 与 ControlTask 共用 I2C/SPI 总线互斥锁;CommTask 与 LoggerTask 共用 UART 发送互斥锁。
当前现象:连续运行 20 分钟到数小时后,控制输出保持最后一个值,串口日志停止,复位后恢复。怀疑是互斥锁获取顺序不一致、任务阻塞后未释放资源、优先级反转,或某个任务栈溢出。
2. 请完成以下工作
- 找到任务创建、优先级、栈大小、队列、信号量、互斥锁、定时器回调和错误处理代码;
- 核对所有互斥锁的获取顺序与超时处理,重点检查持锁期间是否调用可能阻塞的队列、延时、日志或外设传输;
- 启用或补充最小的可观测性:任务名、任务状态、等待对象、堆剩余空间、各任务的栈高水位、队列深度、互斥锁持有时间和复位原因;日志应限频,不能在故障路径继续放大实时性问题;
- 启用并实现 configCHECK_FOR_STACK_OVERFLOW、vApplicationStackOverflowHook 和 configUSE_MALLOC_FAILED_HOOK(若项目配置允许),记录触发任务及关键现场后进入可控故障处理;
- 使用与板上运行固件匹配的 ELF 启动 probe-rs 调试会话。在怀疑的锁获取、释放和异常处理位置设置少量精确断点;复现时暂停目标,记录每个相关任务的 PC、调用栈、状态、等待对象和栈余量;
- 将“代码静态风险”“日志观测结果”“暂停现场证据”和“尚未能由软件确认的硬件因素”分开说明;
- 只实施可由证据支持的最小修改,例如统一锁顺序、缩短持锁范围、增加超时/恢复分支、调整经测量确认不足的任务栈或优先级;
- 重新构建、烧录并至少连续运行 30 分钟。统计任务心跳、最大队列深度、最低栈余量、互斥锁超时次数和异常钩子触发次数。
验收标准:故障复现时能给出明确的任务与等待关系证据;修复后控制和日志持续运行,未触发栈溢出/内存分配失败钩子;所有关键任务的最低栈余量保留项目约定安全裕量;最终列出根因、修改文件、运行证据和连续运行统计。