记得之前在STM32上做串口终端的时候图方便,想用C库里的 printf() ,于是重载了 putc() ,也在 keil 的项目配置中勾选了 Use MicroLIB 选项。但是程序下载到STM32上之后,串口却一点反应也没有,我先是检查了时钟、GPIO配置和串口使能,发现都没问题。而且调试的时候程序正常运行,串口也正常输出。后来发现程序在调试的时候总是会在停在 BKPT 0xAB 指令处,但它又不属于用户代码,因此意识到是标准库的问题(准确来说是我自己的问题)。最后发现要使用 printf() 重载的是 fputc() 而不是 putc() 。
近来我又遇到类似问题,同样是下载后没反应,同样是调试的时候可以顺利运行,但是这回我在程序中没有使用 printf() 函数,因此起初调试的时候没有想到是标准库的问题。而后我在数次调试中看到了熟悉的身影,依旧是指令 BKPT 0xAB 。
可这次我没有使用 printf() ,怎么还会有软件断点呢?而且这次的 BKPT 是在程序刚刚开始运行的时候就出现的,比 startup 运行得还要早,这就更不可能是 printf() 的问题了。不过幸运的是,我们可以在调试洁界面的调用栈中看到当前所处的函数:_sys_command_string()
根据 keil 网