FPU与VFP最全面解释

STM32F407-Discovery的硬件FPU FPU:Float Point Unit,也就是浮点运算单元。如果是定点 CPU(没有 FPU 的 CPU)计算浮点数,则按照 IEEE-754 标准,完成运算需要大量的指令,很耗费时间,几乎不能满足实时性的要求。但是对于有 FPU 的芯片来说,完成一个浮点运算或许只是几条指令就可以搞定,速度相对就快很多。 STM32F4具有有 32 位单精度硬件FPU[能加速计算float类型的数据],支持浮点指令集,相对于Cortex M0 和 Cortex M3高出数十倍甚至上百倍的运算性能。 阅读详情
AI摘要

本文详细介绍了ARM处理器中的浮点运算单元(FPU)、浮点协处理器类型(如VFPv3、VFPv4)以及浮点运算处理方式(soft、softfp、hard)。讨论了浮点运算在硬件和软件层面的实现,并提到了与NEON(SIMD技术)的关系。内容包括浮点寄存器、浮点运算库的使用,以及如何通过编译选项控制FPU的使用。还探讨了不同FPU版本间的差异,如VFPv3与VFPv4新增的功能。

本文希望能将FPU以及ARM中的FPU介绍清楚。

1. FPU(Floating-Point Unit)

浮点运算单元是处理器内部用于执行浮点数计算的逻辑部件,或者说硬件电路。不是所有的处理器都有该功能。浮点运算满足IEEE 754的标准,所谓IEEE 754标准,定义了浮点数字的存储和计算方式、计算异常等,比如IEEE 754标准准确地定义了单精度(32位)和双精度(64位)浮点格式。
对于含有FPU的处理器,我们可以通过控制编译选项的方式使编译器编译出的代码使用FPU指令。

2. -mfloat-abi=name来指定浮点运算处理方式

gcc为例,对应的-mfloat-abi参数值有三个:soft,softfp,hard。

  1. soft是指所有浮点运算全部在软件层实现,比如ARM提供了一个「浮点支持软件库」用于计算浮点数:fplib。使用软件的方式来计算浮点最终是通过执行了很多的指令来完成一次运算,不仅慢而且程序体积大。fplib提供的 API 以__aeabi开头,比如:__aeabi_fadd:计算两个float型浮点数加法(float占4个字节,32位)
  2. softfp是指浮点运算的实际计算是在FPU上来做,但是传递浮点运算的参数是用整形的通用寄存器(r0-r3)来传递的。比如float fadd(float a, float b),a和b实际上是通过r0,r1传入到被调函数的,结果也是通过r0传出的。
  3. hard与softfp的区别是不仅运算实际发生在FPU上,浮点参数的传递使用的也是浮点专用寄存器。以上同样的例子,a和b是通过s0, s1寄存器来传的,结果是通过s0传出的。softfp和hard两种模式不兼容,所以你不能将一个使用softfp方式的库和另外一个使用hard的库或目标文件链接起来。因为如此,armv7有些编译好的库(比如glibc使用softfp)没法在使用另一种使用hard的应用中编译。
    在这里插入图片描述

使用软件库编译出的代码实例:
在这里插入图片描述
使用hard编译出的使用FPU的代码实例:
在这里插入图片描述

3. -mfpu=name来指定浮点协处理的类型

