存储资源优化
编译选项修改:
可以根据当前cpu使用情况,在cpu资源更充足的情况下,调整编译选项,如 O2->Os,减小编译后可执行程序的大小。
去除未使用的数据、代码:例如,对于兼容 gcc 的编译链接器可以在编译阶段使用选项
-ffunction-sections -fdata-sections,链接阶段使用选项--gc-sections来实现。
被高频使用的极短函数优化:
极短函数,比如内部仅为一条执行语句,直接使用内联,避免额外的调用指令,可以使得编译出来的二进制代码更少。
日志优化:
一般的串口输出调试手段,大量字符串内容保存在flash中,考虑使用类似汽车领域 autosar DLT 的日志方案,日志仅输出 id,在pc段使用工具将 id 还原为对应日志。
通过宏控制,让一些调试阶段才需要使用的调试信息,不被编译到正式版本中。
浮点数优化:
根据芯片特性,使用合适的浮点数(单精度 or 双精度),避免使用芯片不支持的浮点操作,导致引入软浮点库。对性能和flash都存在占用。
链接脚本优化:
链接脚本优化,避免因为各个段/数据的对齐,导致出现大量 fill 内容,避免flash的浪费。
数据优化:
- 复杂,高频使用的结构体数据,根据对齐类型排布成员,避免成员间类型对齐导致的填充。
- 可以使用 bit。
使用芯片特定资源:
- 一些芯片可能存在为需要高速运行的代码,提供的特殊ram区,在剩余的情况下,可以拿来作为存储普通变量(用来存储数据,数据读写性能,相对取指性能,一般会下降)。
任务合并:节省TCB、stack资源
- 对于运行RTOS的平台系统,为系统低耦合目标,多个模块可能均定义了自己的任务。 可以考虑实现一个更通用的任务,其它模块将自己的任务注册到这个“通用”任务中,避免自己定义任务。
- 应用业务,也可以根据情况,进行任务合并。
系统配置优化:
对影响ram、flash使用的配置进行梳理,结合当前实际应用进行更精确的配置,减少资源浪费。
模块级别优化:
借助 AI 工具,梳理模块实现,对代码逻辑,ram使用进行模块级别优化。