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

【实战经验】STM32F3xx/STM32F4xx使用浮点开方指令

[复制链接]
zero99 发布时间:2016-6-28 14:40
STM32F3xx/STM32F4xx使用浮点开方指令
2 q& Q* o2 a) \; d: K! C
前言+ q. y( J# Y4 L# \6 O  f' m. \+ d6 ~
STM32F3xx/STM32F4xx(ARM Cortex-M4内核)中集成了FPU,也就是浮点指令单元,可以将浮点运算变得简单快速,但如果想要发挥出这个浮点运算的最大功效,必须使用浮点指令集,开发者可以直接使用浮点指令集,但目前随着系统的集成度更大,开发者还是希望使用C语言进行编程,还要求执行时间短,当调用DSP_Lib库函数方式,时会有执行时间长的问题,本文以浮点开方为例对此类需求做相关说明。
$ O! G% M4 C) @( Y; E' ~, [, _4 P8 K; q3 c1 P' C  q3 \5 ^$ Q
Cortex-M4内核浮点指令集7 b% o, g& J/ D, T4 B4 _

5 A  f/ A/ D+ ?' I; d数**算浮点指令
! z: X+ K$ N" Z* C, c7 Q; u
51.jpg * T: T" c# @/ n: b
转移,调用,比较浮点指令 4 Y6 {' u. x# ]
52.jpg
" E8 B5 H3 B: q: D, C! N: }0 R& v- h& C- V# V% X4 ?9 \
Keil编译器的浮点开方使用
, N" T6 u6 ~: m# ^! ]# r/ e0 U3 v7 K  \( ?
1) 编译器设定, m: i1 B1 S) u3 g7 x4 X
首先选择单精度浮点硬件单元' l" `2 s9 R& ]% h2 t
53.jpg 2 ^5 O. Z& o& N% e! n" k( T
在Define部分增加ARM_MATH_CM4,__FPU_PRESENT=1,__FPU_USED =1的定义
* V3 N% U, p  K/ v5 {) Q  T) W
54.jpg 9 w7 h- I. i0 V) R& `
2) 加入包含文件#include "math.h"
' Z4 D& T# `8 N* G1 {
55.jpg / T2 [; D( M6 _, I; g6 W6 f
3) 加入测试代码$ Y( G9 j9 e; f/ o/ s
直接调用内联函数__sqrtf() 3 V% f: Y3 T9 Z" y$ Z+ ?4 G
56.jpg 2 K# H: J# V" |( p
汇编代码如下, 可以直观看到VSQRT.F32这条直接使用浮点开方运算的指令1 t8 \3 u; B7 v/ F( O! |' b5 H
57.jpg % P) |8 A) e- b5 H- d
0 d# Z' j+ _: E' @
IAR编译器的浮点开方使用; U0 {* ~  w/ _' v5 T/ J- c" `
, ^4 R* |  o$ @2 P! o
1) 编译器设定, y8 S3 ^, r  V" b; M
选择单精度浮点硬件单元9 _% N. V/ @6 H# g; v  @+ M2 f4 z0 i
58.jpg
' M% o7 L0 S; B( V9 b3 r2) 加入包含文件#include "math.h"7 X+ Y9 Y  A0 x# Y4 M3 c3 ~& F
59.jpg
5 w. U# |; t2 l: s  D- U6 R4 T3) 加入测试代码
& p1 G2 _, R! Q/ K" t. v5 q* h需要调用sqrtf这个函数 : @9 S3 |+ {) g7 v
60.jpg
4 g5 g4 w+ s& _* [汇编代码如下,可以看到VSQRT.F32这条直接使用浮点开方运算的指令* i$ G% M6 z% b! ~
61.jpg
+ D$ V: e3 {; [( w& [值得说明的是IAR浮点开方调用普通函数库sqrtf,这个函数库中做了数据大于0的判断, 从软件角度上更安全, 但时间会长; 而Keil的函数__sqrtf()实际上是类似inline function的属性,并没有函数调用和返回的指令,更为简单,执行时间短。
/ T8 V7 h: ]7 f/ ~$ K- n0 ]
( A+ {8 x- j$ S# D% X3 K& u
+ y) O! f% S, l) S) K/ D# B  A% _: k文档下载地址:
3 c7 D' f! `3 s2 l1 f$ k" V. b6 bhttps://www.stmcu.org.cn/document/list/index/category-1017
8 c( j1 y8 Q* |9 S" G1 [6 X8 m0 D! N( @
实战经验汇总:2 g6 ~+ O6 }: y
https://www.stmcu.org.cn/module/forum/thread-576401-1-1.html
收藏 2 评论3 发布时间:2016-6-28 14:40

举报

3个回答
jcx0324 回答时间:2016-11-23 16:04:59
内联函数__sqrtf()    在哪里找的?不熟悉的人根本不知道这个,  还有这个跟调用dsp库的开放有区别吗
zengyi703-16313 回答时间:2016-11-23 19:40:00
谢楼主分享
andypanfan 回答时间:2016-11-24 08:48:24
感谢楼主的分享
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版