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

下载本文档

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

文档简介

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

2、能够值。必需假定p一切能够的边境值。编写高效C代码的要求了解哪些方面编译器是保守的了解编译器对应的处置器体系构造二、数据类型对程序效率的影响 unsigned char i; for (i=0; i100; i+) i声明为unsigned char的优点?无符号字符变量表示的范围超越了100,可以完成标题要求。char更节省存放器和内存空间。函数参数类型总体思想:尽量采用int、long类型。有符号数和无符号数假设程序中只需加、减、乘法,那么有符号数和无符号数的执行效率没有区别。假设有除法,那么需求额外的步骤。有符号数和无符号数续有符号除法 在ARM C中,假设x是负数,那么除2操作不是一个

3、右移操作。例如-3/2=-1。但是在ARM机器中:11111101-311111110-2-111111111直接右移加1右移结论:运用无符号数除法效率更高。对于存放在存放器中的变量,尽量采用整型。尽能够运用无符号数进展运算。函数参数和前往值尽量采用整型数据。总结三、循环方式对程序效率的影响循环是代码优化的重点C程序主要运用for和while进展循环固定次数的循环什么是ARM上编写for循环最高效的方法?固定次数的循环续 int i; for (i=0; i0; i-) 上面代码要实现转移需求两条指令,首先把某存放器的内容和100比较,其次条件符合时转移。一样功能的代码假设写作下面方式,那么可

4、用“BNE一条指令实现比较以及转移两个功能。至少一次循环对于“for(;n0;n-),假设能确保第一次循环之前n恒大于0,此时取消第一次n大于0的判别,是不会影响程序的逻辑,而且显然程序执行效率可以提高,用dowhile循环可以到达这一目的循环展开循环开销反复100次,假设每次循环开销占用4个时钟周期,循环体中的加法占用1个时钟周期,那么有效程序仅占CPU执行时间的20%,其他80%都是效力性开销,效率为1/5。 int i,t=0; for (i=100; i0; i-) t+; 循环展开(续) int i,t=0; for (i=50; i0; i-) t+;t+; 每次循环开销4个时钟周

5、期不变,但是有效程序占用2个时钟周期,也即效率提高到1/3。循环展开(续)问题:循环展开到什么程度?全部展开能否最优?要认识到循环展开是有代价的:添加程序的长度。循环体内代码越多,就越有能够呵斥cache失效所以在任何程度上展开循环要详细问题详细分析,在执行时间和代码量间找到一个最正确平衡点。总结:循环计数递减。如确定循环次数大于1,那么用dowile。对于小循环体,可以循环展开。四、指针对程序效率的影响别名当两个指针指向同一个对象时,这两个指针被称作该对象的别名。编译器的特点:不知道能否是别名编译器是悲观的指针对程序效率的影响续void throwtobag(int *mybag, int

6、*yourbag, int *stone) *mybag += *stone;/语句1 *yourbag += *stone;/语句2站在编译器的角度思索一下有无问题?指针对程序效率的影响续上面代码的语句1被GCC编译时,会出现诸如“LDR ri,r2,#0之类汇编指令,表示首先要从stone指向的地址读出一个数据,以便来把它加到mybag指向指明的地址处。此处r2代表stone,由于它是函数的第三个参数,轮到r2来承载它。令人惊奇的是,编译语句2时,依然包含一条“LDR ri, r2,#0语句,stone的值不是曾经由语句1得到了吗?为什么还要这一条语句?指针对程序效率的影响续讨论:编译器不

7、会自动识别指针指向的对象不知道能否是别名悲观、保守思索:采用什么方法可以防止读两次内存?五、边境对齐对程序的影响边境对齐问题_packed关键字边境对齐问题对齐问题对构造体也有影响。在构造体中定义假设干变量假设长短相间,由于对齐问题,势必浪费一些空间。例如一个整形变量和一个字符变量放在一同,总共占用8个字节空间,但是其中保管有效数据的只需5个字节。所以可以采用这种战略:在构造体的最前面定义的一切的字符型变量,中间定义一切的短整型变量,最后定义一切的整形变量,可以把浪费的空间减到最小。_packed关键字有的C编译器支持_packed关键字,它可以突破边境对齐的限制,在恣意类型的变量按照恣意顺序定义的情况下,都可以紧凑的安排存储空间,此时的代价是牺牲程序的运转效率_packed关键字续代码完成从恣意地址p处读取一个整型变量,且不要求此地址是4的整数倍,前往值为此地址起始的4字节数据。 int fetchint(_packed int *p) return *p; _packed关键字续上图是上述代码的实例,数据按照小端存储

温馨提示

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

最新文档

评论

0/150

提交评论