调试卡住了?先看看你用对工具没
半夜三点,板子死活不启动,串口输出一堆乱码,这时候光靠“肉眼猜错”可不行。搞嵌入式开发,就像修车,光有扳手不够,得有一整套趁手的工具箱。很多人遇到问题第一反应是改代码,其实该先检查下是不是工具没用到位。
串口调试助手:最基础也最容易被忽视
别小看一个简单的串口工具,像 XCOM、SSCOM 或者 PuTTY,它们是你和单片机“说话”的第一通道。有时候程序跑飞了,复位后串口没输出,先别急着烧录新固件,检查下波特率设对没。曾经有个同事调了两天 FreeRTOS 任务调度,最后发现是串口接收缓冲区溢出,导致日志断断续续,误导了判断方向。
JTAG/SWD 调试器:真正能“看见”内存的工具
ST-Link、J-Link、DAP-Link 这些调试器,配合 IDE 如 Keil、IAR 或 STM32CubeIDE,可以直接查看寄存器状态、内存变量、调用栈。某次项目中,设备偶尔死机,用 J-Link 单步回溯,发现是某个指针在中断里被非法修改,这种问题靠打印日志根本难定位。
// 比如查看某个全局变量变化过程
int sensor_value = 0;
void ADC_IRQHandler(void) {
sensor_value = ADC1->DR; // 中断中更新
}
逻辑分析仪:让时序问题无处藏身
I2C 写不进去?SPI 数据错乱?别再靠延时凑时序了。拿个 Saleae 或开源的 Sigrok 搭配 LXTerminal,抓一下波形,立刻就能看出起始信号有没有、时钟是否稳定、数据采样点对不对。之前调一个温湿度传感器,主机始终读不到响应,抓波形才发现从机拉低了 SCL 做时钟延展,而主控没处理这种情况,直接超时退出。
示波器:硬件问题的照妖镜
电源不稳、复位异常、信号干扰,这些问题串口打不出答案。比如系统随机重启,查软件逻辑一圈没问题,接上示波器一测,发现 VCC 引脚有 200ms 的掉电,根源是电源模块带载能力不足。这种硬件问题,没示波器真得靠猜。
版本控制与构建工具:别让自己陷入“哪个版本是对的”困境
工程改来改去,突然某个功能坏了,你说不清是昨天还是前天改出的问题。Git + Makefile(或 CMake)不是摆设。每次提交写清楚改动内容,用分支管理功能开发,出问题直接 git bisect 定位引入 bug 的那次提交。团队协作时尤其重要,不然一人改头文件,全组编译失败。
日志系统:让问题自己开口说话
不要只依赖 printf 到串口。复杂的系统建议加环形缓冲日志,支持分级输出(DEBUG、INFO、ERROR)。比如设备在现场出问题,带回的日志显示某函数返回 -1,顺着查过去发现是 Flash 擦除失败,进一步确认是寿命耗尽。这种信息现场不可能重现,全靠日志留痕。
静态分析工具:提前揪出潜在坑点
PC-Lint、Cppcheck 这类工具能发现未初始化变量、空指针解引用、内存越界等问题。有次代码里写了 buf[10] 却只定义了 char buf[8],编译器没报错,但运行时偶尔崩溃。PC-Lint 扫一遍就标红警告,省了后续一堆排查时间。