在ARM中的FPU被称为VFP(Vector Floating Point),即向量浮点运算,之所以称为“向量”浮点是因为在ARMv6及以前这个扩展不只是用于增加浮点数计算处理,同时也用于类似向量的SIMD浮点数计算处理。在ARMv7架构中,这种使用VFP来处理向量浮点数据的方式不建议采用,相关的功能可以使用“先进SIMD扩展”来替代。而vfp经过几代的发展和完善,出现了vfpv3, vfpv4, fpv5等多个版本,每个版本又可以配置为不同的使用方式,所以,这个-mfpu参数就是指定所采用的vfp硬件。
在文档《Arm Compiler for Embedded Reference Guide》中列举了可以使用的值,可选类型如none, softvfp,vfpv3,vfpv3-d16,vfpv3-d16-fp16,vfpv3xd, neon, vfpv4,fpv4-sp-d16,fpv5-d16,fpv5-sp-d16等。简单从文档中摘出几个:

  • none, softvfp: Use either -mfpu=none or -mfpu=softvfp to prevent the compiler from using hardware-based floating-point functions. If the compiler encounters floating-point types in the source code, it uses software-based floating-point library functions. This option is similar to the -mfloatabi=soft option.
  • vfpv3: Enable the Armv7 VFPv3 Floating-point Extension. Disable the Advanced SIMD extension.
  • vfpv3-d16: Enable the Armv7 VFPv3-D16 Floating-point Extension. Disable the Advanced SIMD extension.
  • vfpv3-fp16: Enable the Armv7 VFPv3 Floating-point Extension, including the optional half-precision extensions. Disable the Advanced SIMD extension.
  • vfpv4:Enable the Armv7 VFPv4 Floating-point Extension. Disable the Advanced SIMD extension.
  • neon-vfpv4:Enable the Armv7 VFPv4 Floating-point Extension and the Advanced SIMD extension.
  • fpv5-sp-d16: Enable the Armv7 FPv5-SP-D16 Floating-point Extension for single precision only.

如果你对d16之类的后缀感兴趣,下面这张浮点寄存器表可能解答你的疑惑,其中D代表double,64bit寄存器,sp表示single precision, 表示只允许32位单精度浮点计算:
在这里插入图片描述
还有个小问题就是vfpv3, vfpv4, vfpv5之间有什么区别呢?从维基百科ARM architecture family 4.10章节中摘录如下:https://en.wikipedia.org/wiki/ARM_architecture_family#Floating-point_(VFP)

  • VFPv1
    Obsolete
  • VFPv2
    An optional extension to the ARM instruction set in the ARMv5TE, ARMv5TEJ and ARMv6 architectures. VFPv2 has 16 64-bit FPU registers.
  • VFPv3 or VFPv3-D32
    Implemented on most Cortex-A8 and A9 ARMv7 processors. It is backward-compatible with VFPv2, except that it cannot trap floating-point exceptions. VFPv3 has 32 64-bit FPU registers as standard, adds VCVT instructions to convert between scalar, float and double, adds immediate mode to VMOV such that constants can be loaded into FPU registers.
  • VFPv3-D16
    As above, but with only 16 64-bit FPU registers. Implemented on Cortex-R4 and R5 processors and the Tegra 2 (Cortex-A9).
  • VFPv3-F16
    Uncommon; it supports IEEE754-2008 half-precision (16-bit) floating point as a storage format.
  • VFPv4 or VFPv4-D32
    Implemented on Cortex-A12 and A15 ARMv7 processors, Cortex-A7 optionally has VFPv4-D32 in the case of an FPU with Neon. VFPv4 has 32 64-bit FPU registers as standard, adds both half-precision support as a storage format and fused multiply-accumulate instructions to the features of VFPv3. 相比v3增加了半精度和乘加指令的支持。
  • VFPv4-D16
    As above, but it has only 16 64-bit FPU registers. Implemented on Cortex-A5 and A7 processors in the case of an FPU without Neon.
  • VFPv5-D16-M
    Implemented on Cortex-M7 when single and double-precision floating-point core option exists. 单双精度可以选择。

此外,关于VFP架构和功能上的一些解释可以参考:《ARM Compiler armasm User Guide Version 5.06》 VFP Programming一节,写得比较清楚: https://developer.arm.com/documentation/dui0473/m/vfp-programming/architecture-support-for-vfp

4. NEON和VFP

