以前一直用原子提供的MDK3.80A,烧写调试也一直使用串口ISP的方式用得挺好。最近另外一个组的同事移交过来一个项目,他们的板子是用JTAG口进行烧写的,MCU是STM32F100C8,仿真工具是STLINKv2的。网上查了下MDK只有在4.2之后的版本才支持STLINKv2,好吧,直接官网下了个MDK4.7A版本的,**好,开始调试。直接打开原来MDK3.80A下的一个调试程序,设置好仿真的一些参数开始仿真。问题出来了,开始从复位状态开始运行,当运行到
跳转MAIN函数的语句时就会无限进入一个不可屏蔽中断,如下:
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
LDR R0, =__main
BX R0 //进入HARD_FAULT中断
ENDP
//HARD_FAULT中断
HardFault_Handler\
PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
网上查了下进入该中断的原因是堆栈溢出之类的。由于原来程序是在STM32F103C8上写的,现在换到了STM32F100C8上,猜想是不是启动文件或者头文件出了问题。于是在Debug里选上Run to main()跳过复位部分,发现程序会在不确定的随机位置进入HardFault中断。纠结了很久之后想在MDK4.7下重新建一个工程试试看。发现在新版本下STM32的启动文件改了,各种头文件例如.MAP .TYPE .CONF等都整合成了一个新的头文件stm32f10x.h。需要在C/C++配置 define里加上STM32F10X_HD USE_STDPERIPH_DRIVER等等等等,各种纠结之后终于可以调试了,然后同样的问题再次出现。纠结N久无果之后问同事拿来了他们之前在这套环境下写得程序,他们从未发生过这样的现象。开始比较两边程序的区**发现在他们的程序里用到了Printf()这个函数,之前记得要用这个函数需要调用微库。于是在Target配置里勾上Use MicroLIB,编译,仿真,这次好了,程序正常进入MAIN函数也再也没有进入过那个坑爹中断。
网上查了下microlib:
microlib 是缺省 C 库的备选库。 它用于必须在极少量内存环境下运行的深层嵌入式应用程序。 这些应用程序不在操作系统中运行。microlib 不会尝试成为符合标准的 ISO C 库。
microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。某些库函数的运行速度也比较慢,例如,memcpy()。
完全搞不明白不用微库怎么会导致这样奇怪的错误,希望各位前辈能够给予指点。之前对于这块完全没有理解,正好趁这个机会搞搞明白,谢谢了!! |