在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都是免费的(假定你的措置器已 经包含了它们),选用它们的成本很是低。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)