在上面的一些介绍中,可以看到NEON经常和VFP一起出现,ARM中的NEON即SIMD(单指令多数据)技术,是一种真正的向量化运算方式,他们之所以耦合在一起是因为他们公用浮点寄存器。
在这里插入图片描述在这里插入图片描述
这里插一句题外话,如果想入门ARM SIMD编程,【张先轶】SIMD向量化编程入门——https://www.bilibili.com/video/BV1KZ4y1Y7VH/?spm_id_from=333.337.search-card.all.click&vd_source=d9ead405209236cb507b6c90c75777f9 这个课程可以借鉴。

以下是NEON与VFP的几点异同。

  1. ARM架构中支持 没有NEON和VFP, 只有VFP,NEON和VFP都有 三种配置,不支持只有NEON的配置。
  2. NEON使用32个双精度浮点寄存器,即32D,因此如果一些VFP配置D16则就无法使用NEON了。
  3. NEON不支持双精度浮点的计算,也不支持如square root和divide等一些比较复杂的浮点运算。
5. 编译工具中配置FPU

在上述2和3中描述了如何配置编译选项能够让编译器编译出来使用FPU指令的代码,那对于没有makefile的GUI用户如何设置呢?
MDK:
在这里插入图片描述
IAR:
在这里插入图片描述
ARM Cortex - M4内核中将 FPU 作为协处理器设计的,所以通过设置协处理器访问控制(CPACR,Co-processor access control register)来控制是否使能FPU。在这些工具软件中使能FPU后,编译器会设置宏定义__FPU_USED == 1,该配置将在代码中启用FPU硬件。

#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
 SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
#endif
参考:
  1. ARM技术杂谈:何谓FPU、VFP、ASE、NEON、MPE、SVE、SME以及MVE —— https://www.eefocus.com/article/521046.html
  2. Armv8上不弃不离的NEON/FPU —— https://www.jianshu.com/p/a19cc2ca59da
  3. ARM FPU 加速浮点计算 介绍 —— https://blog.youkuaiyun.com/u014436243/article/details/122078377
  4. ARM Cortex-A Series Programmer’s Guide for ARMv7-A —— https://developer.arm.com/documentation/den0013/d/Introducing-NEON/NEON-architecture-overview/Commonality-with-VFP
  5. ARM Cortex-M7 Processor Technical Reference Manual r0p2:About the FPU —— https://developer.arm.com/documentation/ddi0489/b/floating-point-unit/about-the-fpu
  6. IEEE 754浮点数标准详解 —— http://c.biancheng.net/view/314.html
  7. arm浮点运算 —— http://t.zoukankan.com/-9-8-p-9254964.html
Stm32F4XX开启FPU浮点运算 stm32开启FPU 阅读详情

相关推荐

IAR中配置STM32硬件FPU的方法:通俗解释步骤

详细介绍在IAR环境下启用STM32硬件FPU的设置方法,帮助开发者提升浮点运算性能。内容涵盖关键选项配置与常见问题规避,确保充分发挥iar编译器优势,实现高效代码执行。

weixin_34471637的博客 684

FPU烤机是什么意思 FPU烤机用什么软件

进行FPU烤机,就不得不提及AVX指令集,AVX(Advanced Vector Extensions)高级向量扩展指令集,包含了宽度高达512bit的寄存器,以满足处理器进行单指令多数据流操作,大大提高了浮点计算能力,因此很多程序均支持AVX指令。AVX提高浮点计算能力的同时也显著的提高了处理器的负荷,因此使用AVX指令对CPU进行浮点运算能力稳定性测试非常适合。

xilan888的博客 5万+

深入解析Keil5 FPU配置:从__FPU_PRESENT宏到设备兼容性实战

本文深入解析Keil5开发中FPU配置的核心机制与常见错误,重点探讨__FPU_PRESENT宏的定义逻辑、设备兼容性检查原理及CMSIS版本冲突解决方案。通过系统化的故障排查流程和实战案例,帮助开发者正确处理'Compiler generates FPU instructions for a device without an FPU'等FPU配置错误,确保硬件与软件配置匹配,提升嵌入式开发效率。

