引言
随着嵌入式系统在工业控制、汽车系统、家庭网络、医疗卫生、无线技术等领域内的大量应用,嵌入式系统开发者必须面对务种复杂的挑战,其中就包括如何在代码性能和系统成本之间进行平衡。在这方面,ARM处理器可以提供给开发者业界领先的技术方案ARMCortex系列提供了一个标准的体系结构来满足各种技术的不同性能要求,是专门针对功耗和成本敏感的嵌入式应用领域实现高性能而设计的,它大大简化了编程的复杂性,其成熟的技术使ARM架构成为各种应用的上佳选择。
ARM Cortex处理器的统一技术是Thumb-2技术,它以现有的ARM技术为基础,综合了ARM指令和Thumb指令的优势,对优化嵌人式软件设计具有独到的优势,提供了最佳的代码密度,能更合理地使用存储器,对于靠近处理器内核的高速存储器至关重要,即使只节省小部分内存,也将大大提高系统的性能,大幅降低功耗。
1 Thumb-2 指令简介
并非所有的运算都能够映射到Thumb指令集,有时需要多条Thumb指令来模拟一条32位指令的任务。而且Thumb指令不能访问协处理器,不能使用异常中断指令,不支持媒体功能,当应用中有这些需求而且对存储器窄问要求较高时,必须混合使用ARM指令和Thumb指令,处理器内核根据需要切换到Thumb状态以获取高代码密度或切换到ARM状态以获取出色的性能。在开发阶段,为r充分利用存储器,需要反复调整哪些代码使用ARM指令、哪些代码使用Thumb指令。往往只有等到软件和硬件完成后,才能最终决定ARM/Thumb指令的使用方式,这些因素会使开发流程变得非常复杂。
Thumb-2技术足对ARM架构的非常重要的扩展,它可以改善Thumb指令集的性能。Thumb-2指令集在现有的Thumb指令的基础上做了如下的扩充:
· 增加了一些新的16位Thumb指令来改进程序的执行流程
· 增加了一些新的32位Thumb指令以实现一些ARM指令的专有功能。
· 扩充原有的ARM指令,增加了一些新的指令来改善代码性能和数据处理的效率。
使用Thumb-2指令就不需要在ARM/Thumb状态之间反复切换了,代码密度和性能得到的显著的提高。
2 使用Thumb-2指令优化设计
对于已经有ARM处理器开发经验的嵌入式开发工程师析言,使用Thumb-2技术是非常简单的,因为Thumb-2技术是在ARM和Thumb基础上经过创新后发展起来的,它继承了原有的基本编程方法,同时具备ARM/Thumb不可比拟的优越性。开发人员在设计嵌入式软件时,只需要重点关注对整体性能影响最大的那部分代码设计,就能够平衡好性能、代码密度和功耗之间的关系。
2.1 减小汉名(Hamming)距离
表1汉名距离变化对比
如表1所示,两组代码都是用于计算表达式(x1+x2)x(x3-x4)的值,分别使用3条指令束实现。每条指令先成的功能、字书数、寄存器的使用数目、操作码都完全一样,不同之处就是各寄存器操作数的二进制编码不同。
Rd代表目标寄存器,Rn和Rm代表源操作数寄存器。执行原代码时,Rd的比特位变化4次,Rn和Rm分别变化3次和5次,操作数总的比特位变化12次。执行优化后的代码时,操作数总的比特位变化为6次,仅为原代码的一半,能有效地降低指令执行时的功耗。
2.2擅用16位常数指令
Thumb-2指令集中增加了2条关于16位常数的新指令。MOVW可以把一个16位常数加载到寄存器中,并用0填充寄存器的高16位;另一条指令MOVT可以把一个16位常数加载到寄存器的高16位中。这两条指令组合使用就可以把一个32位常数加载到寄存器中。
操作32位立即数或是访问外设,都需要把32位常数加载到寄存器中。对于原来的ARM/Thumb指令系统,因指令编码位数限制.最多只能使用12位常数,且其有效位数只有8位,另外4位用于移位。对任意一个32位的立即数或者一个地址值读取到寄存器需要使用到LDR伪指令,编泽器把该32位数据放在数据缓冲区中,同时用基于PC的LDR指令读取该数据,程序执行时,会在处理器中引起额外的开销,这些开销来自于需要额外的时钟周期使数据端口能够对指令流进行访问。
用两条指令把32位常数分成两个16位常数分两次加载到寄存器中,意味着数据直接在指令流内部,不再需要通过数据端口来访问。相对于LDR伪指令方式,这种解决办法可以消除通过数据端口访问指令流的额外开销,进而提高性能,降低功耗。
2.3灵活应用位操作指令
嵌入式软件开发者经常会碰到位操作方面的问题,如需要对某个变量中的某几位赋值或复位。提取寄存器的部分数据位信息,寄存器中插入固定比特信息等,开发人员往往采用逻辑运算指令和移位操作指令的组合来实现。如表2所尔,两组代码完成的功能一样,把寄存器R1和寄存器R2的有用信息集中压缩到寄存器R0中,以节省寄存器。R1的有用信息为R1[15:0],R2的有用信息为R2[24:8]。对于原代码,因为需要屏蔽寄存器R1和R2的16位数据,需要16位常数参与,所以使用MOVW指令把16位常数引入,完成程序功能共用了4条指令,还额外使用寄存器R3来存放中间变量。优化后的代码只需要一条指令即可实现,而且不需要额外的寄存器参与计算。
表2位操作指令对比
除PKHBT指令外。Thumb-2技术还提供PKHTB、BFC、BFI、SBFX、UBFX等位操作指令。这样,开发者进行比特位的插入和抽取所需的指令数目就可以明显减少,使用压缩的数据结构也会更加方便。而代码对寄存器的需求也会降低。