一、嵌入式调试的层次
嵌入式调试比普通应用复杂,因为问题可能出在硬件、启动链路、内核、驱动、文件系统或应用。
常见调试手段:
- 串口日志。
- LED 状态灯。
- JTAG/SWD。
- OpenOCD。
- GDB。
- gdbserver。
- 逻辑分析仪。
- 示波器。
入门阶段先掌握串口、gdbserver,再逐步学习 JTAG/OpenOCD。
二、串口调试
串口是嵌入式最重要的调试入口。
连接注意:
- TX 接 RX。
- RX 接 TX。
- GND 必须共地。
- 电平要匹配。
- 波特率要一致。
常用参数:
1 | 115200 8N1 |
使用:
1 | picocom -b 115200 /dev/ttyUSB0 |
串口能看到:
- U-Boot 输出。
- Kernel 启动日志。
- init 日志。
- 应用打印。
如果完全没有串口输出,优先检查硬件连接和波特率。
三、LED 状态灯
在早期启动或系统异常时,日志可能不可用。LED 是低成本状态指示。
常见设计:
- 上电常亮:电源正常。
- U-Boot 闪烁:bootloader 运行。
- Kernel 慢闪:内核启动。
- App 心跳:业务正常。
- 快闪:错误状态。
不要小看 LED。量产设备没有屏幕时,状态灯是现场排障的重要线索。
四、gdbserver 调试应用
目标板安装 gdbserver。
开发板运行:
1 | gdbserver :2345 ./app |
开发机运行交叉 GDB:
1 | arm-linux-gnueabihf-gdb ./app |
连接:
1 | target remote 192.168.1.100:2345 |
注意:
- 开发机上的
app要带调试符号。 - 目标板上的
app要和开发机上的二进制对应。 - 动态库符号路径要配置正确。
五、JTAG/SWD
JTAG/SWD 可以在 CPU 层面调试,常用于:
- 裸机程序。
- Bootloader。
- RTOS。
- 早期启动问题。
- 内核调试。
常见调试器:
- J-Link。
- ST-Link。
- CMSIS-DAP。
- FT2232。
JTAG/SWD 能做:
- 下载程序。
- 设置断点。
- 单步执行。
- 查看寄存器。
- 查看内存。
- 停止 CPU。
六、OpenOCD
OpenOCD 是开源片上调试工具,常用于连接调试器和 GDB。
典型流程:
1 | GDB -> OpenOCD -> JTAG/SWD -> Target |
启动 OpenOCD 示例:
1 | openocd -f interface/cmsis-dap.cfg -f target/stm32f4x.cfg |
另开终端:
1 | arm-none-eabi-gdb firmware.elf |
GDB 中连接:
1 | target remote localhost:3333 |
具体配置取决于芯片和调试器。
七、逻辑分析仪
逻辑分析仪适合看数字信号。
常见用途:
- UART 波形。
- I2C 地址和数据。
- SPI 时钟和数据。
- GPIO 翻转时序。
当软件日志显示“读不到设备”时,逻辑分析仪可以确认总线上到底有没有信号。
八、示波器
示波器适合看模拟电压和信号质量。
常见用途:
- 电源纹波。
- 上电时序。
- 复位信号。
- 时钟波形。
- 电平是否达标。
如果设备偶发重启、通信不稳定,不要只看代码,电源和信号质量也可能是根因。
九、排错顺序
建议顺序:
- 电源是否正常。
- 串口是否有输出。
- Bootloader 是否运行。
- Kernel 是否启动。
- RootFS 是否挂载。
- 应用是否启动。
- 外设总线是否有信号。
- 驱动是否 probe。
- 应用协议是否正确。
不要跳过硬件基础检查。很多“软件问题”最后都是线接错、电压不对、复位没拉起来。
十、总结
嵌入式调试要分层。应用问题用日志和 gdbserver,启动问题看串口和 U-Boot,裸机和早期初始化问题用 JTAG/OpenOCD,外设问题用逻辑分析仪和示波器。
能把这些工具组合起来,嵌入式问题定位效率会明显提升。
- 本文链接: https://blog.hansong.icu/2026/06/21/Embedded_Debug_JTAG_GDB/
- 版权声明: 本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。