open4的博客 710

STM32 keil MDK配置FPU详解

stm32 keil配置FPU详解

Telly_的博客 1万+

STM32F4 DSP库配置避坑指南:FPU启用、宏定义与链接全解析

在嵌入式信号处理中,浮点运算单元(FPU)能大幅加速FIR滤波、FFT等算法。Cortex-M4内核的FPU通过硬件指令替代软件模拟,显著提升实时性。然而,启用FPU需正确配置编译器目标架构、预定义宏(如__FPU_PRESENT、__FPU_USED)及链接库文件。STM32F4系列开发中,常因宏定义不匹配或库链接错误导致性能下降或编译失败。本文以STM32F407为例,详解CubeMX环境下DSP库的配置步骤、宏定义作用及常见问题排查,帮助开发者快速实现高性能数字信号处理。

weixin_29182481的博客 169

STM32 FPU配置全解析:从原理到实战,释放硬件浮点运算性能

在嵌入式系统开发中,浮点运算单元(FPU)作为协处理器,专门用于高效执行IEEE 754标准的浮点运算指令。其工作原理是,当CPU遇到浮点运算时,可将任务交由FPU以硬件电路速度(通常1-2个时钟周期)完成,相比软件模拟库的数百个周期,能带来数十甚至上百倍的性能提升。这一技术价值在于,它能显著优化电机FOC控制、数字信号处理等对浮点计算密集型应用的实时性。在STM32等基于Cortex-M4/M7内核的微控制器上,正确配置并启用FPU是发挥其硬件潜力的关键。本文将以KEIL MDK开发环境为例,深入讲解如何

weixin_30550081的博客 499

【ARM】FPU,VFP,ASE,NEON,SVE...是什么意思?

对执行浮点和SIMD操作的逻辑的各种名称的缩写词进行简要解释。

Emdoor123的博客 1167

关于CPU和FPU拷机的区别扫盲

CPU是计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。CPU拷机进行的是高负荷整数运算,主要测试的是CPU的单核性能。FPU是专用于浮点运算的处理器,是一种单独芯片。进行的是高负荷实数(浮点)运算,主要测试的是CPU的全核性能。首先,拷机是对整个主机系统(CPU/内存/硬盘等硬件)整个运行情况的稳定性测试!

米可的博客! 8031

Keil5中启用FPU:但SF32LB52 Cortex-M7无浮点单元

本文揭示了在Keil5中为无FPU的Cortex-M7芯片(如SF32LB52)启用硬件浮点单元导致程序崩溃的问题,分析了FPU指令引发HardFault的根本原因,提供了通过编译配置、预处理宏和汇编验证避免陷阱的方法,并强调芯片规格与实际功能差异的风险。

hill8的博客 1008

5个免费股票数据API实测对比:从AkShare到BaoStock,哪个最适合你的AI量化项目?

本文深度评测了AkShare、BaoStock、yfinance、Alpha Vantage和EOD Historical Data这五个免费股票数据API,从数据质量、覆盖范围、更新频率、稳定性及易用性进行对比。针对AI量化项目,文章提供了详细的选型策略,帮助开发者根据项目阶段与需求,精准选择最适合的数据源,并强调了多源验证与数据清洗的重要性。

weixin_29290947的博客 5079

Linux-ftrace-双nop机制的实现

linux-ftrace内核追踪-双nop机制的实现原理

qq_43707773的博客 1071

linux arm fpu初始化,如何确定Linux主板是否使用硬件FPU?

我使用的是基于相当旧的Freescale ARM芯片的嵌入式Linux主板.如何确定Python解释器是否使用芯片上的硬件FPU?我的/ proc / cpuinfo是:Processor : ARM926EJ-S rev 5 (v5l)BogoMIPS : 179.81Features : swp half thumb fastmult edsp java...

weixin_33199315的博客 704

