当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]基于ARM的高效C语言编程

  引言

  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[!--empirenews.page--]

  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类型。

  2  函数局部变量的个数

  为了加快程序的执行速度,函数编译时应尽可能将局部变量都分配在寄存器中。*部变量多于可用的寄存器时,编译器会将多余的变量压入堆栈(即存入存储器中),因此必须控制局部变量的个数。

  ARM处理器采用RISC结构,带有丰富的内部寄存器。在编译器使用apcs开关选项,即支持ATPCS(ARMThumb Procedure Call STandard)标准时,理论上有14个寄存器(R0~R12,R14)可以用来存放局部变量。但是实际上有些寄存器有自身特殊的用途,例如R9在与读写位置无关(RWPI)的编译情况下作为静态基址寄存器使用,R12作为子程序内部调用的临时过渡寄存器使用。ATPCS规则中的寄存器名称及说明如表1所列。

表1  ATPCS规则中寄存器说明


  因此,应尽量限制局部变量的数目:①对于函数的参数个数应控制在4个以内,只有R0~R3可用来保存参数,当参数多于4个时将被压入堆栈。如果由于实际应用的需要,参数多于4个,也可以采用结构体来组织参数,传递结构体指针来实现。②函数内部局部变量的个数应控制在12个以内(R0~R11),R12~R15都有特定用途。

  3  函数内代码的编写

  3.1  循环代码的编写

  循环的控制条件设为递减到零的形式,可以减少指令条数。以求10个数的累加和为例进行分析。

  代码1:

  int sum=0;

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

  sum=sum+i;

  代码2:

  int sum=0;

  for(int i=10;i!=0;i--)

  sum=sum+i;[!--empirenews.page--]

  汇编代码1:

  mov r0,#0

  mov r1,#0

  add1

  add r1,r1,#1

  cmp r1,#0x0a

  add r0,r1,r0

  bcc add1

  汇编代码2:

  mov r0,#0

  mov r1,#0x0a

  add2

  subs r1,r1,#1

  add r0,r1,r0

  bne add2

  比较代码1和代码2,两者的功能是相同的,但是代码2在循环中少了1条指令。该循环的执行次数为10次,即在执行时共减少了10条指令。

  3.2  内联函数的使用

  当函数体代码较少(通常只有一两条语句),且又被经常调用时,可将它设为内联函数(inline)。对内联函数的调用类似于宏定义的展开,因此没有函数调用的开销(即参数的传递和函数值的返回),只是增加了被调用函数的代码量。

  例如在嵌入式系统中,经常访问的外设端口的读写代码就可以设成内联函数,以提高执行效率。外设寄存器的读写函数如下:

  inline unsigned short reg_read(unsigned short reg){

  return (unsigned short)*(volatile unsigned short *)( reg);//外设寄存器的读函数

  }

  inline void reg_write(unsigned short reg, unsigned short val){

  *(volatile unsigned short *)(reg)=val;//外设寄存器的写函数

  }

  这两个函数的共同特点是:函数体的代码很少,只有1个语句;使用的局部变量很少,只有1~2个参数。由于定义为内联函数,程序的可读性较好;在执行时由于没有调用开销,执行效率较高;函数体很小,在被展开时空间开销不大。

  结语

  由于嵌入式系统对存储空间的限制和实时性的需求,在编写代码时必须采用相应的方法和原则以减少代码的空间开销和时间开销。代码优化需要花费时间,并且代码优化后将降低源代码的可读性。因此,只有对经常被调用且对性能影响较大的函数进行优化,才能最有效地优化系统。

 

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