36 ARM C程序设计优化_第1页
36 ARM C程序设计优化_第2页
36 ARM C程序设计优化_第3页
36 ARM C程序设计优化_第4页
36 ARM C程序设计优化_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、嵌入式系统程序设计大连理工大学软件学院嵌入式系统工程系赖晓晨ARMC程序序设计优优化编译器的的特性数据类型型对程序序效率的的影响循环方式式对程序序效率的的影响指针对程程序效率率的影响响边界对齐齐对程序序的影响响一、编译译器的特特性voidsetzero(char*p, intn)for(;n0;n-) *p=0;p+; 清除从字符型指针p开始的n个字节空空间编译器的的特性(续)voidsetzero(char*p, intn)for(;n0;n-) *p=0;p+; 问题:编译器不不知道n是否为0。编译器不不知道p是否4字字节对齐齐。编译器不不知道n是否为4的倍数数。结论:编译器是是保守的的:

2、必须假定定n的所有可可能值。必须假定定p所有可能能的边界界值。编写高效效C代码码的要求求了解哪些些方面编编译器是是保守的的了解编译译器对应应的处理理器体系系结构二、数据据类型对对程序效效率的影影响unsignedchari;for(i=0;i100; i+)i声明为为unsignedchar的优点点?无符号字字符变量量表示的范围超超过了100,可以完完成题目目要求。char更节省省寄存器器和内存存空间。函数参数数类型总体思想想:尽量量采用int、long类型型。有符号数数和无符符号数如果程序序中只有有加、减减、乘法法,那么么有符号号数和无无符号数数的执行行效率没没有区别别。如果有除除法,那那么

3、需要要额外的的步骤。有符号数数和无符符号数(续)有符号除除法在ARM C中中,如果果x是负负数,那那么除2操作不不是一个个右移操操作。例例如-3/2=-1。但是在在ARM机器中中:-3-2-1直接右移移加1右移移结论:使用无符符号数除除法效率率更高。对于存放放在寄存存器中的的变量,尽量采采用整型型。尽可能使使用无符符号数进进行运算算。函数参数数和返回回值尽量量采用整整型数据据。总结三、循环环方式对对程序效效率的影影响循环是代代码优化化的重点点C程序主主要使用用for和while进行循循环固定次数数的循环环什么是ARM上上编写for循循环最高高效的方方法?固定次数数的循环环(续)inti;for

4、(i=0;i0; i-)上面代码码要实现现转移需需要两条条指令,首先把把某寄存存器的内内容和100比比较,其其次条件件符合时时转移。相同功功能的代代码如果果写作下下面形式式,则可可用“BNE”一条指指令实现现比较以以及转移移两个功功能。至少一次次循环对于“for(;n0;n-)”,如果能能确保第第一次循循环之前前n恒大大于0,此时取取消第一一次n大大于0的的判断,是不会会影响程程序的逻逻辑,而而且显然然程序执执行效率率可以提提高,用用dowhile循环可可以达到到这一目目的循环展开开循环开销销重复100次次,假设设每次循循环开销销占用4个时钟钟周期,循环体体中的加加法占用用1个时时钟周期期,那

5、么么有效程程序仅占占CPU执行时时间的20%,其余80%都都是服务务性开销销,效率率为1/5。inti,t=0;for(i=100;i0; i-)t+; 循环展开开(续)inti,t=0;for(i=50;i0; i-)t+;t+; 每次循环环开销4个时钟钟周期不不变,但但是有效效程序占占用2个个时钟周周期,也也即效率率提高到到1/3。循环展开开(续)问题:循环展开开到什么么程度?全部展展开是否否最优?要意识识到循环环展开是是有代价价的:增加程序序的长度度。循环体内内代码越越多,就就越有可可能造成成cache失失效所以在任任何程度度上展开开循环要要具体问问题具体体分析,在执行行时间和和代码量量

6、间找到到一个最最佳平衡衡点。总结:循环计数数递减。如确定循循环次数数大于1,那么么用dowile。对于小循循环体,可以循循环展开开。四、指针针对程序序效率的的影响别名当两个指指针指向向同一个个对象时时,这两两个指针针被称作作该对象象的别名名。编译器的的特点:不知道是是否是别别名编译器是是悲观的的指针对程程序效率率的影响响(续)void throwtobag(int *mybag, int*yourbag, int*stone)*mybag+=*stone;/语句句1*yourbag+=*stone;/语句句2站在编译译器的角角度思考考一下有有无问题题?指针对程程序效率率的影响响(续)上面代码码

7、的语句句1被GCC编编译时,会出现现诸如“LDR ri,r2,#0”之类汇汇编指令令,表示示首先要要从stone指向的的地址读读出一个个数据,以便来来把它加加到mybag指向指指明的地地址处。此处r2代表表stone,因为它它是函数数的第三三个参数数,轮到到r2来来承载它它。令人人惊奇的的是,编编译语句句2时,仍然包包含一条条“LDRri,r2,#0”语语句,stone的值值不是已已经由语语句1得得到了吗吗?为什么还还要这一一条语句句?指针对程程序效率率的影响响(续)讨论:编编译器不不会自动动识别指指针指向向的对象象不知道是是否是别别名悲观、保保守思考:采采用什么么办法可可以避免免读两次次内存

8、?五、边界界对齐对对程序的的影响边界对齐齐问题_packed关键键字边界对齐齐问题对齐问题题对结构构体也有有影响。在结构构体中定定义若干干变量如如果长短短相间,由于对对齐问题题,势必必浪费一一些空间间。例如如一个整整形变量量和一个个字符变变量放在在一起,总共占占用8个个字节空空间,但但是其中中保存有有效数据据的只有有5个字字节。所所以可以以采用这这种策略略:在结构体体的最前前面定义义的所有有的字符符型变量量,中间间定义所所有的短短整型变变量,最最后定义义所有的的整形变变量,可以把把浪费的的空间减减到最小小。_packed关键键字有的C编编译器支支持_packed关键字,它可以以突破边边界对齐齐的限制制,在任任意类型型的变量量按照任任意顺序序定义的的情况下下,都能能够紧凑凑的安排排存储空空间,此此时的代代价是牺牺牲程序序的运行行效率_packed关键键字(续)代码完成成从任意意地址p处读取取一个整整型变量量,且不不要求此此地址是是4的整整数倍,返回值值为此地地址起始始的4字字节数据据。intfetchint(_packedint*p) return*p; _packed关键键字(续)上图是上上述代码码的实例例,数据据按照小小端存储储,读取取一个没没有对齐齐

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论