STM32CubeMx搭建LWIP程序

  使用STM32CubeMx5.21,在stm32f745平台上搭建ethernet通信程序,PHY选用KSZ8081RNB。(LAN8742/DP83848使用一样) 1、系统时钟设置   RCC设置,勾选外部高速时钟源。   系统时钟配置。写入外部晶振频率、HSE提供PLCCLK、HCLK,其他参数自动生成。 2、ETH设置   勾选设置NVIC。   根据硬件设置对应GPIO引脚。   参数设置默认   根据硬件设置PHY地址,其他参数默认。 3、LWIP设置   勾选使能,通用参数设置

Gandalf94的博客 3237

STM32浮点运算单元(FPU)和DSP库使用

STM32F4使用浮点运算单元与DSP库。

32Haozi 6844

基于OpenMV与双舵机云台的激光追踪系统实战解析

本文详细解析了基于OpenMV摄像头与双舵机云台的激光追踪系统设计与实现。从硬件选型、图像识别算法到PID控制逻辑,全面介绍了如何构建一个高效稳定的激光追踪系统,并分享了电子设计竞赛中的实战经验与调试技巧。该系统在智能玩具、安防监控及教学演示等领域具有广泛应用前景。

prometheus9mon的博客 261

杰理外挂flash使用教程(三): 打包提示音到外部flash(2)

本教程详细介绍了提示音制作与程序配置的全流程规范。提示音制作要求包括:英文命名(8字符内)、单声道转换、标准目录结构(cpu/br23/tools/)及使用user_tone_g.bat脚本生成res.bin资源文件。程序配置需修改:1)启用NOR_FS文件系统;2)调整存储空间;3)配置外置Flash参数;4)增强下载脚本追加资源参数。测试阶段建议替换开机提示音验证功能,扩展开发可参考tone_player.c的索引播放逻辑。所有操作均配有图示说明,关键配置需修改对应头文件和脚本参数。

qq_42014563的博客 586

mdk arm开启FPU报错问题

本文记录了mdk arm使用v6版本编译器开启fpu失败问题及解决方法。

gogo0707的博客 1570

2025机械考研复试面试问题汇总篇(含13门科目),考研机械复试专业面试常见重点问题总结!考研机械复试专业面试准备看这一篇就够了!

(完整版内容:)1.汇集了本科各科的重点知识及多个机械名校800多个常见问题,共8.7万字185页,涵盖机械所以专业课的重点知识和常见问答。 2.涉及机械大类重点科目,包括:材料力学、控制工程、数控技术、机械制造技术基础、理论力学、液压传动、机械设计、机械原理、工程材料、互换性与技术测量、测试技术、汽车理论、程序设计与C语言等13门必修课。

weixin_56510835的博客 1861

Cortex-M浮点单元(FPU)使用指南:新手必看示例

深入浅出讲解Cortex-M系列处理器中浮点单元的配置与应用,结合ARM架构特性,帮助开发者高效利用硬件FPU进行浮点计算,提升嵌入式系统性能。

weixin_28729843的博客 651

168、OIS光学防抖系统设计:陀螺仪标定、音圈马达驱动与滚珠式/悬丝式结构选型

本文总结了OIS光学防抖系统设计中的关键问题与解决方案。作者通过实际案例指出,陀螺仪标定需重视零偏、灵敏度和温度补偿问题,音圈马达驱动需采用电流环控制并优化相位补偿。在机械结构选型方面,滚珠式适合大角度补偿但存在回差问题,悬丝式精度高但受重力影响,需根据应用场景选择。系统联调建议从开环到闭环逐步验证,注意陀螺仪与驱动频率匹配。最后给出5条经验建议:关注陀螺仪信噪比而非分辨率、预留标定余量、重视机械结构公差、配备专业调试工具、协调OIS与电子防抖的分工配合。文章强调OIS调试需针对不同模组特性进行反复测试与标

zzfmlxs的博客 43

从登录到应用可见:在 SAP S/4HANA Cloud Private Edition 中创建用户与打通 SAP Fiori 权限的完整思路

