arm程序设计优化策略与技术

arm程序设计优化策略与技术

ID:47701866

大小:66.50 KB

页数:6页

时间:2019-10-21

arm程序设计优化策略与技术_第1页
arm程序设计优化策略与技术_第2页
arm程序设计优化策略与技术_第3页
arm程序设计优化策略与技术_第4页
arm程序设计优化策略与技术_第5页
资源描述:

《arm程序设计优化策略与技术》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、程序优化是指软件编程结束后,利用软件开发工具对程序进行调整和改进,让程序充分利用资源,提高运行效率,缩减代码尺寸的过程。按照优化的侧重点不同,程序优化可分为运行速度优化和代码尺寸优化。运行速度优化是指在充分掌握软硬件特性的基础上,通过应用程序结构调整等手段来降低完成指定任务所需执行的指令数。在同一个处理器上,经过速度优化的程序比未经优化的程序在完成指定任务时所需的时间更短,即前者比示者具有更高的运行效率。代码尺寸优化是指,采取措施使应用程序在能够正确完成所需功能的前提下,尽可能减少程序的代码量。然而在实际的程序设计过程中,程序优化的两个

2、FI标(运行速度和代码大小)通常是互相矛盾的。为了提高程序运行效率,往往耍以牺牲存储空间、增加代码量为代价,例如程序设计中经常使用的以查表代替计算、循环展开等方法就容易导致程序代码量增加。而为了减少程序代码量、压缩存储器空间,可能乂要以降低程序运行效率为代价。因此,在对程序实施优化之前,应先根据实际需求确定相应的策略。在处理器资源紧张的情况下,应着重考虑运行速度优化;而在存储器资源使用受限的情况下,则应优先考虑代码尺寸的优化。1程序运行速度优化程序运行速度优化的方法可分为以下儿大类。1.1通用的优化方法(1)减小运算强度利川左/右移位操

3、作代替乘/除2运算:通常需要乘以或除以2的幕次方都可以通过左移或右移n位来完成。实际上乘以任何一个整数都可以用移位和加法来代替乘法。arm7中加法和移位可以通过一条指令来完成,JL执行时间少于乘法指令。例如:i=ix5可以用心(i<<2)+i来代替。利用乘法代替乘方运算:arm7核中内建冇32x8乘法器,因此nJ以通过乘法运算来代替乘方运算以节约乘方函数调用的开销。例如:i=pow(i,3.0)可用i=ixixi来代替。利用与运算代替求余运算:有吋可以通过用与(AND)指令代替求余操作(%)来提高效率。例如:i=i%8可以用i=i&0x

4、07来代替。(2)优化循环终止条件在一个循环结构中,循坏的终止条件将严重影响着循坏的效率,再加上arm指令的条件执行特性,所以在书写循环的终止条件吋应尽量使用count-down-to-zero结构。这样编译器可以用条BNE(若非零则跳转)指令代替CMP(比较)和BLE(若小于则跳转)两条指令,既减小代码尺寸,又加快了运行速度。(3)使用inline函数armC支持inline关键字,如果一个函数被设计成一个inline函数,那么在调用它的地方将会用函数体来替代函数调用语句,这样将会彻底省去函数调用的开销。使用inline的最大缺点是函

5、数在被频繁调用时,代码量将增大。1.2处理器相关的优化方法(1)保持流水线畅通从前面的介绍可知,流水线延迟或阻断会对处理器的性能造成影响,因此应该尽量保持流水线畅通。流水线延迟难以避免,但可以利用延迟周期进行其它操作。LOAD/STORE指令中的自动索引(auto-indexing)功能就是为利用流水线延迟周期而设计的。当流水线处于延迟周期时,处理器的执行单元被占用,算术逻辑单元(ALU)和桶形移位器却可能处于空闲状态,此吋可以利用它们来完成往基址寄存辭上加一个偏移量的操作,供后而的指令使用。例如:指令LDRR1,[R2],#4完成R1

6、=*R2及R2+=4两个操作,是后索引(post-indexing)的例子;而指令LDRR1,[R2,#4]!完成R1=*(R2+4)和R2+=4两个操作,是前索引(pre・indexing)的例了。流水线阻断的情况可通过循环拆解等方法加以改善。一个循环可以考虑拆解以减小跳转指令在循环指令中所占的比重,进而提高代码效率。下面以一个内存复制函数加以说明。voidmemcopy(char*to,char*from,unsignedintnbytes)while(nbytes—)*to++=*from++;}为简单起见,这里假设nbytes为

7、16的倍数(省略对余数的处理)。上血的函数每处理一个字节就要进行一次判断和跳转,対英中的循环体可作如下拆解:voidmemcopy(char*to,char*from,unsignedintnbytes)while(nbytes){to++=*from++;to++=*from++;to++=*from++;*to++=*from++;nbytes・=4;}}这样一来,循环体中的指令数增加了,循环次数却减少了。跳转指令带来的负面影响得以削弱。利用arm7处理器32位字长的特性,上述代码可进一步作如下调整:voidmemcopy(char

8、*to,char*from,unsignedintnbytes){int*p_to=(int*)to;int*p_from=(int*)from;while(nbytes){*P_to++=*p_from+

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。