GD32F303MCU代码量增大后代码执行速度变慢的问题

        事情的起因是笔者在某一天工作中,突然遇到了这样的问题:

        由于新的需求需要将很长一串代码添加至原来的keil工程中,但是这段代码添加进去后中断响应函数的代码执行时间突然变长了,发出来的波形也会有莫名其妙的一段卡壳。总所周知,中断响应函数的执行时间是越短越好的,尤其是我现在用的这种每隔一段时间就会触发的定时器中断,如果执行时间过长的话就会造成比较严重的影响。

        但是令我百思不得其解的地方是这段代码添加进去也没有执行,怎么就会影响到八竿子打不着的中断相应函数呢?我又尝试将添加的代码一段段的注释掉,最终发现注释到某一段后,突然中断里的代码运行速度又恢复正常了!但是这并没有解决我的困惑。

        经过反复的折腾之后,我只好求助于万能互联网。果然,再稀奇古怪的bug总有人能遇到跟你同样的现象,我还真找到了一篇帖子解决了我的困惑。

        原来这问题是GD32F系列产品架构导致的,其采用了SIP的方式叠封了GD Flash,GD32内部FLASH分为CODE区和DATA区,其中CODE区的代码运行速度较快,而DATA区的代码运行速度比CODE区慢了一个数量级!以我使用的芯片手册上查到的FLASH空间为例:

        笔者使用的型号是GD32F303RE,打开KEIL的map文件发现定时器的中断响应函数代码的存放地址刚好超过0x08040000,而0x08040000正好是CODE区和DATA区的交界处,至此真相大白了。

        既然问题已经找到了,那如何解决呢?目前我知道的有两种方法,一种是换块FLASH空间更大的芯片,另一种就是用分散加载方式,将实时性要求高的代码,如中断响应函数存放在CODE区,而实时性要求低的代码放在DATA区。

        分散加载也有两种实现方法,一种是手动修改cst分散加载文件,另一种方式就是用

__ attribute __( at(绝对地址) )将变量或是函数存放在指定位置,个人比较偏向于第二种方式,但是如果需要指定源文件.c的加载位置,只能使用方式一不能用方式二。

        使用分散加载的方式后,中断函数执行速度的问题立马得到了解决。文章附上从GD32官网下载的分散加载实现方式文档。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值