0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于STM32浮点运算单元FPU的应用示例

茶话MCU 来源:ST MCU 信息交流 作者:ST MCU 信息交流 2021-01-02 18:09 次阅读

有人利用STM32芯片做些DSP处理,在启用FPU单元进行调试、验证过程中可能会遇到些小问题、小困惑,这里通过STM32F4芯片一个具体的应用示例简单分享下,希望顺便能给同仁提供些帮助或提醒。

我这里通过调用DSP库里的FFT相关函数实现1024点的FFT运算,样点数据及运算结果均为浮点数。

cf4aaab0-445e-11eb-8b86-12bb97331649.png

上图中A区代码是做样点数据准备,B区代码完成FFT运算。我们来一起看看基本的配置以及不启用硬件浮点单元和启用硬件浮点单元执行B区代码的时间上的差别。

程序里要调用一些数学函数,而这些数学函数往往集成在相应的数学函数库里。我们选用ARM公司的DSP数学库,该库系专门针对AMR核芯片及指令系统而组织的代码,相比IDE自带的通用数学函数库会更优化、高效。

目前该DSP数学库包括基本数学函数、复数数学函数、滤波函数、矩阵函数等几大块,详细内容可以去ARM网站阅读比较方便。【可点击左下方原文链接前往】

cfc025ce-445e-11eb-8b86-12bb97331649.png

我们开发时,这些文件具体在哪里呢?在各个编译环境的安装目录下都不难找到。不妨看看ARM keil MDK环境下它们所在位置。

d00fcdb8-445e-11eb-8b86-12bb97331649.png

上面我们看到的是DSP库源文件所在目录,在另一个目录存放着基于不同内核、不同存储端格式以及是否支持硬件浮点单元而编译出来的库文件。我们在开发时,直接添加合适的库文件进工程即可,不必逐个查找源文件来添加。下图就是可以用于ARM MDK环境的库文件。【对于不同IDE,库文件名后缀略有差异】

d0591e1e-445e-11eb-8b86-12bb97331649.png

这里以用于M4内核的DSP数学函数库稍作解释,详见下面表格。

d0c45cc4-445e-11eb-8b86-12bb97331649.png

从上表可以看出,基于Cortex M4内核芯片进行DSP运算可以能用到的库有四个,但具体到STM32 基于M4内核的芯片可以选用的只有两个,即xxxM4l_math.lib或xxxM4lf_math.lib,因为STM32芯片的存储设计都是小端模式。所谓小端模式,简单点说就是指多字节数据在内存中存储时,按照低位字节对应地址低位来存放,反之则为大端模式。

在上面截图中,我还截取了对应M0内核可用的DSP数学库,它为什么只有两个?这是因为M0内核没有FPU硬件单元,不存在FPU是否启用的可选情况。

现在就利用STM32F429开发板,基于开篇的截图代码进行测试,并用定时器测量下面执行代码在不使用FPU和使用FPU分别所花费的时间,并计算二者的时间比。【注:STM32F429芯片自身是带硬件FPU的】

d10e74ee-445e-11eb-8b86-12bb97331649.png

必要的配置和文件包含及添加,如下表所示:

d149fb18-445e-11eb-8b86-12bb97331649.png

基于上面条件执行FFT运算代码,不使用FPU和使用FPU的时间比为16。

采用相似的条件,基于IAR环境对相同功能代码段进行测试,不使用FPU和使用FPU的时间比为11。

关于这个时间比,除了跟是否使用微库、优化等级、浮点精度等有关外,跟你所选取的测试代码也有很大关系,因为有些代码只能靠CPU执行的话,开不开FPU硬件单元对这部分时间是没有影响的。不难理解,被测试代码里只能靠CPU运行的代码占比越多,上面的这个比值就会越小。一般来说,我们不必太过纠结这个值的大小,知道有这个硬件浮点单元,既减轻了CPU负荷,又可以提升计算速度就好。

另外,我们在做DSP相关应用时,注意添加的DSP库既要跟所用芯片匹配,还要跟IDE里的配置匹配。还是以上面测试代码为例,本意是想启用FPU,结果添加的DSP库却是基于不使用FPU硬件的数学库,那会怎么样呢?

d199418c-445e-11eb-8b86-12bb97331649.png

本应该添加arm_cortexM4lf_math.h的,结果弄错了。如果按照上面条件构建ARM MDK工程,一路编译下来没有任何警告或错误提示。程序也能流畅运行,FFT运算结果似乎也出来了。

d1fd51ae-445e-11eb-8b86-12bb97331649.png

但仔细查看结果,跟之前正确配置的运行结果明显不一样。经验证核对,这次运算结果是错的。为此我特意添加一行计算90°的正弦值代码,它算出来结果竟然是1.5!逆天了。

d236a81e-445e-11eb-8b86-12bb97331649.png

如果说在不知情的情况下这一路下来,估计要被摧残一顿了。毕竟很多数学函数结果常人是无法一眼能看出对错的,即使看出错了若没未及时想到库问题的话,恐怕还得折腾折腾。

针对这种情形,基于同样代码于IAR环境下测试,情况相比ARM MDK貌似要好点。至少编译时有警告提示,提示引用冲突之类的。计算结果没有MDK的那么具有隐蔽性【至少对于本次测试是这样】,基本是清一色的0,颇有冲击效果!当然,此时让它计算90°的正弦值结果也是明显错的。

d2617c24-445e-11eb-8b86-12bb97331649.png

感觉上,这种情形下,使用IAR时挖的坑似乎稍微浅些,更容易让人警醒怀疑哪里出问题了。

好,就分享到这里,祝君好运!

原文标题:关于STM32浮点运算单元FPU的小话题

