我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 857|回复: 0

基于ARM处理器的软件优化设计 - 单片机/处理器 - 电子工程

[复制链接]

该用户从未签到

1万

主题

1292

回帖

2万

积分

管理员

积分
29577

社区居民最爱沙发原创达人社区明星终身成就奖优秀斑竹奖宣传大使奖特殊贡献奖

QQ
发表于 2013-3-30 00:41:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?立即注册

×
<strong>引言</strong>

随着嵌入式系统在工业控制、汽车系统、家庭网络、医疗卫生、无线技术等领域内的大量应用,嵌入式系统开发者必须面对务种复杂的挑战,其中就包括如何在代码性能和系统成本之间进行平衡。在这方面,ARM处理器可以提供给开发者业界领先的技术方案ARM Cortex系列提供了一个标准的体系结构来满足各种技术的不同性能要求,是专门针对功耗和成本敏感的嵌入式应用领域实现高性能而设计的,它大大简化了编程的复杂性,其成熟的技术使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状态之间反复切换了,代码密度和性能得到的显著的提高。

<strong>2 使用Thumb-2指令优化设计</strong>

对于已经有ARM处理器开发经验的嵌入式开发工程师析言,使用Thumb-2技术是非常简单的,因为Thumb-2技术是在ARM和Thumb基础上经过创新后发展起来的,它继承了原有的基本编程方法,同时具备ARM/Thumb不可比拟的优越性。开发人员在设计嵌入式软件时,只需要重点关注对整体性能影响最大的那部分代码设计,就能够平衡好性能、代码密度和功耗之间的关系。

2.1 减小汉名(Hamming)距离

表1汉名距离变化对比

<ignore_js_op>





2010-4-12 21:48:50 上传
<strong>下载附件</strong> (5.97 KB)




</ignore_js_op>


如表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位操作指令对比

<ignore_js_op>





2010-4-12 21:48:50 上传
<strong>下载附件</strong> (3 KB)




</ignore_js_op>


除PKHBT指令外。Thumb-2技术还提供PKHTB、BFC、BFI、SBFX、UBFX等位操作指令。这样,开发者进行比特位的插入和抽取所需的指令数目就可以明显减少,使用压缩的数据结构也会更加方便。而代码对寄存器的需求也会降低。

2.4 选择字节

对于习惯使用高级语言编程的开发者,大都喜欢用if-then-else语句来控制程序流程.但高级语苦编写的程序最终都要转换为体现机器指令的汇编程序,往往一条高级语占语句需要转换成很多条汇编指令,除编程方便外,高级语言在执行效率和存储空间上都没有优势。Thumb-2指令中提供一条类似于if-then-else语句的指令,具体格式如表3所示。

使用SEL指令能够实现程序的流程控制,而且一条汇编指令实现了4条if-then-else语句的功能,只是每条分支只能为字符型数据赋值,相当于c语言中的4个条件运算符语句。

表3 SEL指令

<ignore_js_op>





2010-4-12 21:48:51 上传
<strong>下载附件</strong> (3.84 KB)




</ignore_js_op>


2.5寄存器倒转

一些强调算法(如FFT)的程序通常要求把源寄存器的hit[n]赋值到目标寄存器的bit[31-n],比特倒转指令RBIT就能够很好地实现。如果不使用该指令,实现同样的功能会需要很多条移位指令和逻辑操作指令才能完成,同时还需要一个保存中间变量的寄存器。而使用比特反转指令能明显降低需要的指令的数目和节约寄存器。

Thumb-2指令中的寄存器倒转语句如表4所示,包含比特倒转、字节倒转及带符号倒转。

表4倒转指令集

<ignore_js_op>





2010-4-12 21:48:51 上传
<strong>下载附件</strong> (4.84 KB)




</ignore_js_op>


对于一些编码/解码或加密/解密程序通常要求对数据进行高低字节互换,字节倒转指令REV<posffix>就能够很好地实现。既降低指令条目数量,又节省寄存器空间,提高软件执行效率。

