Cortex - M 处理器浮点乐趣:解析三种浮点 ABI 选项及实际应用
作者相关链接Daniel Mangum 有多个相关链接包括 [RISC - V Bytes]、[RISC - V Tips]、[Blog]、[About]。文章主题及时间文章《Cortex - M 处理器上的浮点乐趣》发布于 2026 年 4 月 16 日阅读时长 12 分钟。PSA Crypto API 应用展示在关于 PSA Crypto API 的文章中展示了该 API 在两款不同微控制器MCU[nRF52840] 和 [ESP32 - S3] 上的使用。对于 nRF52840ECDSA 签名操作在闭源库中执行该库管理 Arm Cortex - M4 处理器与 Arm TrustZone CryptoCell 310 安全子系统之间的通信。nrf_cc310_mbedcrypto 库有适用于 hard - float 和 soft - float 的变体。若遇到链接器错误如 ld.bfd: error: X uses VFP register arguments, Y does not 等就明白原因了。浮点应用二进制接口ABI选项Arm 定义了三种浮点应用二进制接口ABI选项由 -mfloat - abi 编译器标志控制soft无 FPU 硬件的软 ABI所有浮点运算由运行时库函数处理数值通过整数寄存器组传递。softfp有 FPU 硬件的软 ABI允许编译后的代码生成直接访问 FPU 的代码计算时采用软浮点调用约定数值通过整数寄存器组传递。hard硬 ABI允许编译后的代码生成直接访问 FPU 的代码调用运行时库函数时使用 FPU 特定的调用约定。参数传递与寄存器和大多数指令集架构一样Arm 通过通用寄存器GPR具体是 r0 - r3将参数传递给子程序。参数数量或大小超过可用 GPR 时剩余参数会“溢出”到栈中。当处理器包含浮点单元FPU及浮点扩展时有额外的 32 个浮点寄存器s0 - s31。旁注提到在提及 Armv7 - M 处理器的浮点运算时可能会看到“向量浮点VFP”术语原因是 ARMv7 - M 保留了 ARMv7 - A 和 ARMv7 - R 架构配置文件中浮点指令的助记符但通常描述为浮点指令FP 指令。不同 ABI 的使用情况使用 hard ABI 时s0 - s15 寄存器可用于向子程序传递参数子程序中可使用浮点指令。使用 softfp 时子程序中允许使用浮点指令但参数不能通过浮点寄存器传递。soft 使用与 softfp 相同的调用约定不允许使用浮点指令不支持浮点指令时需通过软件模拟。混用 soft/softfp 和 hard 时链接器会拒绝操作链接器可通过查看 Arm 属性部分确定被链接对象文件的 ABI。还给出了 hard、softfp、soft 在 nRF52840 上通过 readelf 提取的属性。浮点 ABI 的实际应用可通过简单函数 addf 观察每种 ABI 的编译输出关闭优化确保函数不被内联或剥离。直接调用编译器可传递 -mfloat - abi 选项使用构建系统则需确定特定于平台的配置。如使用 Zephyr 时可通过设置 CONFIG_FPU y 启用 FPU该选项依赖于 CONFIG_CPU_HAS_FPU默认值为 false。由于 nRF52840 有 FPU选择了 CONFIG_CPU_HAS_FPU。因 FPU 默认关闭west build 使用 soft ABI参数通过 GPR 传递浮点加法运算调用运行时库函数 __addsf3。设置 CONFIG_FPU y 并再次构建时默认使用 hard 浮点 ABI浮点参数通过浮点寄存器传递使用 vadd.f32 执行加法运算。设置 CONFIG_FP_SOFTABI y 则使用 softfp可通过提供 -v 标志观察该标志的存在最终输出包含软调用约定但子程序中仍使用浮点寄存器和指令。