本文将深入探讨如何启用 FPU、进行精确计算以及优化代码性能,并提供详细的代码示例。 FPU 是处理器中的硬件模块,专门处理浮点运算(如加、减、乘、除),相比软件实现,其执行速度更快,精度更高。 1 启用 FPU 的步骤 要使用 FPU,需要完成以下两个步骤: 设置编译器标志:确保编译器生成硬件浮点指令。对于 GCC,使用 -mfloat-abi=hard 标志,指示使用硬件 FPU。 启用 FPU 寄存器:在代码中设置系统控制块(SCB)的协处理器访问控制寄存器(CPACR),启用 FPU。 2 使用 FPU 进行精确计算 启用 FPU 后,可以执行各种浮点运算。 中断与任务管理:在多任务或中断场景下,确保 FPU 状态正确保存,防止寄存器冲突。 通过正确启用和使用 FPU,STM32 微控制器可在浮点运算中实现高精度和高性能。
现在很多高端处理器都有自己的FPU,用来做一些特殊的运算,虽然早期的单片机是没有FPU的,但是经过十几年的发展,现在的单片机都有属于自己的FPU,虽然其功能不是特别强大,但是最够其单芯片应用环境下的运算使用 一 ❝https://github.com/dawsonjon/fpu ❝https://opencores.org/projects/fpu100 这是GitHub上排名比较靠前的FPU开源项目,下面是他的介绍 它位于 fpu/fcmp 目录中。 兼容性 FPU 100% 符合 IEEE 754。已经跑了超过 1400 万测试向量,使用 John R. ❝https://github.com/jm2000/RISCV-FPU 这也是专门为RISC-V定制的FPU项目。 九 ❝https://github.com/YutaPic/FPU 这也是在Xilinx FPGA上验证的FPU,下面是在KCU105开发板上运行的性能: 总结 今天只介绍了几个FPU的项目,在SoC
“脏活”从主 CPU 卸载到专用的 FPU 硬件中处理。 其核心观点包括: 功能解耦:将复杂的软件协议处理(DPU)与底层的闪存物理管理(FPU)分离,这正是前几张幻灯片提到的“计算存储”和“FPU 架构”的具体落地。 FPU 的竞争优势: 相比于在 PCB 上增加额外的 Buffer 芯片,将 FPU 功能直接下放到子通道中,可以在维持最优信号质量的同时,实现全协议感知且无额外延迟。 明确的路线图: 指出了 2025 年底这一关键节点,标志着基于 FPU 的分布式控制器方案(如之前讨论的 DPU + FPU 组合)即将进入实际应用阶段。 FPU(执行单元/技术官):负责“底层活”。
ARM FPU的魅力 FPU(Floating Point Unit,浮点单元)是ARM内核中的硬件外设,用于硬件计算浮点数,要想使用FPU计算浮点数,需要程序和编译器配合。 在程序中使能/开启FPU硬件外设,「使 FPU 硬件可以正常工作」; 在编译器中设置使用FPU,编译器会将所有浮点计算的代码都编译为「使用FPU操作指令完成」。 )来控制是否使能FPU。 __FPU_PRESENT宏定义是一直使能的,那么如何来控制FPU的使能呢? 别忘了还有一个宏定义__FPU_USED,这是留给编译器来控制的! 3. ARMCC编译器如何开启FPU MDK编译器开启FPU的方法非常简单,如图: ?
这些寄存器是独立的,和FPU和MMX寄存器没有重叠,所以SSE扩展和FPU/MMX指令可以混合使用。奔腾4又又引入了新的扩展:SSE2扩展,是在SSE基础上的扩展,支持更高精度的浮点数。 2 FPU相关数据结构 Linux内核是使用什么数据结构表示FPU、MMX和XMM这些需要保存的寄存器值呢? ()完成保存这些寄存器的基本工作,如下所示: 将FPU寄存器的内容保存到旧进程的描述符中,然后重新初始化FPU。 然后,restore_fpu()就会把正确的值加载到FPU寄存器中。这个加载过程需要调用汇编指令fxrstor或frstor,使用哪一个取决于CPU是否支持SSE/SSE2扩展。 5 在内核中使用FPU、MMX和SSE/SSE2单元 当然了,内核中也可以使用FPU、MMX或SSE/SSE2硬件单元(虽然,大部分时候没有意义)。
size : 16384 KB physical id : 0 siblings : 1 core id : 0 cpu cores : 1 apicid : 0 initial apicid : 0 fpu : yes fpu_exception : yes cpuid level : 22 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic : yes fpu_exception : yes cpuid level : 22 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic : yes fpu_exception : yes cpuid level : 22 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic : yes fpu_exception : yes cpuid level : 22 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic
size : 3072 KB physical id : 0 siblings : 2 core id : 0 cpu cores : 2 apicid : 0 initial apicid : 0 fpu : yes fpu_exception : yes cpuid level : 11 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic size : 3072 KB physical id : 0 siblings : 2 core id : 1 cpu cores : 2 apicid : 1 initial apicid : 1 fpu : yes fpu_exception : yes cpuid level : 11 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic
DSP:数字信号处理器 IA-32(Intel Architecture 32-bit:英特尔32位体系架构),属于X86体系结构的32位版本,即具有32位内存地址和32位数据操作数的处理器体系结构 FPU :(Float Point Unit,浮点运算单元)FPU是专用于浮点运算的处理器,以前的FPU是一种单独芯片,在486之后,英特尔把FPU集成在CPU之内。
Cortex-M架构演进 内核迭代路线 低功耗线:M0/M0+(ARMv6-M) → M23(ARMv8-M,+TrustZone) 主流性能线:M3(ARMv7-M) → M4(ARMv7E-M,+DSP/FPU -M,+TrustZone/DSP) → M55/M85(ARMv8.1-M,+Helium矢量引擎) 关键技术升级 流水线优化:M0(2级) → M3(3级) → M7(6级超标量) M4新增单精度FPU 和DSP指令(如单周期MAC) M7支持双精度FPU及指令/数据缓存(最高64KB) M55/M85集成Helium技术,AI算力提升20%-30% 安全性增强:M23/M33引入TrustZone硬件隔离 STM32G0 M3 ARMv7-M ≤120MHz Thumb-2指令集,NVIC优化 1.25 DMIPS/MHz 工业PLC、电机控制 东芝TXZ+ M3H M4 ARMv7E-M ≤200MHz 单精度FPU ,DSP指令集 1.25 DMIPS/MHz 无人机飞控、音频解码 TI Tiva TM4C M7 ARMv7E-M ≤600MHz 双精度FPU,指令/数据缓存 2.14 DMIPS/MHz 工业HMI
size : 2048 KB physical id : 0 siblings : 2 core id : 0 cpu cores : 2 apicid : 0 initial apicid : 0 fpu : yes fpu_exception : yes cpuid level : 13 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic size : 2048 KB physical id : 0 siblings : 2 core id : 1 cpu cores : 2 apicid : 1 initial apicid : 1 fpu : yes fpu_exception : yes cpuid level : 13 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic
: 0 siblings : 1 core id : 0 cpu cores : 1 apicid : 0 initial apicid : 0 fpu : yes fpu_exception : yes cpuid level : 13 wp : yes flags : fpu vme de pse
scripts\target\stm32l4x.cfg -c init -c halt -c "flash write_image erase E:/MCU/STM32L431RC-BearPi/usart1-fpu-test /build/usart1-fpu-test.bin 0x08000000" -c reset -c shutdown 下载结果如下: ? scripts\target\stm32l4x.cfg -c init -c halt -c "flash write_image erase E:/MCU/STM32L431RC-BearPi/usart1-fpu-test /build/usart1-fpu-test.bin 0x08000000" -c reset -c shutdown 这样我们就可以使用下面这行命令完成烧写: make download 2. OPENOCD_TARGET = stm32l4x.cfg OPENOCD_FLASH_START = 0x08000000 PWD_DIR = E:/MCU/STM32L431RC-BearPi/usart1-fpu-test
其中fld/fmul/fstp等指令是由FPU(float point unit)浮点运算处理器做的,FPU在进行浮点运算时,用了80位的寄存器做相关浮点运算,然后再根据是float/double截取成 非FPU的情况是用了SSE中128位寄存器(float实际只用了其中的32位,计算时也是以32位计算的),这就是导致上述问题产生的最终原因。 浮点运算标准IEEE-754 推荐标准实现者提供浮点可扩展精度格式(Extended precision),Intel x86处理器有FPU(float point unit)浮点运算处理器支持这种扩展 的结果就会得到一个准确的double值,而非FPU的就是无穷大之类的了。 即产生如上的结果原因是,两个浮点数相乘在非FPU的情况下,用了32位计算产生的结果导致结果存在误差,而FPU是用了80位进行计算的,所以得到的结果是精度很高的,体现在本文的案例上就是个位数上的2。
比如x86架构下Windows的 _controlfp_s 接口和 Linux 的 fpu_control_t cw = (_FPU_DEFAULT & ~_FPU_EXTENDED) | _FPU_RC_NEAREST | _FPU_SINGLE; _FPU_SETCW(cw); 但是按照文档所说,这些控制字不影响 SSE 指令。 cw = (_FPU_DEFAULT & ~_FPU_EXTENDED) | _FPU_RC_NEAREST | _FPU_SINGLE; _FPU_SETCW(cw); 是一样的。 cw = (_FPU_DEFAULT & ~_FPU_EXTENDED) | _FPU_RC_NEAREST | _FPU_SINGLE; _FPU_SETCW(cw); # endif return cw = (_FPU_DEFAULT & ~_FPU_EXTENDED) # | _FPU_RC_NEAREST | _FPU_SINGLE; _FPU_SETCW(cw); elseif
CONTROL, r0⑶ ldr r1, =g_losTask⑷ ldr r0, [r1, #4]⑸ ldr r12, [r0]#if ((defined(__FPU_PRESENT ) && (__FPU_PRESENT == 1U)) && \ (defined(__FPU_USED) && (__FPU_USED == 1U)))⑹ add r12, r12, , {r4-r12}#if ((defined(__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ (defined(__FPU_USED) && (__ FPU_USED == 1U)))⑽ vstmdb r0! ) && (__FPU_PRESENT == 1U)) && \ (defined(__FPU_USED) && (__FPU_USED == 1U)))⒂ vldmia r1!
此外,LoongArch 回溯 (back-traces) 现在也更 “人性化”,提供了内核 FPU 函数、支持函数错误注入、具有直接调用支持的 FTRACE 和基本性能工具支持。 Better backtraces for humanization; 2, Relay BCE exceptions to userland as SIGSEGV; 3, Provide kernel fpu 2, Relay BCE exceptions to userland as SIGSEGV; 将 BCE 异常作为 SIGSEGV 传递给 userland; 3, Provide kernel fpu functions; 提供内核 fpu 函数
MaixBit开发板以K210作为核心单元,功能非常很强大,芯片内置64位双核处理器,拥有8M的片上SRAM,在Al机器视觉、听觉性能方便表现突出,内置多种硬件加速单元(KPU、FPU,FFT等),总算力最高可达 二、K210芯片参数 项目 说明 内核 RISC-v Dual Core 64bit,with FPU 主频 400MHz(可超频至600MHz) SRAM 内置8M Byte 图像识别 QVGA@60fps 深度学习框架 支持TensorFlow/Keras/Darknet/Caffe等主流框架 外设 FPIOA、UART、GPIO、SPI、I2C、12S、TIMER9 视频处理 神经网络处理器(KPU) FPU 满足IEEE754-2008标准 音频处理器(APU) 快速傅里叶变换加速器(FFT) 三、开发板配置 项目 说明 CPU 双核 64bit RISC-V / 400MHz (双精度FPU集成) 内存
encodingInherited from container(GKB),仍可以正确编译 4.使用CCS3.3编译28335,错误如下: can’t find input file ‘rts2800_fpu32 C2000 Code generation tools<5.0.0B2> 保存设置退出,重新编译,上面的问题(WARNING: invalid compiler option –float_support=fpu32 (ignored) 和 error: can’t find input file ‘rts2800_fpu32.lib’) 就不会出现了 发布者:全栈程序员栈长,转载请注明出处:https://
1024 KB fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 6 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr
siblings : 4 core id : 0 cpu cores : 4 apicid : 0 initial apicid : 0 fpu : yes fpu_exception : yes cpuid level : 13 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss : yes fpu_exception : yes cpuid level : 13 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss