最近项目中遇到OTA固件升级,压缩由上位机实现,解压缩在boot启动时,读取固件内容后边解压边加载数据的方式启动。
前期预研了三种压缩方案,分别是lz4、zip、7z,代码仓库放在下面,三者各自的原理可自行百度了解。
一、lzma的使用
由于项目中要求对所升级的固件压缩比的最大化,因此选择了7z中的lzma算法,版本为1900
LzmaUtil.c文件中完整实现了针对一个流式文件的压缩以及解压缩。实验环境为Ubuntu20.04。
- 编译
修改Lzma文件夹下的makefile.gcc,将编译器修改为gcc。在当前目录下输入make -f makefile.gcc
编译生成lzma可执行文件
PROG = lzma
CXX = gcc
LIB =
RM = rm -f
CFLAGS = -c -O2 -Wall -D_7ZIP_ST
-
压缩
./lzma e *要压缩的文件* *目标文件*
第二个参数(e)不区分大小写./lzma e makefile.gcc makefile_compr
-
解压
./lzma d *要解压的文件* *目标文件*
同样,第二个参数不区分大小写./lzma d makefile_compr makefile_decompr
解压后可以对比makefile_decompr与原始文件makefile.gcc内容是否一致
二、lzma的深入理解
- lzma压缩文件的特征
Offset Size Description
0 1 Special LZMA properties (lc,lp, pb in encoded form)
1 4 Dictionary size (little endian)
5 8 Uncompressed size <