一、arm程序在debug工具介入时可以跑完但是烧录到flash中会停留在BKPT 0xAB的解决方法

        最近在调试arm程序,一般都会用到uart来log message,一是可以保证CPU正常run,二是可以debug程序bug在哪个位置。

        而用uart log message,一般都会采用printf的库函数,然后retarget库函数的porting即可。当然也可以自己实现printf函数,即各种字符处理,format处理等等。我觉得自行实现printf应该比较占用code size,所以还是会采用重定向printf的方式。

        目前有三种方式来实现:

        1. 使用arm的microlib库stdio.h,然后重新定义fputc函数

        2. 不适用microlib库,采用标准stdio.h库,同样时重新定义fputc函数,但是必须停用半主机模式

        3. 针对Gcc没有microlib库,只能采用标准stdio.h库,同样是重新定义函数,不过是_write()函数

        上面就会有一个坑,就是我在IDE中其实是采用的方式2,但是我并没有停用半主机模式,导致debug的时候,KEIL MDK5每次全速run都会run几次才会跑到main函数,会发现前面会执行一些库函数,比如fopen,fexit,汇编指令停留在BKPT 0xAB。但是我用arm development studio5编译同样的代码,全速run就可以直接跑。

        而我其实开发用的是arm development studio5,没发现问题,就download bin到flash,powerup之后始终跑不到main,跟arm DS5的debug现象感觉不一致。

        然后我就让验证去跑simulation,发现的确跑不到main,而是会跑到IRQ或者异常。

其实问题的根源是:

        采用方法2,不用microlib,必须停用半主机模式,即在代码中加入

#pragma import(__use_no_semihosting_swi)或

#pragma import(__use_no_semihosting)

而arm DS5不会出现此类问题,猜测应该是默认停用半主机模式,即IDE+dstream仿真器接入后就默认不采用半主机模式??

另外,当采用arm compiler 5时,可以识别#pragma import(__use_no_semihosting)这条语句,但是采用arm compiler 6时会报错,所以目前为了解决这个问题,如果已经选用arm compiler 6,则只能通过采用microlib的方式了!!!  -> 这里找到了解决办法,arm compiler 6的对应prama这样写:__asm(".global __use_no_semihosting\n\t");

        下一篇将具体介绍这些细节。


       

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

89er

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值