我有一个需要新功能的旧固件应用程序。应用程序的大小已经接近设备的有限闪存容量,而少数新功能和变量将其推向极限。打开编译器优化确实可以解决问题,但客户对此持谨慎态度,因为它们过去曾导致过失败。那么,在重构 C 代码以产生更小的输出时,需要注意哪些常见问题呢?
- 尽可能使用生成函数而不是数据表
- 禁用内联函数
- 将常用的宏转化为函数
- 降低大于本机机器大小的变量的分辨率(即 8 位微型,尝试摆脱 16 和 32 位变量 - 将某些代码序列加倍和四倍)
- 如果微控制器具有较小的指令集(Arm拇指),请在编译器中启用它
- If the memory is segmented (ie, paged or nonlinear) then
- 重新排列代码,以便需要使用更少的全局调用(更大的调用指令)
- 重新排列代码和变量使用以消除全局内存调用
- 重新评估全局内存使用情况 - 如果可以将其放在堆栈上那就更好了
- 确保您在关闭调试的情况下进行编译 - 在某些处理器上,这会产生很大的差异
- 压缩无法即时生成的数据 - 然后在启动时解压到 RAM 中以便快速访问
- 深入研究编译器选项 - 可能每个调用都是自动全局的,但您可以安全地逐个文件地禁用它以减少大小(有时显着)
如果您仍然需要更多空间compile with optimizations
打开,然后查看生成的程序集与未优化的代码。然后重新编写发生最大变化的代码,以便编译器在关闭优化的情况下基于棘手的 C 重写生成相同的优化。
例如,您可能有几个进行类似比较的“if”语句:
if(A && B && (C || D)){}
if(A && !B && (C || D)){}
if(!A && B && (C || D)){}
然后创建一个新变量并提前进行一些比较将使编译器免于重复代码:
E = (C || D);
if(A && B && E){}
if(A && !B && E){}
if(!A && B && E){}
如果您打开编译器,这是编译器自动为您执行的优化之一。还有很多很多其他内容,如果您想学习如何在 C 代码中手动执行此操作,您可能会考虑阅读一些编译器理论。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)