"); //-->
2.10. 程序也可被压缩
想必大家都熟悉功能强大的压缩软件WINRAR/WINZIP,在保证数据百分之百正确的情况下可以将数据压缩到原来的几分之一甚至几十分之一,许多时候单片机开发人员都因为存储空间不够而苦恼,如果能把这个压缩功能应用到单片机程序存储方面,该是一件多好的事情。
能够在RAM中实现程序的动态加载是实现程序被压缩的基础,只要明白了动态加载就很容易理解程序的压缩,如果我们的代码能够实现WINRAR/WINZIP的功能,存储的程序已经被压缩过,只要我们在动态加载过程中加入解压缩功能就可以将原始程序代码加载到指定位置。
不要被压缩算法吓倒,我们不需要做到WINRAR/WINZIP那么强大的功能,复杂的算法对于单片机速度来说也是一个应用上的障碍,所以我们可以选用一些简单的压缩算法,只要能将程序压缩两三倍,对于单片机存储空间来说已经是革命性的改良。
刚好我们在以往的产品中用到压缩功能,不妨用我们当时压缩和解压缩程序来进行说明,为了让大家对采用压缩功能实际效果有一个直观的了解,这里我用一个ARM的程序进行压缩和解压缩功能演示。
这是我放在电脑里面与压缩和解压缩有关的一些文件,可以看到压缩的代码会多,C代码大约有20k的样子,而解压缩代码相对较少,大约8k,为方便演示将这部分压缩和解压缩代码分别生成可以在PC上运行的程序(实际上压缩部分必须放在PC上)。
图2.10.-1 电脑模拟程序资源图
现在我用PC版的压缩程序来压缩ARM的测试程序ARM_Code.bin,电脑给我们显示了压缩的结果,压缩后的文件大小大约是原始文件的1/3,效果还算不错。
图2.10.-2 电脑模拟压缩结果图
实际上压缩过程并不需要单片机进行,我们只要将压缩好的数据存到存储器中,当单片机读取这些数据的同时进行解压缩,然后放到RAM中指定位置。既然是单片机来完成解压缩功能,我们就要考虑单片机是否有足够的空间来存放解压缩代码、单片机对数据解压缩的速度是否够快。我把解压缩的代码放到一个ARM工程里面,用ADS编译,编译结果显示解压缩只需要1744字节来存储代码,另外在提供6484字节给解压缩时的中间变量使用就够了,这个结果真有点出人意料,对许多单片机来说这简直就不是什么问题。速度测试结果同样让人满意,ARM内核的MCU在主频120MHz的情况下解压缩出8Mbytes的数据耗时不到2秒。
图2.10.-3 解压程序耗用ARM资源示意图
●注:本章中压缩与解压缩代码为我一友人提供,他在系统构建和软件工程方面有着深厚的技术功底,这里要特别感谢他提供相关代码
数据压缩是一项与数学理论联系非常紧密的技术,现在数据压缩技术已经广泛应用到数字通讯、数字音视频信号存储和传输、图像存储等各个方面,象DVD、MP3、数码相机、手机、网络电视无一不用到数据压缩技术。
数据压缩分为有损压缩和无损压缩两类,有损压缩是压缩后的数据再解压缩回来会有少量的数据和原始数据不同,无损压缩则是要求百分百还原。日常生活中的数字视听信号采用的是有损压缩方式,WINRAR/WINZIP的文件压缩和我介绍的程序压缩是无损压缩。可以用一个实验来比对两种压缩方式的区别:用电脑将一张内容丰富的BMP图片保存成JPG格式,然后打开另存为BMP格式,再打开这个BMP文件另存为JPG格式,往复多次,你会看到图片某些细节变模糊(JPG是有损压缩);同样的BMP图片用WINRAR/WINZIP压缩然后解压缩,多次重复,图片效果始终保持不变。
网上有一篇《笨笨数据压缩教程》,写得浅显易懂,如果你想对数据压缩了解多一些,不妨自己找过来看看。
附件:
适用于PC平台的源代码和EXE文件。
请先创建一个LST文件,比如1.lst,内容为需要压缩的文件名
1.lst内容
demo.bmp
运行 cpsplus 1.lst 可以得到 1.MLW 和 1.inc 两个文件
wml_dec.zip
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。
eleaction01 阅读:2940