嵌入式设计应用
在32位嵌入式措置器中,ARM、MIPS以及PowerPC曾是首先寻找出降低其存储器耗损、提高代码密度体例的几种措置器。更早一些的措置 器,如摩托罗拉的68k系列以及英特尔的x86系列,并不需要代码压缩。事实上,其尺度代码密度都比RISC措置器的代码压缩模式还要高。
易于使用的Thumb手艺
我们先从ARM的代码压缩方案(Thumb)讲起,因为其使用普遍、有很好的撑持,是一个典型措置器代码压缩方案,并相当精练、有用。
Thumb现实上是添加到ARM的尺度RISC指令集之上的自力指令集。在你的代码中,你可以经由过程一条模式切换指令在这两种指令集之间进行切 换。Thumb指令集架构(Instruction Set Architecture, ISA)是由年夜约36条16位指令组成,仅靠这些指令是完成不了太多使命的,但Thumb指令集搜罗了根基的加法、减法、轮回移位以及跳转指令。经由过程使用 这些较短的指令替代ARM尺度的32位指令,可以将某些代码的规模减小年夜约20%到30%。但有一些问题需要引起注重:
首先,Thumb代码和尺度ARM代码不能混杂使用,必需显式地在两种模式间进行切换,就仿佛Thumb是一套完全分歧的指令集(现实上也是)。这迫使轨范员将所有的16位代码与32位代码分隔并隔离到自力的模块中。
其次,因为Thumb是经由简化和精简的指令集架构,在Thumb模式中无法完成所有你但愿的工作。Thumb模式无法进行诸如措置间断、长跳 转、原子存储器(atomic memory)操作,或协措置器操作等。Thumb有限的指令意味着仅对根基的算术和逻辑操作有用,其他的任何工作必需使用ARM的尺度32位指令集来完 成。
Thumb的限制不仅默示在指令集上,当处于Thumb模式中,ARM措置器将仅有8个寄放器(而不是16个),这些寄放器无法像尺度模式下 ARM代码那样进行前提执行和移位或轮回移位操作。在尺度ARM代码和Thumb代码间进行参数传递并不坚苦,只要将参数放到仓库中或经由过程措置器的前8个 寄放器就可以了。
从尺度模式到Thumb模式之间的往返切换也要耗损时刻,而且还要增添代码。此外,还需要几十个前导(preamble)以及后同步指令 (postamble)来组织指针并清空CPU的流水线。若是在Thumb模式中运行的代码小于几十条指令,就不值得为之支出这样的开销。
最后,Thumb还对于机能有着少许的影响。凡是,使用Thumb指令对代码进行压缩会导致代码运行速度降低年夜约15%,这主若是因为在16位 模式和32位模式间切换所引起的。Thumb指令还不如32位的尺度指令矫捷,是以,和32位代码对比,经常需要更多的指令来完成同样的工作。从积极的一 方面来说,因为其指令长度只有32位指令集的一半,Thumb使得缓存的使用效率更高。
若是使命能够在这些限制下完成,Thumb可以节约不少成本。Thumb手艺已经获得每一款ARM措置器的撑持,无论用户使用与否,年夜都ARM编译器以及汇编轨范都撑持Thumb指令集。是以,采用Thumb的体验应该相当轻松。
MIPS措置器
理解了Thumb手艺后,MIPS16e就没什么别致的了。一些MIPS措置器中增添了此外的16位指令集,与ARM系统很是近似。 MIPS16e指令集搜罗了一组16位的尺度MIPS算法、逻辑以及跳转指令的简化版本。其使用和Thumb一样,也需要在尺度模式和MIPS16e模式 之间往返切换,这也将导致支出时刻和增添代码的开销。除非能在“压缩”模式上运行相当长时刻,否则没有需要进行模式切换。其代码压缩效率和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指令有一些位没有使用,这些原先不决义的位给全新的指令集供给了切换进口。其编码确实不怎么样,但 确实很有用。
Thumb-2最年夜的优势在于它是一套完整的指令集,轨范无需切换回“尺度”32位ARM模式,原先Thumb模式的限制再也没有了。轨范此刻可以措置间断、设置MMU、打点缓存,和真正的微措置器并没什么分歧。
Thumb-2仍是需要损失踪必然的机能。尽管没有了模式切换开销,与尺度ARM代码对比,它仍是要破耗多一些的Thumb-2指令来完成特定的使命。对于ARM措置器而言,这些额外的指令(以及额外的周期)会使速度降低年夜约15%到20%
全部0条评论
快来发表一下你的评论吧 !