muyichuan2012 发表于 2024-11-13 19:51

Qfplib浮点库在AT32 MCU上的应用

本帖最后由 muyichuan2012 于 2024-11-13 19:55 编辑

Qfplib浮点库在AT32 MCU上的应用

雅特力官网下载地址:https://www.arterytek.com/file/download/2409
前言
Qfplib 浮点库是一个免费、快速、准确的ARM Cortex-M 浮点库,其性能媲美于硬件FPU。Qfplib根据不同内核和使用情景主要分为Qfplib-M0-tiny、Qfplib-M0、Qfplib-M3 三套,其中Qfplib-M3 同样适用于Cortex-M4 MCU。AT32F421、AT32F425 和AT32F415 三个系列是ARM Cortex-M4 内核,但不带硬件FPU,使用Qfplib 库做浮点运算相较于编译器自带C 库提升效果更为明显。
本文以AT32F421 举例,介绍如何将Qfplib-M3 移植到工程中,并做简单测试。

参考资料:
Qfplib 官网 https://www.quinapalus.com/qfplib.html
安福莱关于Qfplib介绍:https://www.armbbs.cn/forum.php?mod=viewthread&tid=126033
支持型号列表:
支持型号 AT32 全系列



目录
Qfplib-M3 浮点库介绍 ............................................................................................. 5
1.1 简介 .......................................................................................................................... 5
1.2 授权许可 ................................................................................................................... 5
1.3 代码大小 ................................................................................................................... 5
1.4 堆栈和静态内存使用情况 .......................................................................................... 5
1.5 速度和准确性 ............................................................................................................ 5
1.6 科学函数的准确性分析 .............................................................................................. 6
1.7 测试 .......................................................................................................................... 7
1.8 IEEE 754 标准的实施 ............................................................................................... 7
在AT32 MCU 上的代码移植 .................................................................................... 8


1 Qfplib-M3 浮点库介绍
1.1 简介
Qfplib-M3 是一个 IEEE 754 单精度浮点算术例程库,适用于基于 ARM Cortex-M3 内核(ARMv7-M 架构)的微控制器。当然,该数学库在 Cortex-M4 微控制器上也是可以运行的。 Qfplib-M3 的优化目标是速度、 准确性,同时将代码大小保持在合理的范围内。Qfplib-M3 提供准确的四舍五入加法运算, 减、乘、除和平方根运算, 以及正弦、余弦、正切、反正切、对数和指数函数,具有很高的精度。

1.2 授权许可
Qfplib-M3 是开源的,根据GNU GPL 版本2 获得许可,使用风险自负。Qfplib-M3 未根据LGPL 获得许可。粗略地说,这意味着如果你想将其与非GPL 代码结合使用,你需要一个替代许可证:请使用主页上的电子邮件地址进行查询。

1.3 代码大小
Qfplib-M3 中的整套功能占用了略低于12k 字节的程序内存。一般来说,代码不会在函数之间共享,因此如果不是使用所有函数,可以显著减少占用空间:如果使用GNU 链接器,请提供--gc sections选项。Qfplib-M3 不依赖于任何其他库。

1.4 堆栈和静态内存使用情况
Qfplib-M3 不使用堆栈和静态存储。不需要初始化。该代码是完全可ROM 的,并且是线程安全的。

1.5 速度和准确性
下表将Qfplib-M3 的循环计数与其他库进行了比较。Qfplib-M3 定时结果是所示参数值范围内的近似平均值,包括3 个周期的调用开销。它们是使用从(单周期)RAM 执行的LPC1763 微控制器进行测量的。
在下表中,“ulp”表示“最后一位的单位”。误差是相对于正确四舍五入的结果进行测量的。




请注意,与Qfplib-M3 不同,所有替代库在舍入方面似乎都不符合IEEE 754 标准。根据此处和此处给出的时间推断出Micro Digital“GoFast”、Keil 和IAR 库的结果。这些页面已经好几年没有更新了:欢迎任何更新的基准数据。但是请注意,(例如)Keil MDK 的最终用户许可证包括以下条款:“您应将与软件[…]相关的任何和所有基准数据视为机密信息,这些数据表明其性能、功效、可靠性或质量,未经ARM 明确书面许可,您不得向任何第三方披露此类信息”。目前尚不清楚这样的条款是否可执行,但它可以被视为ARM 对其软件的“性能、功效、可靠性或质量”的信心。
1.6 科学函数的准确性分析



已注意确保Qfplib-M3 保持精确到1 ulp 的结果,例如sin x,其中x 接近π的倍数,以及cos x 和tan x,其中x 接近π/2 的奇数倍。它甚至正确地评估了sin(16367173·273)。
1.7 测试
每个一元函数对应的标准GNU 浮点库都在GCC x86 处理器进行了详尽的测试,包括非异常参数以、数千万随机异常情况下测试。
每个二进制函数都已经在超过10 亿个案例中针对GNU x86 库进行了测试,包括异常和非异常、随机和人为的。

1.8 IEEE 754 标准的实施
Qfplib 根据IEEE 754 标准正确处理带符号的零、非正规、无限和NaN。加法、减法、乘法、除法和平方根运算的结果被正确地四舍五入(最接近,甚至并列)。不支持其他舍入模式。


2 在AT32 MCU 上的代码移植
Qfplib 的添加过程比较简单,只需如下操作步骤即可:

图1. Qfplib 数学库移植步骤


步骤1:添加qfplib-m3_gcc.a 到MDK 工程中,注意由于其汇编源码是基于GCC 指令的,MDK 直接添加qfplib-m3.s 编译可能会报错。
步骤2:include qfplib-m3.h 文件,并加载其路径
步骤3:调用qfp 相关函数与math c 库自带数学函数计算精度和计算效率对比如下图2
图2. 数学函数计算结果打印








我喜欢打游戏 发表于 2024-11-13 20:18

还有M4不带FPU的啊,我以为只要是M4都标配的
页: [1]
查看完整版本: Qfplib浮点库在AT32 MCU上的应用