发新帖本帖赏金 50.00元(功能说明)我要提问
返回列表
打印
[MM32生态]

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

[复制链接]
1766|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 xld0932 于 2024-1-30 10:40 编辑

#申请原创#   @21小跑堂

在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中去指令执行,达到加速运行的效果。

测试工程附件:
MM32G0001_fplib_ToSRAM.zip (2.79 MB)

使用特权

评论回复

打赏榜单

21小跑堂 打赏了 50.00 元 2024-01-30
理由:恭喜通过原创审核!期待您更多的原创作品~

评论
21小跑堂 2024-1-30 14:35 回复TA
一种用于在MCU没有硬件FPU的情况下使用浮点软件库并提升运算速度的方法,此方案需要对编译器及MCU的内存结构具有一定的了解和掌握,但是作者的过程较为详细,方便学习参考。唯一不足的是缺少对比实验结果,实际的提升效果有待商榷。 
沙发
victory007| | 2024-1-25 14:43 | 只看该作者
感谢博主分享

使用特权

评论回复
板凳
wang1979| | 2024-1-25 22:31 | 只看该作者
谢谢分享,不错的资料!

使用特权

评论回复
地板
黑心单片机| | 2024-1-29 21:54 | 只看该作者
好实用,楼主威武

使用特权

评论回复
5
LemoN112121| | 2024-1-30 13:02 | 只看该作者
感谢分享!

使用特权

评论回复
6
呐咯密密| | 2024-1-30 14:27 | 只看该作者
加速效果如何,没有测试数据吗

使用特权

评论回复
7
xld0932|  楼主 | 2024-1-30 15:27 | 只看该作者
本帖最后由 xld0932 于 2024-1-30 15:44 编辑
呐咯密密 发表于 2024-1-30 14:27
加速效果如何,没有测试数据吗

上述加速不明显,只是一个举例,MCU在48MHz的主频下,对比前后,有110ns的提速;具体效果还要看实际应用,在浮点运算量复杂的时候会有明显优势。

使用特权

评论回复
发新帖 本帖赏金 50.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:上海灵动微电子股份有限公司资深现场应用工程师
简介:诚信·承诺·创新·合作

68

主题

2997

帖子

31

粉丝