前言
嵌入式产品开发中有时候会随着产品的功能增加发现flash空间不够用了,在支持OTA的产品中产品固件的大小也会影响升级时间,这时候可以从软件的角度进行优化节省空间,下面介绍缩小空间的方法;
一、可执行程序的组成
使用keil5编译软件之后,会在编译结果页面提示Program Size: Code=62764 RO-data=2048 RW-data=1452 ZI-data=16116
分别为代码段、只读数据段、已初始化的读写数据段包括全局变量和静态变量(静态局部和静态全局)、ZI-data 未初始化或者初始化为0的读写数据段和静态变量(静态局部和静态全局);
其中Code 、RO-data、RW-data会占用flash空间,RW-data和ZI-data会占用ram空间,可见RW-data既会占flash空间也会占占ram空间;
二、优化角度
1、代码项目设计
设计一个清晰、简洁、高效、组件复用强的代码架构,如采用精简高效的算法,采用代码量小的中间件;
合理设计代码的数据结构,数据结构可以大致分成在本文件内用到的和文件之间用到的结构,多用结构体、联合体少用零散的多个变量;
函数的设计要简洁,功能明确,比如a函数有a功能和其它功能,b函数有a功能和其它功能,有的地方调用了a有的地方调用了b,可以将a功能单独抽出来;
2、合理划分全局、静态变量
变量该定义成全局变量、静态变量,要有一个明确的认识,明确全局变量和静态变量的作用再定义;
3、合理初始化变量
由于初始化为非0的全局和静态变量会占用flash空间,可以考虑要不要对其初始化,这主要看初始化代码中会不会用到这些变量的值,如果是业务运行中这些值的动态设定的可以不进行初始化;
4、编译源代码文件的控制
不需要的源代码不要编译到最终执行文件中,可不要包含源代码的头文件,是否需要编译它主要看业务中会不会调用源代码向外暴露的接口(源代码对应的头文件),比如a.c的函数会调用b.c 中的函数,但是a.c并没有被调用,可以一起去掉;
5、编译优化等级
可以在keil中根据代码开发的不同进展程度设置Ox的等级,也可以在使用cmake或者makefile管理的代码中在CMakelist.txt或者makefile中进行设置;