原创 快捷分享《删繁就简-单片机入门到精通》之程序压缩(带源代码)

2010-4-6 11:40 4247 9 10 分类: MCU/ 嵌入式

2.10. 程序也可被压缩



想必大家都熟悉功能强大的压缩软件WINRAR/WINZIP,在保证数据百分之百正确的情况下可以将数据压缩到原来的几分之一甚至几十分之一,许多时候单片机开发人员都因为存储空间不够而苦恼,如果能把这个压缩功能应用到单片机程序存储方面,该是一件多好的事情。
能够在RAM中实现程序的动态加载是实现程序被压缩的基础,只要明白了动态加载就很容易理解程序的压缩,如果我们的代码能够实现WINRAR/WINZIP的功能,存储的程序已经被压缩过,只要我们在动态加载过程中加入解压缩功能就可以将原始程序代码加载到指定位置。
不要被压缩算法吓倒,我们不需要做到WINRAR/WINZIP那么强大的功能,复杂的算法对于单片机速度来说也是一个应用上的障碍,所以我们可以选用一些简单的压缩算法,只要能将程序压缩两三倍,对于单片机存储空间来说已经是革命性的改良。
刚好我们在以往的产品中用到压缩功能,不妨用我们当时压缩和解压缩程序来进行说明,为了让大家对采用压缩功能实际效果有一个直观的了解,这里我用一个ARM的程序进行压缩和解压缩功能演示。
这是我放在电脑里面与压缩和解压缩有关的一些文件,可以看到压缩的代码会多,C代码大约有20k的样子,而解压缩代码相对较少,大约8k,为方便演示将这部分压缩和解压缩代码分别生成可以在PC上运行的程序(实际上压缩部分必须放在PC上)。


 75924759-b307-4810-bf15-7af176a96994.jpg


图2.10.-1  电脑模拟程序资源图


现在我用PC版的压缩程序来压缩ARM的测试程序ARM_Code.bin,电脑给我们显示了压缩的结果,压缩后的文件大小大约是原始文件的1/3,效果还算不错。


 6cc1bb0f-bb5a-4232-8c2b-795e1f1926dc.jpg


图2.10.-2  电脑模拟压缩结果图


实际上压缩过程并不需要单片机进行,我们只要将压缩好的数据存到存储器中,当单片机读取这些数据的同时进行解压缩,然后放到RAM中指定位置。既然是单片机来完成解压缩功能,我们就要考虑单片机是否有足够的空间来存放解压缩代码、单片机对数据解压缩的速度是否够快。我把解压缩的代码放到一个ARM工程里面,用ADS编译,编译结果显示解压缩只需要1744字节来存储代码,另外在提供6484字节给解压缩时的中间变量使用就够了,这个结果真有点出人意料,对许多单片机来说这简直就不是什么问题。速度测试结果同样让人满意,ARM内核的MCU在主频120MHz的情况下解压缩出8Mbytes的数据耗时不到2秒。


 2164ed86-25e3-494a-8090-a7ba3f366e3c.jpg


图2.10.-3  解压程序耗用ARM资源示意图


●注:本章中压缩与解压缩代码为我一友人提供,他在系统构建和软件工程方面有着深厚的技术功底,这里要特别感谢他提供相关代码
数据压缩是一项与数学理论联系非常紧密的技术,现在数据压缩技术已经广泛应用到数字通讯、数字音视频信号存储和传输、图像存储等各个方面,象DVD、MP3、数码相机、手机、网络电视无一不用到数据压缩技术。
数据压缩分为有损压缩和无损压缩两类,有损压缩是压缩后的数据再解压缩回来会有少量的数据和原始数据不同,无损压缩则是要求百分百还原。日常生活中的数字视听信号采用的是有损压缩方式,WINRAR/WINZIP的文件压缩和我介绍的程序压缩是无损压缩。可以用一个实验来比对两种压缩方式的区别:用电脑将一张内容丰富的BMP图片保存成JPG格式,然后打开另存为BMP格式,再打开这个BMP文件另存为JPG格式,往复多次,你会看到图片某些细节变模糊(JPG是有损压缩);同样的BMP图片用WINRAR/WINZIP压缩然后解压缩,多次重复,图片效果始终保持不变。
网上有一篇《笨笨数据压缩教程》,写得浅显易懂,如果你想对数据压缩了解多一些,不妨自己找过来看看。


附件:


压缩和解压缩在PC平台的源代码和EXE文件,需要先创建一个lst文件,比如内容为demo.bmp的1.lst,然后运行cpsplus 1.lst就得到压缩文件。



 

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1713418 2010-5-10 17:59

很不错,对我这个新手以后写程序有很大帮助!
相关推荐阅读
daishangju_162733976 2015-12-19 20:46
个人所见植保无人机
      实在是太久太久没有了上来了,在过去的这段时间里,一些不方便说的原因,还一些方便说的原因,缠绕在一起,让自己封闭(不好意思用蛰伏这个词)一年多,不单是博客没有来,就是邮箱都很少打开。...
daishangju_162733976 2014-10-23 19:48
微观经济1409
位于东莞市凤岗镇的一家小吃店,旁边是一家酒店,老板去年请了7个工人,每天销售5000~7000,今年9月只有1个工人,销售肯定1000以内。   ...
daishangju_162733976 2014-10-23 17:27
市场去哪儿了
好像是从2008年开始,但凡是市场情况不好,总是能见到是经济危机导致欧美市场疲软的解释,看到电视里面安然轰然倒下、华尔街员工茫然抱着纸箱的画面,我对这个解释也是深信不疑。转眼五、六年过去,可是市场...
daishangju_162733976 2014-09-10 14:29
一名电子工程师在深圳的迁移路线图
1999年中,来到宝安区翻身村,在某电子厂工程部当小弟混饭吃,当时小霸王系诸多好汉豪杰正在那边分猪肉。(今天是WWW要搞的前海CBD)   1999年末,转往福田区华强北,在某电子公司开发...
daishangju_162733976 2014-09-05 16:37
另眼看客户“你自己去做,我一定支持你”这句话
我们常常看到或听到这样的事,小X在某行业中打工,经过一番努力,做得还不错,这时候就有客户说:“小X啊,你自己去做吧,我一定支持你”,这个时候小X往往都是已经在考虑是不是要自己出去单干,听到这样的话...
daishangju_162733976 2014-07-03 16:47
谁是优秀的职业经理人?
LEE是公司元老,在公司上下眼里,他能力超凡,数次于水火中力挽狂澜,没有人不承认他是一名福将。LEE有多厉害呢?他主导的产品成功率大约为三分之一,除了他自己,没人知道他是如何选定产品的,甚至他自己...
我要评论
1
9
关闭 站长推荐上一条 /3 下一条