你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F3xx/STM32F4xx 使用浮点开方指令

[复制链接]
STMCU小助手 发布时间:2022-2-26 16:09
前言
STM32F3xx/STM32F4xx(ARM Cortex-M4 内核)中集成了 FPU,也就是浮点指令单元,可以将浮点运算变得简单快速,但如果想要发挥出这个浮点运算的最大功效,必须使用浮点指令集,开发者可以直接使用浮点指令集,但目前随着系统的集成度更大,开发者还是希望使用 C 语言进行编程,还要求执行时间短,当调用 DSP_Lib 库函数方式,时会有执行时间长的问题,本文以浮点开方为例对此类需求做相关说明。

Cortex-M4 内核浮点指令集
数运算算浮点指令

CLF(4K4VWODK$AA7B2`8P~Y.png

转移,调用,比较浮点指令

49H_J7FC1THTGFNC`0VP8WP.png

Keil 编译器的浮点开方使用
1) 编译器设定

首先选择单精度浮点硬件单元

SVW4E{PR7UKQF$J2B[XPV3Q.png

在 Define 部分增加 ARM_MATH_CM4,__FPU_PRESENT=1,__FPU_USED =1 的定义

%PT)22Y1IYWX1DM@7_%PVVH.png

2) 加入包含文件#include "math.h"


J6IZICGWE}J3P8RI3[XI[[0.png

3) 加入测试代码

直接调用内联函数__sqrtf()
  1.    volatile float32_t Sqr_Inf1,Sqr_Inf2;
  2.    volatile float32_t Sqr_Outf[2];
  3.    Sqr_Inf1 = 1560.69f;
  4.    Sqr_Inf2 = 123.2f;
  5.    while(1)
  6.    {
  7.    Sqr_Outf[0] = __sqrtf(Sqr_Inf1);
  8.    Sqr_Outf[1] = __sqrtf(Sqr_Inf2);
  9.    }
复制代码

   汇编代码如下, 可以直观看到 VSQRT.F32 这条直接使用浮点开方运算的指令

5F]MFZMTLXR4}9GL2S]UL.png

IAR 编译器的浮点开方使用
1) 编译器设定

   选择单精度浮点硬件单元

UJ($JVL[O36BAB$`V@)1)GO.png

2) 加入包含文件#include "math.h"

{Y00XKN$Z8)XH@D()}1G6]H.png

3) 加入测试代码
   需要调用 sqrtf 这个函数
  1.    volatile float32_t Sqr_Inf1,Sqr_Inf2;
  2.    volatile float32_t Sqr_Outf[2];
  3.    Sqr_Inf1 = 1560.69f;
  4.    Sqr_Inf2 = 123.2f;
  5.    while(1)
  6.    {
  7.    Sqr_Outf[0] = sqrtf(Sqr_Inf1);
  8.    Sqr_Outf[1] = sqrtf(Sqr_Inf2);
  9.    }
复制代码

   汇编代码如下,可以看到 VSQRT.F32 这条直接使用浮点开方运算的指令

8V0$_K)674YX]20260(9HUY.png

值得说明的是 IAR 浮点开方调用普通函数库 sqrtf,这个函数库中做了数据大于 0 的判断, 从软件角度上更安全, 但时间会长;而 Keil 的函数__sqrtf()实际上是类似 inline function 的属性,并没有函数调用和返回的指令,更为简单,执行时间短;



收藏 评论0 发布时间:2022-2-26 16:09

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版