arm mcu 程序通过SWD下载后无法运行,在线调试正常运行

问题现象:

每次程序下载后至FLASH 后程序无法运行。连接仿真器后每次运行会停在固定一段汇编代码上。点击继续运行后可以继续运行后续代码。

每次会停在固定的一条指令上,通过反汇编确定,停在了如下代码上:

发现这条语句来自于编译器库函数 _sys_command_string()。

问题原因:

1.半主机模式

编译器之所以链接了这段函数,是因为MCU进入一种被称为半主机( semihosting )的状态。允许目标应用程序与主机I / O设备进行交互(因此被称为半主机)。

如下的工作流程,就是MCU在半主机状态下的流程:

图表

每次程序调用任何I / O时,都会有supervisor 调用异常,该异常由主机端的调试器(半主机服务器)处理。

这种方法有两个缺点:

  1. 当处理器处于超级用户模式时,用户应用程序将暂停并等待执行完成。这对于实时应用是不可接受的。
  2. 没有调试器(通过EDCL或从ROM加载独立的应用程序),就没有半主机服务器。每次调用I / O函数都会导致崩溃。而在程序初始化期间,始终会有对服务器的调用,这意味着程序将一直会崩溃。

因此常见的处理方法会禁用半主机模式。arm compiler V5 编译器提供的库函数提供了禁用接口。

2. arm compiler V5/V6

其实在出问题的工程中也调用了这个接口,但是依然存在这种问题。分析发现,是arm compiler V5/V6 编译器版本接口不一致导致的问题。

在原来的禁用代码中添加对编译器的适配语句即可解决这个问题。

#if __ARMCC_VERSION >= 6000000
    __asm(".global __use_no_semihosting");
#elif __ARMCC_VERSION >= 5000000
    #pragma import(__use_no_semihosting)
#else
    #error Unsupported compiler
#endif

 

参考资料:

https://mklimenko.github.io/english/2018/11/02/disable-semihosting/

https://developer.arm.com/documentation/ka002219/latest

了解如何利用WCH-LinkW无线下载仿真调试器为ARM内核MCU进行程序下载调试,是提高开发效率的关键步骤。WCH-LinkW不仅支持无线下载仿真调试ARM内核MCU程序,还具备无线串口通信的功能,极大地优化了开发流程和设备使用体验。为了帮助你更好地掌握这一技术,推荐参考《WCH-LinkW无线调试器&串口通信工具介绍》这份资料。 参考资源链接:[WCH-LinkW无线调试器&串口通信工具介绍](https://wenku.youkuaiyun.com/doc/2nk1zeoef8?spm=1055.2569.3001.10343) 首先,确保你的开发环境已安装MounRiver Studio或Keil V5.25等支持的IDE。打开你的项目,编译生成待下载MCU程序文件。然后,按照以下步骤操作: 1. 将WCH-LinkW调试器通过USB连接到开发计算机。 2. 将WCH-LinkW与目标ARM内核MCU设备正确连接,确保SWD接口接触良好。 3. 在MounRiver Studio或Keil V5.25中选择合适的下载工具,连接到MCU设备。 4. 选择编译好的程序文件,通过WCH-LinkW执行无线下载操作。 5. 下载完成后,设置调试参数,并启动调试会话。 6. 使用IDE中的调试工具进行断点设置、单步执行、变量监视等操作,进行程序调试。 7. 当需要进行无线串口通信测试时,可以在WCH-LinkW上选择相应的串口通信设置,与MCU设备进行数据交换。 通过以上步骤,你可以高效地完成基于ARM内核MCU程序下载调试工作。为了进一步深入学习和掌握WCH-LinkW调试器的更多功能和高级应用,建议查看《WCH-LinkW无线调试器&串口通信工具介绍》。这份资料为你提供了详细的产品功能描述和使用案例,能够帮助你充分挖掘WCH-LinkW的潜力,为你的项目开发带来更多的便捷和效率。 参考资源链接:[WCH-LinkW无线调试器&串口通信工具介绍](https://wenku.youkuaiyun.com/doc/2nk1zeoef8?spm=1055.2569.3001.10343)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值