Lazy loaded image
原理篇13-操作系统调试Trace
Words 523Read Time≈ 2 min
2026-9-2
🎯
本篇目标:讲清 RTOS 调试的三层手段——日志、内核 Trace、硬件 Trace,以及 stp_rtos 实际用了什么。

一、为什么 RTOS 难调试

单线程程序断点一打、单步一走就清楚了。RTOS 的难点:
  1. 并发:多个任务交错跑,bug 只在特定时序出现;
  1. 时序敏感:打断点会改变时序,bug 消失(海森 bug);
  1. 现场难抓:任务切换频繁,出问题时不知道是哪个任务、什么状态。
所以 RTOS 调试的核心是记录,而不是打断。

二、第一层:日志(LOG)

stp_rtos 移植了 easylogger,内核里到处是分级日志:
按模块(tag)+ 级别(level)过滤,是定位问题的第一手信息。代价是日志本身有开销,会扰动时序。

三、第二层:内核 Trace

不打断运行,只记录事件流,事后回放:
  • SEGGER SystemView:记录任务切换、中断进出、API 调用,时间轴可视化,是 FreeRTOS/RT-Thread 生态的标配;
  • RTOS Trace 链表:H7-TOOL 等工具直接读内核链表,展示就绪列表、挂起列表的实时状态;
  • stp_rtos 的列表打印:配合 letter shell,list thread 遍历对象容器打印所有线程名和状态。

四、第三层:硬件 Trace

  • DWT/ITM:Cortex-M 内置,周期计数器、数据观察点;
  • ETM Trace:J-Trace + Ozone 抓指令级 trace,能还原“每条指令何时执行”,是抓偶发最坏延迟的终极手段;
  • H7-TOOL 黑盒子:把故障现场自动存进专用内存,事后导出分析。

五、小结

  • 日志 → 内核 Trace → 硬件 Trace,侵入性递增、信息量递增;
  • 时序敏感的 bug 用“记录”而非“断点”;
  • stp_rtos 用 easylogger + shell 列表打印,配合 SystemView/H7-TOOL 做外部 Trace。
核心一句话:RTOS 调试靠记录事件流,而不是打断执行。
上一篇
C++ String 常用操作
下一篇
嵌入式工程师习题集

Comments
Loading...