Stm32 debug停留在"BKPT 0xAB"或者"SWI 0xAB"的解决办法。

一、、背景:

  曾经在工作中接触过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日

原文地址:https://www.cnblogs.com/ChYQ/p/5726020.html