1.现象
在基于STM32开发一个项目过程中,遇到一个比较奇葩的现象:经常会时不时出现修改上层的应用代码导致程序运行不起来,进不去main函数。这个STM32程序是分为bootloader层和APP层,出现这个奇葩现象的时候,bootloader层是可以正常运行的,但是跳转到APP层的时候,就发现进不了main函数。
2.分析
一开始也是找不到原因何在,通过网上搜索发现也有类似出现STM32进不去main函数的,原因多数是因为printf函数的应用导致的。但通过代码检查发现我遇到的这个奇葩现象,并非printf函数运用导致。这里也借此了解一下printf函数在stm32中使用注意事项,避免出现这个错误。
printf函数:
printf之类的函数,使用了半主机模式,所以要利用目标ARM器件的输入输出设备,首先要关掉半主机机制,然后再将输入输出重定向到ARM器件上,如printf和scanf,需重写fputc和fgetc.
具体代码实现可参考如下(重写fputc):
#if 1
#pragma import(__use_no_semihosting) //确保没有从C库链接使用半主机的函数
//标准库需要支持的函数
struct __FILE
{
int handle;
};
FILE __stdout;
//以避免使用半主机模式
void _sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while(