下载

1下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 1基于ARM的高效C语言编程

1基于ARM的高效C语言编程.doc

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

平凡的程序员小强
2018-09-04 0人阅读 举报 0 0 0 暂无简介

简介:本文档为《1基于ARM的高效C语言编程doc》,可适用于工程科技领域

资料来源电子下载网下载时间::本文地址http:ujjcomshejiqianrushihtml基于ARM的高效C语言编程引言  ARM处理器以其高性能、低功耗、低成本等优势被广泛应用于各种成功的位嵌入式系统中。提高执行速度和减小代码尺寸是嵌入式软件设计的关键需求。尽管大多数的ARM编译器和调试器都带有性能优化工具但是为了保证其正确性编译器必须是稳妥和安全的而且它还受到处理器自身结构的限制。因此编程人员必须在理解编译器工作特点的基础上来实现代码优化。代码的优化方法较多本文针对函数优化方法进行阐述。 函数局部变量的数据类型  局部变量包括函数内局部变量、函数参数、函数返回值。由于ARM数据操作都是位即使数据本身只需要位或位对于这三类局部变量也应尽可能使用位的数据类型int或long以提高代码执行效率。下面以简单求和函数为例进行分析。  函数add计算包含个字的数组array的累加和add与add功能相同只是将函数add的参数array类型改为位的short函数内局部变量i类型改为位的charsum改为位的short。add、add的C源代码如下:intadd(int*array){  unsignedinti  intsum=  for(i=i  sum=sumarrayi  returnsum}shortadd(short*array){  chari  shortsum=  for(i=i  sum=sumarrayi  returnsum}  add经编译产生的汇编代码:addmovr,rmovr,#movr,#addloopldrr,r,r,lsl#addr,r,#cmpr,#xaaddr,r,rbccaddloopmovpc,radd经编译产生的汇编代码:addmovr,rmovr,#movr,#addloopaddr,r,r,lsl#增加语句①ldrhr,r,#addr,r,#andr,r,xff增加语句②cmpr,#xaaddr,r,rbccaddloopmovr,r,lsl#增加语句③movr,r,asr#增加语句④movpc,r  比较add和add两个函数的汇编代码可以发现addloop循环比addloop循环增加了条语句。  语句①:函数add中变量sum为位short类型ARM指令中ldrh指令不支持移位地址偏移因此增加add指令计算数组下标地址。  语句②:由于函数add中循环变量i为位的char类型而ARM处理器的寄存器为位此语句用于处理循环变量累加过程中引起的溢出问题。即:当i累加到时再加应该为,而不是。  语句③、④:函数add中返回结果sum为short类型在返回前需将位寄存器的前位用符号位填充即转换为位short类型。 函数局部变量的个数  为了加快程序的执行速度函数编译时应尽可能将局部变量都分配在寄存器中。当局部变量多于可用的寄存器时编译器会将多余的变量压入堆栈(即存入存储器中)因此必须控制局部变量的个数。  ARM处理器采用RISC结构带有丰富的内部寄存器。在编译器使用apcs开关选项即支持ATPCS(ARMThumbProcedureCallStandard)标准时理论上有个寄存器(R~RR)可以用来存放局部变量。但是实际上有些寄存器有自身特殊的用途例如R在与读写位置无关(RWPI)的编译情况下作为静态基址寄存器使用R作为子程序内部调用的临时过渡寄存器使用。ATPCS规则中的寄存器名称及说明如表所列。表 ATPCS规则中寄存器说明  因此应尽量限制局部变量的数目:①对于函数的参数个数应控制在个以内只有R~R可用来保存参数当参数多于个时将被压入堆栈。如果由于实际应用的需要参数多于个也可以采用结构体来组织参数传递结构体指针来实现。②函数内部局部变量的个数应控制在个以内(R~R)R~R都有特定用途。 函数内代码的编写 循环代码的编写  循环的控制条件设为递减到零的形式可以减少指令条数。以求个数的累加和为例进行分析。代码:intsum=for(inti=isum=sumi代码:intsum=for(inti=i!=i)sum=sumi汇编代码:movr,#movr,#addaddr,r,#cmpr,#xaaddr,r,rbccadd汇编代码:movr,#movr,#xaaddsubsr,r,#addr,r,rbneadd  比较代码和代码两者的功能是相同的但是代码在循环中少了条指令。该循环的执行次数为次即在执行时共减少了条指令。 内联函数的使用  当函数体代码较少(通常只有一两条语句)且又被经常调用时可将它设为内联函数(inline)。对内联函数的调用类似于宏定义的展开因此没有函数调用的开销(即参数的传递和函数值的返回)只是增加了被调用函数的代码量。  例如在嵌入式系统中经常访问的外设端口的读写代码就可以设成内联函数以提高执行效率。外设寄存器的读写函数如下:inlineunsignedshortregread(unsignedshortreg){  return(unsignedshort)*(volatileunsignedshort*)(reg)外设寄存器的读函数}inlinevoidregwrite(unsignedshortreg,unsignedshortval){  *(volatileunsignedshort*)(reg)=val外设寄存器的写函数}  这两个函数的共同特点是:函数体的代码很少只有个语句使用的局部变量很少只有~个参数。由于定义为内联函数程序的可读性较好在执行时由于没有调用开销执行效率较高函数体很小在被展开时空间开销不大。结语  由于嵌入式系统对存储空间的限制和实时性的需求在编写代码时必须采用相应的方法和原则以减少代码的空间开销和时间开销。代码优化需要花费时间并且代码优化后将降低源代码的可读性。因此只有对经常被调用且对性能影响较大的函数进行优化才能最有效地优化系统。参考文献ARMArchitectureReferenceManualEBOL,http:wwwarmcomSamsungElectronicsCo,LtdSCXbitRISCMicroprocessorUser’sManual,FurberSARMSoC体系结构M北京:北京航空航天大学出版社,陈赜ARM嵌入式技术及Linux高级实践教程M北京:北京航空航天大学出版社,田泽嵌入式系统开发与应用M北京:北京航空航天大学出版社,SlossAndrew,SymesDominic,WrightChrisARM嵌入式系统开发:软件设计与优化M沈建华译北京:北京航空航天大学出版社,过怡(讲师)主要从事嵌入式应用教学。推荐阅读:(按住Ctrl鼠标左键点击标题可以打开详细内容)、IC检测方法、什么是遥感技术、什么是无线网址、制冷设备维修技巧、什么是色温、手机RF设计问答、微波简史、微波小知识、卫星导航知识、卫星与遥感技术

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

评分:

/5

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利