您尚未登录。

楼主 # 2022-03-20 13:03:05

llinjupt
会员
注册时间: 2020-12-21
已发帖子: 92
积分: 177

针对51的代码压缩方法,榨取FLASH空间浅谈

这几天遭遇了头疼的事,就是功能增加太多,每个子功能调通后,开心地合并代码时傻眼了,代码超出了大约8KB,
这可不是超过一星半点,并且写程序的时候也已经相当注意数据类型的使用,所以到底能不能搞定,还真是头疼,
经过几天的“奋斗”,终于塞进去了。

把相关方法总结下,方便他人参考,也算抛砖引玉。

通常代码大小和代码速度存在矛盾,为了兼顾速度,而同时保持代码较小的目标,可以从以下方面考虑:

1.优先使用单字节类型
双字节和四字节大大增加处理代码,如果可以转化为单字节类型可以明显减小代码。这对于51单片机绝对是优化利器。如果想深入了解为什么,可以对比生成的汇编代码。
1.1 变量优先使用单字节
1.2 返回值优先使用单字节
1.3 如果bit类型够用,那么优先使用bit

2. 宏定义转为函数
宏定义存在多分拷贝,如果宏比较大,而又不是用在关键路径上,可以转换为函数。此法效果明显,但是要注意不能是性能关键路径。

3.优先使用data类型
data存储类型处理时对应的指令代码要比xdata和code的类型小得多。指针同样适用,优先使用特殊指针,而不是通用指针。

4. 查表法使用的表数据使用算法初始化
查表法可以大大提高程序执行效率,但与此同时将大大增加FLASH占用,那么可以在程序启动的时候初始化该表,这样RAM占用不变,FLASH只占用初始化的算法,而且不影响程序性能。

因为程序中有3比较大的表,两个CRC表,奇偶校验表,一下子解决2K空间,此法优化神速,但是对于没有采用查表法的程序基本无用。

5.打印字符串使用错误码
如果整个系统错误码不超过256个,那么一个错误码只需要占用1个字节,但是一行打印却要占用数十个字节,所以在调试时可以使用错误码转换函数,当正式版时不要编译该转换函数和错误字符表,而只打印错误码。这样可以通过源码的错误表,来解读错误信息。1个中型项目大约可以解决数K甚至数十K的FLASH空间。

不同的子系统也可以定义独立的错误码,那么基本可以保证使用单字节就可以完成整个系统的错误码定义了。

7. 如果不在意性能,那么使用size优先编译选项,通常可以压缩个好几K

8.超级武器
汇编

9.终极武器
$,$$,$$$,当然还有您的卓见。欢迎分享优化大法。

最近编辑记录 llinjupt (2022-03-20 13:14:46)

离线

#1 2022-03-20 16:28:55

cube
会员
注册时间: 2021-03-11
已发帖子: 288
积分: 202.5

Re: 针对51的代码压缩方法,榨取FLASH空间浅谈

总结到位,但是我喜欢 ¥¥¥¥¥

离线

#2 2022-03-21 12:24:10

posystorage
会员
注册时间: 2018-05-06
已发帖子: 165
积分: 556

Re: 针对51的代码压缩方法,榨取FLASH空间浅谈

crc表 查表法用const固化在flash就行了吧 没必要拷贝到ram?

离线

楼主 #3 2022-03-21 13:44:17

llinjupt
会员
注册时间: 2020-12-21
已发帖子: 92
积分: 177

Re: 针对51的代码压缩方法,榨取FLASH空间浅谈

posystorage 说:

crc表 查表法用const固化在flash就行了吧 没必要拷贝到ram?

如果访问FLASH的速度和XRAM的速度一致或者对性能不敏感,确实如此,需测试验证。

最近编辑记录 llinjupt (2022-03-21 13:51:39)

离线

#4 2022-03-21 13:52:17

echo
会员
注册时间: 2020-04-16
已发帖子: 348
积分: 353.5

Re: 针对51的代码压缩方法,榨取FLASH空间浅谈

最简单的办法:加钱

离线

楼主 #5 2022-03-21 14:00:56

llinjupt
会员
注册时间: 2020-12-21
已发帖子: 92
积分: 177

Re: 针对51的代码压缩方法,榨取FLASH空间浅谈

参看第9条 tongue

再补充一条,不过这种都是小打小敲了,例如有的表数据类型是四字节的,但是数值都是某个值的整倍数,此时可以压缩成双字节或者单字节,用的时候乘回来就行,这种优化都是针对特定应用,基本还是能用单字节,不用双字节这个原则。

最好一开始选型的时候就足够大,一劳永逸。

离线

#6 2022-03-22 13:06:02

xiongliya
会员
注册时间: 2022-03-22
已发帖子: 3
积分: 3

Re: 针对51的代码压缩方法,榨取FLASH空间浅谈

如果批量,还是有效果的

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn