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

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

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

5 L4 v! N7 {# B0 V+ f# D: vCortex-M4 内核浮点指令集# N6 `3 S- O. |: n$ p) P2 I" I& n, s
数运算算浮点指令$ r6 t7 ?7 H* l0 {9 G
* \: l* R* b0 I( R+ g
CLF(4K4VWODK$AA7B2`8P~Y.png " @0 X! b9 U& e0 L/ ]4 o9 }$ I

- I* M7 ]5 ^4 }* y6 ?$ M1 n转移,调用,比较浮点指令4 e& ~! O6 d) @" D" W! d# Y; \
4 i# g  V4 [: R% `" ?3 f$ ~
49H_J7FC1THTGFNC`0VP8WP.png
* h* ^% }+ d% P  E* D* Y, N6 J8 N& \7 ~/ h) v
Keil 编译器的浮点开方使用
; V5 a/ V! C, x, A4 C1) 编译器设定
8 C" Y! I, z8 F, F4 e) E
首先选择单精度浮点硬件单元4 t2 s! t" }9 z0 Z7 F

& Z, u5 j; f2 F1 k- f SVW4E{PR7UKQF$J2B[XPV3Q.png
$ M& B4 ]; N" d( k1 A5 i
4 _3 |& c; o" a! ^& T! A+ T+ m在 Define 部分增加 ARM_MATH_CM4,__FPU_PRESENT=1,__FPU_USED =1 的定义- C; h( w$ \  z& M3 f7 v. T
- F& j7 I6 r/ B, E0 P/ V
%PT)22Y1IYWX1DM@7_%PVVH.png " k. R' u2 c4 P
, X9 b5 |5 X, t5 v% v4 Q& y
2) 加入包含文件#include "math.h"
# i+ [5 r% S" L& |" c2 e, A  c6 Z* \* X0 H5 W& C/ H& I

; Y: [4 n) o: \* U( o J6IZICGWE}J3P8RI3[XI[[0.png + I  K) t- |) O* z7 U; r
9 t2 ?9 u/ I, l: U2 Z, K6 X0 K
3) 加入测试代码
* p. L+ E7 K7 O8 u/ t
直接调用内联函数__sqrtf()& C% Z" j  v& V4 h6 V6 T
  1.    volatile float32_t Sqr_Inf1,Sqr_Inf2;: ~6 \- P+ A/ d0 P' {$ Z  y
  2.    volatile float32_t Sqr_Outf[2];
    0 n, s" m3 P. Q0 n
  3.    Sqr_Inf1 = 1560.69f;1 P( H# f1 M7 F  z
  4.    Sqr_Inf2 = 123.2f;
    $ m' y) B# S5 |, G: ?2 S
  5.    while(1)
    8 I9 h" X1 v- b; m" k
  6.    {. r: F( Z. u( t" C
  7.    Sqr_Outf[0] = __sqrtf(Sqr_Inf1);/ K' H" d. ^, x2 ^
  8.    Sqr_Outf[1] = __sqrtf(Sqr_Inf2);  h$ ^3 D0 y) \  e& d5 r
  9.    }
复制代码
* _5 `% l0 l% o  l
   汇编代码如下, 可以直观看到 VSQRT.F32 这条直接使用浮点开方运算的指令
8 z  T2 |- N9 A% [% v2 _
0 u) g) b+ t# c/ d/ \ 5F]MFZMTLXR4}9GL2S]UL.png
8 |* \5 K2 C3 ]. r6 y/ o" H) {: c# R: f3 @* S% w# M5 A8 H; n
IAR 编译器的浮点开方使用
( p- F, z" D9 ]& S* ~1 k1) 编译器设定

7 ~5 j4 ^* ]+ M: J! F   选择单精度浮点硬件单元
' f  I! O0 c* ]. N# X5 A0 N+ `# ?& N4 F4 |
UJ($JVL[O36BAB$`V@)1)GO.png : E$ z/ P! r1 Y

* E7 S5 ^- `- K2) 加入包含文件#include "math.h". b) d" [3 C; B( k, D  i
1 e, p  e9 _* Y$ ^* X: F
{Y00XKN$Z8)XH@D()}1G6]H.png
+ R. k3 f4 w9 w% O3 W2 q! z
5 o0 }( T9 ?3 S* P+ o, V3) 加入测试代码
% p2 l; b- p7 a' }4 o, A4 J   需要调用 sqrtf 这个函数5 K9 _0 x. C4 c- p& h; N( G
  1.    volatile float32_t Sqr_Inf1,Sqr_Inf2;5 t+ }( S! J7 f( A( y+ f: X
  2.    volatile float32_t Sqr_Outf[2];
    9 l3 s  U/ h! P& P
  3.    Sqr_Inf1 = 1560.69f;
      x5 I. ~( b" Q* z
  4.    Sqr_Inf2 = 123.2f;
    ) w1 E0 b- z" n, Q! H5 E) ~/ r: V
  5.    while(1)0 ?" w. F. L6 Y. n: L
  6.    {
    + N# T2 L3 V3 J0 {/ d
  7.    Sqr_Outf[0] = sqrtf(Sqr_Inf1);
    1 r& }. I; P& Q4 ^. ^! t1 o. c
  8.    Sqr_Outf[1] = sqrtf(Sqr_Inf2);9 g7 b' b" N7 K9 C( T: O6 d
  9.    }
复制代码

  x7 ], [/ Y' P# e; G' _5 i1 S   汇编代码如下,可以看到 VSQRT.F32 这条直接使用浮点开方运算的指令
+ T2 @' W4 b2 c; c2 y+ l) V
- V3 G4 N2 b7 p 8V0$_K)674YX]20260(9HUY.png
4 C, N- B) k! M0 F5 i5 F; [  j+ }1 [3 o
值得说明的是 IAR 浮点开方调用普通函数库 sqrtf,这个函数库中做了数据大于 0 的判断, 从软件角度上更安全, 但时间会长;而 Keil 的函数__sqrtf()实际上是类似 inline function 的属性,并没有函数调用和返回的指令,更为简单,执行时间短;
* J  T/ p5 o* V( l/ P6 X. V+ F7 U' f. W& Z: A0 y- B, e. h

% v% I/ B2 O4 ?- @! l
" c4 ^5 y! J1 ~: Y
赞 收藏 评论0 发布时间:2022-2-26 16:09

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版