一、、背景:
曾经在工作中接触过STM32一段时间,但没有深入的去学习,只是用前辈搭建好的模型来实现一些功能罢了,俗话说的好,大树底下好乘凉,开发确实轻松了,可是不深究点,又觉着心里不踏实,然而也一直没花时间去深究。刚好,最近需要重新使用STM32,完全自己开发,没想到今天一上来就让我碰上个不小的问题,废话不多说,进入正题。
二、正文:
在使用串口的时候,代码可以正常编译,没有报任何错误,烧录进MCU内,就是看不到程序正常运行的现象,而把串口部分注释掉就没问题。进入调试模式,发现代码停在 "BKPT 0xAB" 这里,并不是死循环,按下全速运行键“F5”,代码会立马在该段被终止,不会继续往下跑,这里说明了main函数都没有进入。Google到了ARM的技术支持有提到过这个问题, “ARM: Application Builds Without Error, But Does Not Run”,这个链接描述的现象即是我现在碰到的现象。此处指出,调试时,出现代码停在 “BKPT 0XAB” 的现象,说明Semihosting 被使能了。
解决办法有三个:
1、添加一个“retarget.c”的文件,文件内容如下:
#include "stdio.h" #pragma import(__use_no_semihosting_swi)
#pragma import(__use_no_semihosting) _sys_exit(int x) {
x = x;
} struct __FILE {
int handle;
/* Whatever you require here. If the only file you are using is */
/* standard output using printf() for debugging, no file handling */
/* is required. */
};
/* FILE is typedef’ d in stdio.h. */
FILE __stdout;
2、使用keil 的软件包补丁(觉得有点繁琐没有使用),贴个图做个参考
3、打开Microlib:
点击“keil”的“Target option”里面的“Target”,选择“Use MicroLIB”,如下图:
经过测试,按“1”、“3”两种办法,均可以使程序正常运行,“2”办法有点繁琐,没有去尝试。
按照“1”方法为什么就能使程序正常运行呢?释义如下:
现在问题来了,这个“Semihosting”到底是什么?官方释义如下:
而按照方法“3”的原因在于:
“Microlib”已经将“Semihosting”部分移除,代码也更精简,所以,不会出现卡在某处的情况。
个人是推荐用方法“1”或“2”,毕竟微库“Microlib”不具备ISO C的某些特性,某些库函数运行的也比较慢,具体不同之处参照参考链接。当然它的好处在于,其代码经过高度优化而变得很小,可以使用malloc,其内置了一个堆管理模块。具体不同会在第三部分参考链接中贴出。
三、参考链接
“ARM: Application Builds Without Error, But Does Not Run”
http://www.keil.com/support/docs/3614
“What is semihosting?”
http://www.keil.com/support/man/docs/ARMCC/armcc_pge1358787046598.html
“Differences between microlib and the default C library”
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0475k/chr1358938938431.html
记录地点:深圳WZ
记录时间:2016年8月1日