|
今天谈一谈对STM32浮点运算单元FPU,有人利用STM32芯片做些DSP处理,在启用FPU单元进行调试、验证过程中可能会遇到些小问题、小困惑,这里通过STM32F4芯片一个具体的应用示例简单分享下,希望顺便能给同仁提供些帮助或提醒。 我这里通过调用DSP库里的FFT相关函数实现1024点的FFT运算,样点数据及运算结果均为浮点数。
程序里要调用一些数学函数,而这些数学函数往往集成在相应的数学函数库里。我们选用ARM公司的DSP数学库,该库系专门针对AMR核芯片及指令系统而组织的代码,相比IDE自带的通用数学函数库会更优化、高效。 目前该DSP数学库包括基本数学函数、复数数学函数、滤波函数、矩阵函数等几大块,详细内容可以去ARM网站阅读比较方便。【可点击左下方原文链接前往】
我们开发时,这些文件具体在哪里呢?在各个编译环境的安装目录下都不难找到。不妨看看ARM keil MDK环境下它们所在位置。
在上面截图中,我还截取了对应M0内核可用的DSP数学库,它为什么只有两个?这是因为M0内核没有FPU硬件单元,不存在FPU是否启用的可选情况。 现在就利用STM32F429开发板,基于开篇的截图代码进行测试,并用定时器测量下面执行代码在不使用FPU和使用FPU分别所花费的时间,并计算二者的时间比。【注:STM32F429芯片自身是带硬件FPU的】
必要的配置和文件包含及添加,如下表所示:
基于上面条件执行FFT运算代码,不使用FPU和使用FPU的时间比为16。 采用相似的条件,基于IAR环境对相同功能代码段进行测试,不使用FPU和使用FPU的时间比为11。 关于这个时间比,除了跟是否使用微库、优化等级、浮点精度等有关外,跟你所选取的测试代码也有很大关系,因为有些代码只能靠CPU执行的话,开不开FPU硬件单元对这部分时间是没有影响的。不难理解,被测试代码里只能靠CPU运行的代码占比越多,上面的这个比值就会越小。一般来说,我们不必太过纠结这个值的大小,知道有这个硬件浮点单元,既减轻了CPU负荷,又可以提升计算速度就好。 另外,我们在做DSP相关应用时,注意添加的DSP库既要跟所用芯片匹配,还要跟IDE里的配置匹配。还是以上面测试代码为例,本意是想启用FPU,结果添加的DSP库却是基于不使用FPU硬件的数学库,那会怎么样呢?
但仔细查看结果,跟之前正确配置的运行结果明显不一样。经验证核对,这次运算结果是错的。为此我特意添加一行计算90°的正弦值代码,它算出来结果竟然是1.5!逆天了。
针对这种情形,基于同样代码于IAR环境下测试,情况相比ARM MDK貌似要好点。至少编译时有警告提示,提示引用冲突之类的。计算结果没有MDK的那么具有隐蔽性【至少对于本次测试是这样】,基本是清一色的0,颇有冲击效果!当然,此时让它计算90°的正弦值结果也是明显错的。
感觉上,这种情形下,使用IAR时挖的坑似乎稍微浅些,更容易让人警醒怀疑哪里出问题了。 |
|
因吹斯汀,谢谢分享~ |
微信公众号
手机版