STMCU小助手
发布时间:2022-2-26 16:09
|
前言* D t, d% R# V3 h6 y" L STM32F3xx/STM32F4xx(ARM Cortex-M4 内核)中集成了 FPU,也就是浮点指令单元,可以将浮点运算变得简单快速,但如果想要发挥出这个浮点运算的最大功效,必须使用浮点指令集,开发者可以直接使用浮点指令集,但目前随着系统的集成度更大,开发者还是希望使用 C 语言进行编程,还要求执行时间短,当调用 DSP_Lib 库函数方式,时会有执行时间长的问题,本文以浮点开方为例对此类需求做相关说明。8 x" ?2 ?. ?1 q Cortex-M4 内核浮点指令集 D2 V6 \+ Q5 @# { 数运算算浮点指令& @7 L$ W5 h* J; J1 g7 z2 `- {* i* f2 _ V/ V& w6 O% V. f
转移,调用,比较浮点指令. j# V+ _ M" I; E8 @9 G3 X* G! O( R; B 3 F" t0 {' p/ j l2 Z0 { T- ^
6 e5 A6 n/ n2 v S2 u$ u4 R Keil 编译器的浮点开方使用 1) 编译器设定 }4 r9 b; J: O4 f6 M6 a 首先选择单精度浮点硬件单元
在 Define 部分增加 ARM_MATH_CM4,__FPU_PRESENT=1,__FPU_USED =1 的定义5 O/ u9 l3 ]" [: x
8 G. r/ B0 ^( D 2) 加入包含文件#include "math.h" ) ~3 m- X/ Y& y- _* S; P/ S
3) 加入测试代码' C* N1 g5 A! c) e1 {' q 直接调用内联函数__sqrtf()
汇编代码如下, 可以直观看到 VSQRT.F32 这条直接使用浮点开方运算的指令
IAR 编译器的浮点开方使用% B0 M* G. T+ T' P1 p% j' u 1) 编译器设定* B" S" i. I2 q* \ H6 R. w0 R 选择单精度浮点硬件单元5 a/ W$ L) G% ]0 Y# X7 h 7 E' N- R% C' C1 z+ G: D( P3 H
; p9 u6 I6 s. g1 J) q 2) 加入包含文件#include "math.h"
2 g- M1 C+ W2 m2 {9 Q: c 3) 加入测试代码; v5 j$ }1 _7 L+ W- n 需要调用 sqrtf 这个函数# c) c. L2 \0 _
汇编代码如下,可以看到 VSQRT.F32 这条直接使用浮点开方运算的指令9 G; e- n- Y4 B$ O# f( e1 t . _0 ^" i. d- k8 V! T
M$ L8 V* f1 T) g$ L4 o: k 值得说明的是 IAR 浮点开方调用普通函数库 sqrtf,这个函数库中做了数据大于 0 的判断, 从软件角度上更安全, 但时间会长;而 Keil 的函数__sqrtf()实际上是类似 inline function 的属性,并没有函数调用和返回的指令,更为简单,执行时间短; Z7 n/ t8 Z3 k) g8 q1 d7 w1 L ) U B. f3 }) w3 K |
DMA 原理从 0 到 1:为什么它能解放 CPU?一文讲透 DMA 的工作流程
基于STM32F303双电机FOC驱动: 无感原理图/BOM表/代码等开源...
【福利三:雨露均沾·逢7狂欢】之四:用一个定时器同步另外两个定时器输出PWM
【逢7发帖赢大礼】STM32开发之WIFI实时时钟
【逢7发帖赢大礼】STM32开发之指纹识别!
【逢7发帖赢大礼】STM32开发之环境空气质量监测
【逢7发帖赢大礼】STM32开发之人体实时运动信息监测!
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
【逢7发帖赢大礼】全网最简单的Arduino_STM32开发环境搭建教程!
STM32F4中文用户手册
微信公众号
手机版