39.嵌入式调试方法.md 4.8 KB

嵌入式调试方法

判别规则(核心,唯一要记的)

  1. 看问题类型:软件逻辑/变量值 → printf 或断点;凡怀疑波形/时序/波特率/信号质量逻辑分析仪/示波器(printf 帮不上忙,它看不到物理层)
  2. ISR 里不能 printf(阻塞 + 慢,破坏实时性还可能卡死)→ 用断点或置标志位,主循环再打印
  3. 调试器会"停住世界":RTOS/实时场景慎用断点(一停调度全乱,问题消失或变样)→ 用 printf 观察状态;时序问题 → 逻辑分析仪

一句话:"逻辑变量用 printf/断点,波形时序用逻辑分析仪;ISR 别 printf,实时系统别断点。"

抽象描述(一句话本质)

调试 = 找出"软件以为的样子"和"硬件真实的样子"之间的差异。三大工具视野不同:printf 看软件状态、调试器看运行现场、逻辑分析仪看波形时序——选错工具等于用错"眼睛"。

三大工具(一张表)

工具 能看什么 适合 局限
printf 变量值、程序走到哪、状态标志 逻辑流程、随时可看 慢、阻塞、ISR 里不能用、要接串口
调试器(断点/单步) 停在断点看变量/寄存器/栈、崩溃现场 逻辑错、变量错、崩溃定位 会停住整个程序,实时/RTOS 一停时序就乱
逻辑分析仪/示波器 引脚电平、波形、脉冲宽度、协议时序 时序问题、协议波形、波特率验证 看不到变量/软件逻辑,只看电平,要接探头

判别规则细化(什么时候用哪个)

  • 怀疑波形/时序/波特率 → 逻辑分析仪抓 RX/引脚波形,量每一位宽度,和配置对比
  • 怀疑变量/逻辑/崩溃 → 断点看现场,或 printf
  • RTOS 里任务异常 → printf 打印任务状态(如 vTaskList),别打断点
  • ISR 异常 → 断点或标志位,别 printf

分层排查思路:先软件(printf/断点查逻辑变量)→ 再信号(逻辑分析仪抓波形时序)→ 最后硬件(虚焊、供电、晶振)。

正反例(建立直觉)

  • 正例1:变量值不对、逻辑跑飞 → 断点看变量 / printf
  • 正例2:I2C/SPI 时序乱、波特率错、串口乱码 → 逻辑分析仪抓波形
  • 正例3:RTOS 任务被卡住 → printf 打印任务状态,别打断点
  • 反例1:串口乱码却用 printf → 没用,printf 依赖同一串口,且看不到 RX 波形
  • 反例2:在 ISR 里 printf → 阻塞 + 慢,破坏实时性,可能卡死
  • 反例3:用断点调实时系统 → 一停调度全乱,问题消失或变样

变体验证(3 题,全过=学会)

  1. 串口通信乱码,怀疑波特率/帧格式 → 逻辑分析仪抓 RX 波形,量位宽算实际波特率(printf 看不到波形且依赖坏掉的串口)
  2. 陷阱题:"ISR 里加 printf 是排查中断问题的最好方法" → ,printf 阻塞 + 慢,破坏实时性可能卡死;用断点或置标志位
  3. 陷阱题:FreeRTOS 任务 A 抢不到 CPU,用断点单步调试 → 不行,断点一停调度全乱;用 printf 打印 RTOS 任务状态接口观察

口述要点(面试怎么讲)

  • 结论先行:逻辑变量 → printf/断点;波形时序 → 逻辑分析仪;ISR 别 printf;实时系统别断点
  • 为什么 ISR 不能 printf:printf 阻塞且慢,ISR 要快进快出,一用就拖垮实时性甚至卡死
  • 为什么实时系统不能断点:断点停住 CPU,tick 中断和调度器都停转,时序全乱,问题消失或变恶劣
  • 为什么逻辑分析仪能看到别人看不见的:printf/断点工作在"软件/CPU 视角",看不到物理层的波形、时序、协议信号——那是引脚上的电平,只能用硬件工具看
  • 易错点:串口乱码用 printf;ISR 里 printf;实时系统打断点

关系网络

相邻概念 关系 孤立理解会犯的错
ISR 通信 ISR 要快进快出 → 不能 printf 中断问题用 printf 排查
RTOS 调度 断点会停调度 → 用 printf 观察 实时系统打断点
I2C/SPI/UART 协议时序问题 → 逻辑分析仪是标配 用软件工具查波形
DMA DMA 时序问题用逻辑分析仪抓 在 DMA 中断里 printf 查问题

学习日期

2026-08-18


每主题一页,复习时只翻本目录。