[摘要] 

    主要是介绍ARM CPU中的THUMB-2功能,相对于THUMB的比较THUMB-2指令集的扩展,THUMB-2的新指令带来的好处,新指令对性能和代码密度的改进。    如今的嵌入式系统开发者要面对各种复杂的挑战,其中就包括了如何在代码性能和系统成本之间进行平衡。在这方面,ARM处理器可以提供给开发者领先的技术方案,在综合考虑性能和成本的情况下取得最优的设计方案。Thumb®-2是最近才加入ARM架构的一项新技术。它以现有的ARM技术为基础,目标是提供低功耗,高性能的最优设计。本文描述了Thumb-2技术是如何解决这些问题并优化系统设计的。


一、ARM和Thumb指令集
  ARM指令集为32位指令集,可以实现ARM架构下所有功能。Thumb指令集是对32位ARM指令集的扩充,它的目标是为了实现更高的代码密度。Thumb指令集实现的功能只是32位A R M指令集的子集,它仅仅把常用的A R M指令压缩成16位的指令编码方式。在指令的执行阶段,16位的指令被重新解码,完成对等的32位指令所实现的功能。与全部用ARM指令集的方式相比,使用Thumb指令可以在代码密度方面改善大约30%。但是,这种改进是以代码的效率为代价的。尽管每个Thumb指令都有相对应的ARM指令,但是,相同的功能,需要更多的Thumb指令才能完成。因此,当指令预取需要的时间没有区别时,ARM指令相对Thumb指令具有更好的性能。


  开发者在进行系统设计的时候需要综合考虑成本、性能和功耗等因素。如果在一个系统中综合使用ARM指令和Thumb指令,就能在成本、性能和功耗这些因素取得比较好的平衡。软件代码密度直接影响到嵌入式系统需要的存储器的大小。太大的存储器不仅会影响系统整体成本,还会增加系统的复杂度。因此,嵌入式系统一般都希望能够降低程序的存储器的需求。对嵌入式系统来说,功耗也是需要考虑的重要因素。对很多便携式产品,如何能够延长电池使用时间一直是一个重要的课题。使用ARM指令可以提供最优的性能。嵌入式系统中性能和功耗通常是紧密相关的。如果使用效率更高的ARM指令集,就有可能用更低的处理器主频完成相同的功能,并进而降低系统的整体功耗。同样,如果能够提前完成目标功能,也可以使系统进入低功耗的休眠状态,这样也可以降低系统的整体功耗。代码密度和功耗之间的关系就不是那么明显了。对于有些系统中不同的内存类型,不同内存的不同功耗指标的情况,改善代码密度可以影响到系统的整体功耗。相对片内存储器,任何对片外指令或数据的访问都会导致系统功耗的增加。这主要是因为访问片外存储器需要更多的逻辑和更多的时钟周期。但是,通常来说片内的存储器的容量都不会很大。如果使用Thumb指令集,提高软件的代码密度,就可以把更多的常用代码放到片内的存储器中。所以可以说更高的代码密度有助于降低系统的功耗。

  
二、ARM Thumb-2技术的代码密度和代码性能
  Thumb-2技术是对ARM架构的非常重要的扩展,它可以改善Thumb指令集的性能。Thumb-2指令集在现有的Thumb指令的基础上做了如下的扩充:增加了一些新的16位Thumb指令来改进程序的执行流程,增加了一些新的32位Thumb指令以实现一些ARM指令的专有功能32位的ARM指令也得到了扩充,增加了一些新的指令来改善代码性能和数据处理的效率给Thumb指令集增加32位指令就解决了之前Thumb指令集不能访问协处理器、特权指令和特殊功能指令的局限。新的Thumb指令集现在可以实现所有的功能,这样就不需要在ARM/Thumb状态之间反复切换了,代码密度和性能得到的显著的提高。 

新的Thumb-2技术可以带来很多好处:
  可以实现ARM指令的所有功能
  增加了12条新指令,可以改进代码性能和代码密度之间的平衡
  代码性能达到了纯ARM代码性能的98%
  相对ARM代码,Thumb-2代码的大小仅有其74%
  代码密度比现有的Thumb指令集更高:
  代码大小平均降低5%
  代码速度平均提高2-3%


  在Thumb-2技术之前,开发者会因为如何选择使用ARM/Thumb指令而感到困惑。Thumb-2的出现使开发者只需要使用一套唯一的指令集,不再需要在不同指令之间反复切换了。Thumb-2技术可以极大的简化开发流程,尤其是在性能、代码密度和功耗之间的关系并不清楚直接的情况下。并且,在Thumb-2技术下也不再像以往那样需要在ARM/Thumb两套指令之间切换。对于之前在ARM处理器上已经有长时间开发经验的开发者来说,使用Thumb-2技术是非常简单的。开发者只需要关注对整体性能影响最大的那部分代码,其他的部分可以使用缺省的编译配置就可以了。这样在享有高性能、高代码密度的优势的时候,可以很快的更新设计并迅速将产品推向市场。

Thumb-2技术使得开发者可以更快的完成产品最优化设计。


  通过分析ARM/Thumb编译器产生的代码,ARM公司有针对性的在Thumb-2指令集中增加了一些新的指令。通过分析这些新的指令, 我们可以看到Thumb-2指令是如何提升代码性能和代码密度的。


  为了提高处理压缩数据结构的效率,新的ARM架构为Thumb-2指令集和ARM指令集增加了一些新的指令来实现比特位的插入和抽取。这样,开发者进行比特位的插入和抽取所需的指令数目就可以明显减少,使用压缩的数据结构也会更加方便,而代码对存储器的需求也会降低。

  
  三、16-bit常数
  为了增加处理常数的灵活性,新架构中为Thumb-2指令集和ARM指令集增加了两条新的指令。MOVW可以把一个16-bit常数加载到寄存器中,并用0填充高比特位;另一条指令MOVT可以把一个16-bit常数加载到寄存器高16比特中。这两条指令组合使用就可以把一个32-bit常数加载到寄存器中。通常在访问外设寄存器之前会把外设的基址加载到寄存器中,这时就会需要把32-bit常数加载到寄存器中。在之前的架构中需要通过literal pools来完成这样的操作,对32位常量的访问一般通过PC相对寻址来实现。Literal pools可以保存常量并简化访问这些常量的代码,但是,在Harvard架构的处理器中会引起额外的开销。这些开销来自于需要额外的时钟周期来使数据端口能够对指令流进行访问;这种访问可能是需要把指令流加载的数据缓存中,或者从数据端口直接访问指令存储器。将32位常量分成16比特的两个部分保存在两条指令中,意味着数据直接在指令流中,不再需要通过数据端口来访问了。相对于literal pool方式,这种解决办法可以消除通过数据端口访问指令流的额外开销,进而提高性能,降低功耗。 

《ARM处理器中ARM和Thumb状态的切换》 - http://www.elecfans.com/soft/study/inbuilt/2009/2009090445034.html