论坛 产品库 视频 专题 CIO俱乐部 Windows8 实验室 CMO俱乐部 案例

基于ARM的高效的C语言编程

发布时间:2013-09-18 13:29:00 来源:论坛 作者:佚名
关键字:ARM C语言 arm

  引言

  ARM处理器以其高性能、低功耗、低成本等优势被广泛应用于各种成功的32位嵌入式系统中。提高执行速度和减小代码尺寸是嵌入式软件设计的关键需求。尽管大多数的ARM编译器和调试器都带有性能优化工具,但是为了保证其正确性,编译器必须是稳妥和安全的,而且它还受到处理器自身结构的限制。因此,编程人员必须在理解编译器工作特点的基础上来实现代码优化。代码的优化方法较多,本文针对函数优化方法进行阐述。

  1 函数局部变量的数据类型

  局部变量包括函数内局部变量、函数参数、函数返回值。由于ARM数据操作都是32位,即使数据本身只需要8位或16位,对于这三类局部变量也应尽可能使用32位的数据类型int或long,以提高代码执行效率。下面以简单求和函数为例进行分析。

  函数add1计算包含10个字的数组array的累加和,add2与add1功能相同,只是将函数add1的参数array类型改为16位的short,函数内局部变量i类型改为8位的char,sum改为16位的short。add1、add2的C源代码如下:

  int add1(int *array){

  unsigned int i;

  int sum=0;

  for(i=0;i<10;i++)

  sum=sum+array[i];

  return sum;

  }

  short add2(short *array){

  char i;

  short sum=0;

  for(i=0;i<10;i++)

  sum= sum+array[i];

  return sum;

  }

  add1经编译产生的汇编代码:

  add1

  mov r2,r0

  mov r0,#0

  mov r1,#0

  add1_loop

  ldr r3,[r2,r1,lsl #2]

  add r1,r1,#1

  cmp r1,#0x0a

  add r0,r3,r0

  bcc add1_loop

  mov pc,r14

  add2经编译产生的汇编代码:

  add2

  mov r2,r0

  mov r0,#0

  mov r1,#0

  add2_loop

  add r3,[r2,r1,lsl #1];增加语句①

  ldrh r3,[r3,#0]

  add r1,r1,#1

  and r1,r1,0xff;增加语句②

  cmp r1,#0x0a

  add r0,r3,r0

  bcc add2_loop

  mov r0,r0,lsl #16;增加语句③

  mov r0,r0,asr #16;增加语句④

  mov pc,r14

  比较add1和add2两个函数的汇编代码,可以发现add2_loop循环比add1_loop循环增加了4条语句。

  语句①:函数add2中变量sum为16位short类型,ARM指令中ldrh指令不支持移位地址偏移,因此增加add指令计算数组下标地址。

  语句②:由于函数add2中循环变量i为8位的char类型,而ARM处理器的寄存器为32位,此语句用于处理循环变量累加过程中引起的溢出问题。即:当i累加到255时,再加1应该为0,而不是256。

  语句③、④:函数add2中返回结果sum为short类型,在返回前需将32位寄存器的前16位用符号位填充,即转换为16位short类型。


比特微信账号
比特微信账号

微信扫一扫
关注Chinabyte

返回首页 长微博 返回顶部