• 易迪拓培训,专注于微波、射频、天线设计工程师的培养
首页 > 无线通信 > 技术文章 > 基于ARM的高效C语言编程

基于ARM的高效C语言编程

录入:edatop.com     点击:

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;

汇编代码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个参数。由于定义为内联函数,程序的可读性较好;在执行时由于没有调用开销,执行效率较高;函数体很小,在被展开时空间开销不大。

结语

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

来源:维库开发网

上一篇:查找嵌入式C语言程序/软件中的缺陷的多种技术
下一篇:科技助力呼叫中心人性化管理

手机天线设计培训教程详情>>

手机天线设计培训教程 国内最全面、系统、专业的手机天线设计培训课程,没有之一;是您学习手机天线设计的最佳选择...【More..

射频和天线工程师培训课程详情>>

  网站地图