微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 嵌入式软件代码压缩技术剖析

嵌入式软件代码压缩技术剖析

时间:08-06 来源:互联网 点击:

除非能在“压缩”模式上运行相当长时间,否则没有必要进行模式切换。其代码压缩效率和ARM差不多, 对于多数程序而言,也是20%到30%。

MIPS16e和Thumb都不能对代码进行真正的压缩,它们只是对部分指令提供了可替换的操作码,而且得到的压缩比是依赖于短操作码和长操作 码的总长度的比值。也就是说,依赖于代码所完成的任务,诸如操作系统和中断处理例程等系统级代码根本就不能使用16位指令,因此不能获得代码压缩效果。一 般的算法,只要不使用任何大操作数,就能得到很好的压缩效率。最后,别忘了数据是无法进行压缩的,只有代码能够被压缩。如果你应用代码中包括了大量的静态 数据结构,所能得到的总存储器节约是非常小的。还有,15%的性能损失也许很不值得。另一方面,MIPS16e和Thumb都是免费的(假定你的处理器已 经包含了它们),选用它们的成本非常低。

PowerPC的CodePack技术

值得提前说明的是,IBM的CodePack方法是各种代码压缩技术中最复杂的。与Thumb和MIPS16e不同,CodePack系统是真 正对运行代码进行压缩,就好像在PowerPC软件中运行WinZip。CodePack会分析并压缩整个程序,生成的用户代码必须在运行中解压缩并执行 压缩版本。尽管很复杂,CodePack和其它技术一样提供20%到30%的空间节省。

CodePack是一项很有吸引力的技术。在使用该技术时,只须和平常一样使用标准工具编译嵌入式PowerPC代码就行,CodePack甚 至对已有的代码也能使用(无论有没有源代码)。在将代码写入ROM或装入磁盘之前,运行CodePack压缩工具对代码进行压缩。压缩工具会分析代码指令 的分布并生成一对专门针对这个程序代码的键值。当运行压缩后的代码时,拥有CodePack功能的处理器使用这一对键值来在运行中解开压缩的代码,就好像 直接运行压缩后的代码。解压缩会对处理器的流水线产生很小的延迟,但是其影响被取指延迟以及其它延迟所掩盖。对于绝大多数应用,CodePack带来的性 能影响是可以忽略的。

但是,CodePack还有一些其它的影响。由于每一个压缩的程序都有其单独的压缩键值,CodePack本质上既是压缩系统也是加密系统。没 有键值,无论你自己还是其它任何人都无法运行相应的程序。如果丢失了或者未获得相应的键值,压缩后的程序只是一堆无用的乱码,这也意味着压缩后的 PowerPC程序不是二进制代码兼容的。除非同时包括其解压缩键值,否则无法轻易地和其它系统交换压缩后的程序。这会使嵌入式系统软件的现场分配稍微有 些复杂。

另外,CodePack为每个程序生成两个键值是因为指令的高16位和低16位是分别进行压缩的。IBM的工程师发现每一条PowerPC指令 的高半字(操作码就在其中)和低半字(其内容通常为操作数、偏移量或掩码)的分布频度是不一样的。对它们分别使用不同的压缩算法会使压缩效果比仅使用任何 单一算法要好,这就是CodePack对程序所做的事。

ARCompact

ARC International公司又采用了另外的代码压缩方法。因为ARCtangent处理器有用户可定义的指令集,ARC(及其用户)可以对指令集进行随心所欲的修改。作为ARCompact,ARC公司决定加入一组16位指令来改进其处理器的代码密度。

而ARCompact与Thumb以及MIPS16e的区别在于可以将16位代码和32位代码任意混杂。由于没有模式切换,代码中任意分布的少 许16位指令无须为之付出什么开销。在任何可能的情况下,ARC的编译器的默认配置会产生16位操作(为了强制编译器生成32位代码或与旧的处理器保持兼 容,你可以关掉这个功能)。

ARC可以混合不同长度代码而不必付出相应的开销,是因为其指令架构要比ARM和MIPS新。那些RISC架构的指令集(包括PowerPC) 在指令字中没有指明指令长度的位。诸如ARC或Tensilica的新伪RISC架构,以及像x86和68k旧的架构拥有这些位。无论是出于无意还是远 见,变长度指令架构因为更紧凑的代码而具优势。

Thumb的改进版--Thumb-2

就在最近,ARM对其代码压缩系统进行了改造并发布了Thumb-2。Thumb-2并不是Thumb的升级,相反,它是另起炉灶,并且可以完 全代替Thumb和原先的ARM指令集。Thumb-2有些类似ARCompact或摩托罗拉的68k,可以无需模式切换就运行16位与32位混合代码。 总的来说,Thumb-2提供的代码压缩效率要略差,但其性能损失也较小。

为了做到这一点,ARM需要在其操作码映射中找到一个突破口(hole),他们在BL指令(条转并连接指令,是Thumb和ARM模式之间切换 的指令)中找到了需要的突破口。在原有的指令集中,BL指令有一些位没有使用,这些原先未定义的位给全新的指令集提供了切换入口。其编码确实不怎么样,但 确实很

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top