在SAP S/4HANA系统中,用户创建远非简单的账号开通,而是涉及认证、授权、数据访问等多维度的复杂过程。用户主数据记录(User Master Record)是系统访问的起点,包含登录方式、角色分配等关键信息。认证解决"你是谁"的问题,授权则决定"你能做什么"。SAP Fiori访问链路涉及Launchpad内容分配、应用启动映射、OData服务权限等多层校验。角色(Role)通过PFCG维护,包含业务目录(Catalog)和空间(Space)等元素,共同构成完整

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 148

FPU、NEON、SVE、MVE等七大缩写解析:从硬件到指令集

在嵌入式与芯片选型中,浮点运算单元(FPU)、SIMD指令集(如NEON)和向量扩展(如SVE、MVE)是核心概念。FPU作为硬件加速浮点计算,NEON通过单指令多数据实现并行处理,而SVE和MVE则分别面向高性能计算与微控制器场景,提供可伸缩或精简的向量能力。理解这些技术的层级关系与编译配置,能帮助开发者在移动端、物联网或服务器应用中优化性能。本文系统梳理FPU、VFP、ASE、NEON、MPE、SVE、MVE的定位与联系,助你快速掌握芯片选型与编译选项配置。

weixin_29161785的博客 316

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

STM32F407 FPU开启后HardFault排查与性能优化实战

浮点运算单元(FPU)是Cortex-M4内核的可选组件,用于加速单精度浮点计算。其原理是通过协处理器接口执行VFP指令,但需手动使能CPACR寄存器并匹配编译器ABI。正确配置后,浮点性能可提升数十倍,适用于电机控制、数字滤波等实时场景。然而,配置不当易引发HardFault,需通过CFSR寄存器定位NOCP或INVSTATE错误。本文深入解析STM32F407的FPU配置链路、故障排查与性能实测,帮助开发者避开常见陷阱。

weixin_29190573的博客 224

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

STM32F4浮点运算从入门到放弃?可能是你的arm-gcc编译链和标准库在‘打架’

本文深入探讨STM32F4浮点运算性能调优,解析arm-gcc编译链与标准库协作问题。通过反汇编分析、宏定义验证和构建系统配置,揭示FPU未生效的根本原因,并提供CMake、Makefile的完整解决方案及性能优化技巧,帮助开发者充分发挥STM32F4的硬件浮点运算能力。

weixin_27966471的博客 344

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Linux内核FPU上下文切换原理与实时性优化

FPU上下文切换是操作系统进程调度中影响实时性能的关键环节,其本质并非简单的寄存器保存恢复,而是基于硬件状态(如x86的cr0.ts)、CPU局部性与任务类型(用户task/内核task)协同决策的状态管理机制。该机制通过懒加载(lazy save/on-demand restore)降低95%以上无谓开销,同时以严格的状态仲裁保障数据隔离与内核一致性。在嵌入式实时系统、高频交易及音视频处理等低延迟场景中,FPU切换不当会直接导致μs级抖动突增、信号处理异常或内核panic。本文深入解析Linux内核中FP

weixin_34195142的博客 182

ARM Linux Kernel浮点运算(软浮点、硬浮点)

硬浮点Hard-float 编译器将代码直接编译后给硬件浮点协处理器(浮点运算单元FPU)去执行。FPU通常有一套额外的寄存器来完成浮点参数传递和运算。使用实际的硬件浮点运算单元FPU当然会带来性能的提升。因为往往一个浮点的函数调用需要几个或者几十个时钟周期。 软浮点 Soft-float 编译器把浮点运算转换成浮点运算的函数调用和库函数调用,没有FPU的指令调用,也没有浮点寄存器的参数传递

雨日微风 9887
上一篇: Cache与MMU的爱恨纠缠
下一篇: bootloader要做什么?错!应用代码正式运行前要准备什么?对
隋边边
博客等级 码龄11年 304粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值