[MM32生态]基于MM32提升浮点运算速度的一种方法

在Arm Cortex-M处理器中浮点数的运算有软件和硬件这两种计算方式,硬件计算浮点数相对于软件计算浮点数来说,执行运算的时间大大的提升了,对于MCU的开销也相对少很多,但需要通过硬件方式来计算浮点数,需要MCU配备FPU浮点运算单元,在MCU不具备FPU时,对于浮点数的运算只能是通过软件的方式来运算了。

对于不具备FPU的MCU来说,ARM提供了一个浮点支持软件库,来用于浮点数的运算支持:fplib。在fplib库中提供的API函数都是以__aeabi为前缀开头的,例如:
__aeabi_fadd:计算两个float类型的浮点数加法
__aeabi_dadd:计算两个double类型的浮点数加法
除此之外,fplib库还提取余、开方、乘除等等,非常丰富的浮点数操作函数,这些是KEIL MDK-ARM编译的时候,由编译器自动添加,编译的。

通过软件的方式计算浮点数,就少不了占用MCU的运行时间,有没有一种方式来加速浮点数的运算过程呢?本帖想到一种方式,就是将浮点数的库函数及需要处理的浮点数加载到MCU的SRAM中去执行,以此来加速/减少MCU在浮点数运算上的时间消耗。

这种方法的难点在于浮点数运算的库函数是编译器自动添加生成的,我们该如何找到,并配置正确,我们以MM32G0001这颗芯片为例子:
1.我们到官网下载MM32G0001的库函数与例程V2版本:https://www.mindmotion.com.cn/products/mm32mcu/mm32g/mm32g_value_line/mm32g0001
 



2.随便找一个例程进行验证,因为我们不需要其它的外设功能,所以对工程结构进行简化一下,然后在main.c文件中添加我们需要的代码,如下所示:



3.这个时候我们对工程进行编译,编译无误后,我们点击工具栏上的Start/Stop Debug Session按钮,进入Debug模式:



如上图我们可以看到,在做浮点数运算时,调用了fplib库中的__aeabi_fadd、__aeabi_f2d、__aeabi_dadd、__aeabi_d2f这几个API函数。

4.接下来,我们就是要找出上面调用的这几个函数,对应的生成文件是哪几个,我们先退出Debug模式,双击Project栏的工程,打开工程编译后生成的MAP文件,如下图所示:



5.在MAP文件中找到调用__aeabi为前缀的fplib库函数,如下图所示:



最前一列是函数名,0x08000xxx是这个函数在MCU FLASH存放的指令位置,最后面一列是这个函数所对应的生成文件,我们可以看到前面做浮点数运算的__aeabi_fadd、__aeabi_f2d、__aeabi_dadd、__aeabi_d2f这几个函数,分别对应fadd.o、f2d.o、dadd.o、d2f.o这几个文件,当前这些存储MCU FLASH中的函数,在运行时由于MCU运行时钟与FLASH读写时钟是有差异的,准确的说,当MCU的运行时钟/频率大于FLASH读写时钟时,MCU的流水线就需要插入FLASH读取的等待周期,但SRAM是挂载在MCU总线上的,MCU的流水线相当于直接从总线上取指令,而总线频率可以配置到与MCU运行时钟/频率相一致,这样指令在SRAM中的运行速度就比FLASH快很多了。

6.接下来,我们需要通过修改SCT文件来实现,将浮点运算的这几个生成文件添加到RAM中去:点击工具栏Options for Target...图标,在弹出的Options for Target窗口的Linker选项卡中,去除Use Memory Layout from Target Dialog选项,如下所示:



7.点击Scatter File后面的Edit...按钮,在Project.sct文件中的RAM域添加刚刚我们找到的那几个生成的.o文件,如下所示:



8.最后我们再重新编译工程,查看MAP文件,此时这个.o的生成文件就存放在SRAM中去了,如下图所示:



最后说一句:其实这些指令最终都是存放在MCU内部FLASH的,经过上述配置之后,在MCU上电后会自动将配置的函数加载到SRAM中去,后面再调用这些功能函数的时候,MCU会从SRAM中去指令执行,达到加速运行的效果。
---------------------
作者:xld0932
链接:https://bbs.21ic.com/icview-3356662-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值