《龙虾OpenClaw系列:从嵌入式裸机到芯片级系统深度实战60课》 043、浮点单元(FPU):硬件浮点运算与软浮点对比
043、浮点单元(FPU):硬件浮点运算与软浮点对比从一次诡异的电机控制抖动说起去年做四轴飞行器姿态解算,IMU数据融合跑在STM32F407上。一切看起来正常,直到某天发现悬停时电机偶尔会抽风似的抖动一下。抓了串口日志,发现姿态角偶尔会跳变几个度,然后又恢复正常。排查了传感器噪声、中断优先级、DMA传输,都没问题。最后把目光锁定在浮点运算上。当时为了省事,编译器选项里用了-mfloat-abi=soft——因为之前项目都是这么干的,也没出过问题。但这次不一样,姿态解算里大量用了三角函数和矩阵运算,软浮点带来的延迟在某些中断抢占场景下,直接导致了计算结果的“过期”被使用。换成-mfloat-abi=hard后,抖动消失了。这个坑让我意识到:FPU不是开了就完事,你得知道它到底在干什么。硬件FPU到底快在哪很多人以为FPU就是“能算浮点数”,其实这是个误解。没有FPU的ARM Cortex-M3/M4也能算浮点,只是所有浮点运算都要用整数指令模拟——加法拆成符号位、指数、尾数分别处理,乘法更复杂,三角函数和开方更是噩梦级的指令序列。硬件FPU干的事很简单:一条指令搞定一个浮点运算。比如VADD.F32 S0, S1, S2,一个周期出结果。软浮点实现同样的加法,可能要几十条指令,还要处理各种边界情况(NaN、无穷大、非规格化数)。实测数据(Cortex-M4 @168MHz,单精度float):