缩小单片机/MCU程序占用ROM/FLASH大小的方法

前言

嵌入式产品开发中有时候会随着产品的功能增加发现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中进行设置;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值