单元(MCU)作为嵌入式系统的组件,在物联网设备、工业控制、消费电子等众多领域发挥着关键作用。随着应用场景日益复杂,MCU 需要处理的数学运算已从简单的整数运算拓展到浮点运算。然而,由于 MCU 本身存在资源限制,其浮点计算的处理方式与通用处理器有着显著不同。本文将深入探讨 MCU 处理浮点计算的原理、面临的挑战以及常见的优化策略。
- 浮点表示法:浮点数依据 IEEE 754 标准进行表示,主要由符号位(Sign,1 位,表示正负)、指数部分(Exponent,单精度为 8 位,双精度为 11 位)和尾数部分(Mantissa,单精度为 23 位,双精度为 52 位)三部分构成。
- 硬件浮点与软件浮点:MCU 处理浮点运算主要有两种方式。硬件浮点单元(FPU)通过专用硬件电路执行浮点运算,具备高性能、低功耗的特点,但需要芯片内置 FPU,如 Cortex - M4F/M7/M33 等,相关指令有 VADD.F32、VMUL.F64 等。软件浮点库则是通过软件算法模拟浮点运算,适用于无 FPU 的 MCU,如 Cortex - M0/M3,灵活性高但性能较低,通常由编译器提供,如 ARM 的 mathlib。
- 性能瓶颈:软件浮点运算相较于硬件实现要慢 10 - 100 倍,复杂的浮点函数(如 sin/cos/exp)可能需要数千个时钟周期,并且内存访问会成为瓶颈,特别是在进行双精度运算时。
- 精度问题:单精度浮点大约只有 7 位有效十进制数字,累积误差在迭代运算中可能会被放大,因此在进行比较操作时需格外小心,应避免直接使用 “==” 进行比较。
- 资源消耗:浮点运算采用软件实现时会占用大量程序,还需要更多的 RAM 来存储中间结果,这可能会影响实时性能,如中断响应时间。
- 功耗考虑:FPU 处于激活状态时会增加功耗,频繁的浮点计算可能会影响寿命,因此需要制定合理的电源管理策略。
- 硬件选择优化:可以选择带 FPU 的 MCU,如 STM32F4/F7/H7 系列(单精度 FPU)、STM32H7(双精度 FPU);利用 Cortex - M4/M7 的 DSP 扩展,其 SIMD 指令可加速某些运算;对于某些应用,还可考虑外接数学协处理器。
- 算法级优化:对于确定动态范围的应用,可使用 Q 格式定点数替代浮点数,如 Q15 格式示例。还可以采用查表法,预先计算并存储常用函数值;使用近似算法,如泰勒展开、多项式拟合等。
- 代码级优化:启用编译器优化,如 - O3、 - ffast - math(需谨慎使用);使用内联函数减少函数调用开销;利用 SIMD 指令进行向量化运算;避免频繁的类型转换,减少整数与浮点间的转换。
- 系统级优化:采用动态 FPU 启用方式,仅在需要时启用 FPU;采用批处理模式,集中处理浮点运算,减少状态切换;使用 DMA 减少 CPU 在数据传输中的参与。
- 工业 PID 控制器:使用 Q15 格式实现 PID 算法,通过对比例项、积分项和微分项的计算,终得出综合输出。
- 数据处理:使用硬件 FPU 进行传感器校准,在计算过程中启用 FPU,计算完成后为节省电量关闭 FPU。