文章出处:【微信公众号:ST MCU 信息交流】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    455

    文章

    50714

    浏览量

    423147
  • STM32
    +关注

    关注

    2270

    文章

    10895

    浏览量

    355742
  • FPU
    FPU
    +关注

    关注

    0

    文章

    42

    浏览量

    21311

原文标题:关于STM32浮点运算单元FPU的小话题

文章出处:【微信号:stmcu832,微信公众号:茶话MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    4G模组Air780E的LuatOS开发之位运算(bit)示例

    本文我要说的是低功耗4G模组Air780E的LuatOS开发,关于运算(bit)示例,我将详细解析分享给大家。
    的头像 发表于 12-02 14:33 159次阅读
    4G模组Air780E的LuatOS开发之位<b class='flag-5'>运算</b>(bit)<b class='flag-5'>示例</b>

    FPGA中的浮点四则运算是什么

    由于定点的四则运算比较简单,如加减法只要注意符号扩展,小数点对齐等问题即可。在本文中,运用在前一节中描述的自定义浮点格式FPGA中数的表示方法(下),完成浮点四则运算的实现过程 1.自
    的头像 发表于 11-16 12:51 226次阅读
    FPGA中的<b class='flag-5'>浮点</b>四则<b class='flag-5'>运算</b>是什么

    FPGA中浮点四则运算的实现过程

    由于定点的四则运算比较简单,如加减法只要注意符号扩展,小数点对齐等问题即可。在本文中,运用在前一节中描述的自定义浮点格式FPGA中数的表示方法(下),完成浮点四则运算的实现过程 1.自
    的头像 发表于 11-16 11:19 396次阅读
    FPGA中<b class='flag-5'>浮点</b>四则<b class='flag-5'>运算</b>的实现过程

    【RA-Eco-RA2E1-48PIN-V1.0开发板试用】在M23内核上使用qfplib浮点运算库进行浮点运算

    瑞萨的RA2E1系列MCU是基于M23内核的,这款芯片是不带FPU浮点运算单元的,使用串口prinf函数打印时是无法打印出浮点数的,只有Co
    发表于 11-05 22:07

    如何提高单片机的运算效率之FPU

    只要STM32或者其他32位单片机,自带FPU功能,就可以加速float类型数据的加减乘除运算。在STM32中要启用FPU,需要启动满足两个
    的头像 发表于 08-30 11:47 555次阅读
    如何提高单片机的<b class='flag-5'>运算</b>效率之<b class='flag-5'>FPU</b>

    请问AURIX TC3xx tricore架构下浮点运算和将浮点数小数点去掉变成整数来计算哪种方式更加节省算力?

    ? tricore架构下CPU有专门的FPU来处理浮点运算,是否意味着用12.89参与运算,在调用FPU来计算的情况下,计算时间不会比12
    发表于 08-26 06:54

    如何关闭ESP32-S3中的FPU浮点数计算单元

    如何关闭ESP32-S3中的FPU浮点数计算单元。如题,之前的项目在esp32s2 上面运行良好,但是移植到esp32s3上后由于fpu造成浮点
    发表于 06-27 07:32

    请问esp32 wroom 32u默认开启硬件浮点运算单元了吗?

    请问esp32 wroom 32u 默认开启硬件浮点运算单元了吗?感谢
    发表于 06-21 11:08

    STM32的HAL库如何开启FPU?

    求:STM32的HAL库如何开启FPU?
    发表于 05-16 07:26

    优秀的Verilog/FPGA开源项目-浮点运算器(FPU)介绍

    浮点运算器(英文:floating point unit,简称FPU)是计算机系统的一部分,它是专门用来进行浮点运算的(CPU中也叫ALU
    的头像 发表于 04-26 11:27 3402次阅读
    优秀的Verilog/FPGA开源项目-<b class='flag-5'>浮点</b><b class='flag-5'>运算</b>器(<b class='flag-5'>FPU</b>)介绍

    verilog语音实现浮点运算

    Verilog可以通过使用IEEE标准的浮点数表示来实现浮点运算。下面是一个基本的Verilog模块示例,展示了如何进行加法、乘法和除法等常见的浮点
    发表于 03-25 21:49

    关于STM32 DMAMUX模块具体的应用示例代码

    有人通过公众号微信留言,询问是否有关于STM32 DMAMUX模块具体的应用示例代码。同时,个人也发现,虽然STM32片内的DMAMUX不是什么新模块,似乎还是很多人并不太熟悉。这里借
    的头像 发表于 03-25 09:15 2415次阅读
    <b class='flag-5'>关于</b><b class='flag-5'>STM32</b> DMAMUX模块具体的应用<b class='flag-5'>示例</b>代码

    CKS32F4xx系列I2S功能介绍

    CKS32F4xx系列使用高性能的32位内核,支持浮点运算单元FPU),同时还支持DSP指令以及存储保护(MPU)用来加强应用的安全性。
    的头像 发表于 03-17 09:40 1204次阅读
    CKS32F4xx系列I2S功能介绍

    如何使用Keil打开GD32 FPU及使用ARM DSP库 ?

    GD32目前支持ARM Cortex-M和RISC-V两种内核系列芯片,其中Cortex-M内核已经支持的有M3、M4、M23、M33、M7,这里面除了M3和M23以外,其他的都带FPU单元。我们知道,FPU
    的头像 发表于 01-13 09:42 3550次阅读
    如何使用Keil打开GD32 <b class='flag-5'>FPU</b>及使用ARM DSP库 ?

    stm32f407浮点运算速度

    支持硬件浮点运算单元FPU),可以提供快速和高效的浮点运算性能。本文将详细介绍
    的头像 发表于 01-04 10:58 3348次阅读