内容提要
在开发过程中,固件编译体积超出限制,通过分析浮点计算代码,优化除法和减法的使用,成功减少2.8KB的固件体积。开发时需注意资源和指令的使用,尽量使用整数计算。
延伸解读
CH32V003 的硬件限制与浮点开销
CH32V003 采用 RV32EC 指令集,不包含硬件浮点单元,任何浮点运算都会调用软件浮点库。文章通过 PlatformIO Inspect 发现 __subdf3、__divdf3、__muldf3 等符号体积均超过 1KB,成为固件超限的主因。这提醒开发者,在资源受限的 MCU 上,浮点运算不仅速度慢,还会显著增加 Flash 占用,应优先使用整数运算。
利用 Inspect 定位体积瓶颈
PlatformIO Inspect 能生成固件资源使用报表,按符号大小排序可快速找到占用最大的代码段。文章正是通过该功能发现浮点库符号异常,并定位到 INA219 驱动中的浮点计算。对于 Flash 紧张的嵌入式项目,这种分析手段比盲目删减代码更高效,也更容易发现隐藏的库依赖。
优化策略:除法换乘法与去除冗余计算
针对 INA219 库中的浮点计算,作者将采样电阻系数计算中的除法改为乘法,并去掉了未使用的电压偏移减法。这种优化直接减少了软件浮点库的调用,最终使固件体积减少 2.8KB。它说明在资源受限时,审视第三方库的默认实现,根据实际使用场景裁剪不必要的运算,能带来可观的收益。
对嵌入式开发的启示
CH32V003 仅有 16KB Flash,开发中需时刻关注资源消耗。文章建议尽量使用整数计算,若必须使用浮点,也应合并运算或评估替代方案。对于习惯桌面或移动端开发的工程师,这种以 KB 为单位的资源约束是全新的体验,也凸显了廉价 MCU 在成本与性能之间的权衡。
Q&A
如何使用 PlatformIO Inspect 分析固件体积问题?
可以通过 PlatformIO 的 Inspect 功能分析固件的资源使用情况,包括 Flash 和内存占用,帮助找出体积超标的原因。
CH32V003 固件体积超标的原因是什么?
固件体积超标主要是由于浮点计算相关的代码占用较大体积,特别是 __subdf3、__divdf3 和 __muldf3 等符号。
如何优化固件以减少体积?
可以通过将浮点除法替换为乘法,并去掉不必要的减法来优化固件,从而减少体积。
CH32V003 是否支持硬件浮点计算?
CH32V003 不支持硬件浮点计算,使用的指令集 RV32EC 不包含浮点计算相关的指令。
固件体积优化后减少了多少?
通过优化,固件体积减少了 2.8KB,从之前的 15.5KB 降至更小的体积。
USB 电流表的开源资料在哪里可以找到?
USB 电流表的所有资料已开源,可以在 GitHub 仓库获取,包括固件代码和硬件文件。