STMCU小助手
发布时间:2022-2-26 16:09
|
前言 STM32F3xx/STM32F4xx(ARM Cortex-M4 内核)中集成了 FPU,也就是浮点指令单元,可以将浮点运算变得简单快速,但如果想要发挥出这个浮点运算的最大功效,必须使用浮点指令集,开发者可以直接使用浮点指令集,但目前随着系统的集成度更大,开发者还是希望使用 C 语言进行编程,还要求执行时间短,当调用 DSP_Lib 库函数方式,时会有执行时间长的问题,本文以浮点开方为例对此类需求做相关说明。- B% o4 }& J5 S% r6 {7 y Cortex-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
转移,调用,比较浮点指令4 e& ~! O6 d) @" D" W! d# Y; \ 4 i# g V4 [: R% `" ?3 f$ ~
6 J8 N& \7 ~/ h) v Keil 编译器的浮点开方使用 1) 编译器设定8 C" Y! I, z8 F, F4 e) E 首先选择单精度浮点硬件单元4 t2 s! t" }9 z0 Z7 F
在 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
, X9 b5 |5 X, t5 v% v4 Q& y 2) 加入包含文件#include "math.h" * X0 H5 W& C/ H& I
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
汇编代码如下, 可以直观看到 VSQRT.F32 这条直接使用浮点开方运算的指令
) {: c# R: f3 @* S% w# M5 A8 H; n IAR 编译器的浮点开方使用 1) 编译器设定 选择单精度浮点硬件单元 + `# ?& N4 F4 |
2) 加入包含文件#include "math.h". b) d" [3 C; B( k, D i 1 e, p e9 _* Y$ ^* X: F
3) 加入测试代码 需要调用 sqrtf 这个函数5 K9 _0 x. C4 c- p& h; N( G
汇编代码如下,可以看到 VSQRT.F32 这条直接使用浮点开方运算的指令
0 F5 i5 F; [ j+ }1 [3 o 值得说明的是 IAR 浮点开方调用普通函数库 sqrtf,这个函数库中做了数据大于 0 的判断, 从软件角度上更安全, 但时间会长;而 Keil 的函数__sqrtf()实际上是类似 inline function 的属性,并没有函数调用和返回的指令,更为简单,执行时间短; 7 U' f. W& Z: A0 y- B, e. h |
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中文用户手册
微信公众号
手机版