2.6实现跳转表

使用跳转表来控制程序的执行方向足高级语言的一个常见特性,使用ARM和Thumb指令集都可以很好的实现这个功能。使用ARM指令集一般是为了生成高性能的代码,编泽器会以代码密度为代价对性能进行优化。而Thumb编译器则会使用压缩的数据表来尽可能的降低代码大小。

Thumb-2指令集引入了两条跳转表指令TBB和TBH,分别对应字节分支跳转和半字分支跳转。它综合了ARM/Thumb的优点,在压缩的数据表上可以使用最少的指令来实现跳转表功能,最终可以以最小的代码和数据实现最优的性能。

2.7 改善小额数值运算速度

对于普通的控制系统或数据采集系统,精度往往并不要求很高,12位数据已经足够,但ARM指令和Thumb指令都不提供12位立即数的相关指令(前文已经说明,ARM指令中的12位立即数的有效位数是8)。ThurIlb-2技术提供2条12位立即数参与加法和减法运算的指令,指令格式如表5所示,利用这2条指令能够改善数据处理速度。

表5 12位立即数的算术运算

<ignore_js_op>





2010-4-12 21:48:51 上传
<strong>下载附件</strong> (2.35 KB)




</ignore_js_op>


特别是闭环控制系统,需要根据预设值和反馈值计算偏移量,并根据偏移量来控制被控对象。预设值通常是一个常量,在系统运行过程中都不会改变。习惯于高级语言编程的开发者喜欢使用宏定义的方式来设置该常量,但读取保存在内存中的常量会降低数据处理速度,如果把常量保存在寄存器当中则浪费一个非常宗贵寄存器。针对预设值不易改变的情况,直接使用12位立即数来表示该预设常量并直接参与算术运算的方式既可以节约存储空间,还能够改善数据处理速度,而且与12位AD转换器做反馈采样环节刚好对应。

2.8最大限度地使用寄存器

像ARM这样的load-store体系结构的处理器上,访问寄存器中的数据要比访问存储器中的数据效率高很多,为软件变量分配寄存器要远比分配存储空间性能优越。

ARM Cortex处理器共有14个通用寄存器,实际工程应用软件巾的变量数大多超出14个,但数值较小,可以把多个变量存放在一个寄存器当中。还可以让不同函数的局部变量对寄存器进行时分复用,以充分发挥寄存器的优势。

2.9其他

Thumb-2技术提供2条过零检测并跳转的指令CBZ和CBNZ。分别对应检测到零跳转或检测到非零跳转。该指令可以被用来替换常用的一个指令序列:与零比较,以及随后的跳转指令,这样的指令序列通常被用来检查指针是否为空。Thumb-2指令集中还增加了访问协处理器的指令,这样Thumb-2代码就可以直接支持欠量浮点防处理器,以及其他的协处理器。配合其他访问系统寄存器的指令。整个应用程序就都可以用Thumb-2指令来实现,不必再切换的ARM状态才能实现一些特殊的功能。

<strong>3 结束语</strong>

在一个应用程序中,要实现最好的性能.就需要编写优化的汇编程序。只不过是对性能影响最大的关键程序才值得优化。可以使用性能分析器或者指令周期计数工具来找这些敏感的关键程序段。优化程序的基本思想就是尽可能地压缩代码尺寸以节省存储空间,尽可能提高程序的执行效率以获得更高的性能,并降低功耗。

本文作者创新点:结合Thumb-2指令特点来优化嵌入式软件设计。


作者:谢川  来源:《微计算机信息》(嵌入式与SOC)2009年第4-2期
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

公告:服务器刚移机,
大家请不要下载东西。
会下载失败


Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

( 闽ICP备2024076463号-1 ) 论坛技术支持QQ群171867948 ,论坛问题,充值问题请联系QQ1308068381

平平安安
TOP
快速回复 返回顶部 返回列表