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库函数方式,时会有执行时间长的问题,本文以浮点开方为例对此类需求做相关说明。 , [, _4 P8 K; q3 c1 P' C q3 \5 ^$ Q Cortex-M4内核浮点指令集7 b% o, g& J/ D, T4 B4 _ 数**算浮点指令 转移,调用,比较浮点指令 4 Y6 {' u. x# ] : }0 R& v- h& C- V# V% X4 ?9 \ Keil编译器的浮点开方使用 # r/ e0 U3 v7 K \( ? 1) 编译器设定, m: i1 B1 S) u3 g7 x4 X 首先选择单精度浮点硬件单元' l" `2 s9 R& ]% h2 t 在Define部分增加ARM_MATH_CM4,__FPU_PRESENT=1,__FPU_USED =1的定义 2) 加入包含文件#include "math.h" 3) 加入测试代码$ Y( G9 j9 e; f/ o/ s 直接调用内联函数__sqrtf() 3 V% f: Y3 T9 Z" y$ Z+ ?4 G 汇编代码如下, 可以直观看到VSQRT.F32这条直接使用浮点开方运算的指令1 t8 \3 u; B7 v/ F( O! |' b5 H 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 2) 加入包含文件#include "math.h"7 X+ Y9 Y A0 x# Y4 M3 c3 ~& F 3) 加入测试代码 需要调用sqrtf这个函数 : @9 S3 |+ {) g7 v 汇编代码如下,可以看到VSQRT.F32这条直接使用浮点开方运算的指令* i$ G% M6 z% b! ~ 值得说明的是IAR浮点开方调用普通函数库sqrtf,这个函数库中做了数据大于0的判断, 从软件角度上更安全, 但时间会长; 而Keil的函数__sqrtf()实际上是类似inline function的属性,并没有函数调用和返回的指令,更为简单,执行时间短。 文档下载地址: https://www.stmcu.org.cn/document/list/index/category-1017 " G1 [6 X8 m0 D! N( @ 实战经验汇总:2 g6 ~+ O6 }: y https://www.stmcu.org.cn/module/forum/thread-576401-1-1.html |
内联函数__sqrtf() 在哪里找的?不熟悉的人根本不知道这个, 还有这个跟调用dsp库的开放有区别吗 |
谢楼主分享 |
感谢楼主的分享 |
基于STM32F334的数字电源
STM32固件库分享,超全系列整理
【中文文档】AN3965_STM32F40x和STM32F41x基于串口的IAP
STM32F4-DISC 实现USB主机(U盘)和USB设备(虚拟串口)自动切换
STM32F3DISCOVERY + UCGUI3.90A的移植(源码+视频)
STM32F4中文用户手册
基于STM32F407的FreeRTOS阶段性的总结(13)
STM32F400、STM32F402 Cortex-M4超值单片机
基于STM32F407的FreeRTOS获取各任务运行时间及占用情况(4)
基于STM32F407的FreeRTOS任务的挂起与恢复(3)