zoukankan      html  css  js  c++  java
  • 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日

  • 相关阅读:
    java_000.JAVA语言课堂测试试卷01
    2018暑假第八周总结&暑假代码成果总结(8.27-9.2)
    C#_最基础的计算器
    Java_学生信息管理系统——数组版——初次编写
    Java_计算器001,支持加减乘除,括号,小数点,√,^ 运算
    Java_计算器001,支持加减乘除,括号运算
    2018暑假第七周总结(8.20-8.26)
    2018暑假第六周总结(8.13-8.19)
    2018暑假第五周总结(8.6-8.12)
    poj 1984(带权并查集)
  • 原文地址:https://www.cnblogs.com/ChYQ/p/5726020.html
Copyright © 2011-2022 走看看