新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > ARM程序优化及其在嵌入式TCP/IP协议实现中的应用

ARM程序优化及其在嵌入式TCP/IP协议实现中的应用

作者:时间:2012-04-20来源:网络收藏

因此,面向的C语言设计的条件判断应当尽量采用“与0比较”的形式。C语言中,条件执行语句大多数在if条件判断中,也有在复杂的关系运算(,==,>等)及位操运算(,!,and等)中的。面向的C语言设计中,有符号型变量应尽量采取x lt;0、x>=0、x==0、x!=0的关系运算;对于无符号型的变量应采用x==0、x!=0(或者x>0)关系运算符。编译器都可以对条件执行进行

对于设计中的条件语句,应尽量简化if和else判断条件。与传统的C语言程序设计有所不同,面向的C语言程序设计中,关系表述中类似的条件应该集中在一起,使编译器能够对判断条件进行

循环

循环是程序设计中非常普遍的结构。在系统中,微处理器执行时间在循环中运行的比例较大,因此关注循环的执行效率是非常必要的。除了在保证系统正确工作的前提下尽量简化核循环体的过程以外,正确和高效的循环结束标志条件也非常重要。按照以上所述的“与0比较”原则,程序中的循环结束条件应该是“减到0” 的循环,结束条件尽量简单。应尽可能在关键循环中采取上述的判断形式,这样可以在关键循环中省去一些不必要的比较语句,减少不必要的开销,提高性能。如下面二个示例:

53.jpg

fact1 和fact2中通过定义局部变量a来减少对n的load/store操作。fact2函数遵循了“与0比较”原则,省去了fact1编译结果中的比较指令,并且,变量n在整个循环过程不参与运算,也不需要保存。由于省去了寄存器分配,从而给其他部分程序的编译带来了方便,提高了运行效率。

“减到0”的方法同样适用于while和do语句。如果一个循环体只循环几次,可以用展开的方法提高运行效率。当循环展开后,不需要循环计数器和相关的跳转语句,虽然代码的长度有所增加,但是得到了更高的执行效率。

除法和求余

ARM 指令集中没有提供整数的除法,除法是由C语言函数库中的代码(符号型_rt_sdiv和无符号型的_rt_udiv)的。一个32位数的除法需要 20~140个周期,依赖于分子和分母的取值。除法操作所用的时间是一个时间常量乘每一位除法所需要的时间:

Time(分子/分母)=C0+C1×log2(分子/分母)

=C0+C1×(log2(分子)-log2(分母))

由于除法的执行周期长,耗费的资源多,程序设计中应当尽量避免使用除法。以下是一些避免调用除法的变通办法:

(1)在某些特定的程序设计时,可以把除法改写为乘法。例如:(x/y)>z,在已知y是正数而且y×z是整数的情况下,就可以写为x>(z×y)。

(2)尽可能使用2的次方作为除数,编译器使用移位操作完成除法,如128就比100更加适合。在程序设计中,使用无符号型的除法要快于符号型的除法。

(3)使用求余运算的一个目的是为了按模计算,这样的操作有时可以使用if的判断语句来完成,考虑如下的

uintcounter1(uintcount)uintcounter2(uintcount)

{{return(++count`);if(++count>=60)}count=0;

return(count);}

(4)对于一些特殊的除法和求余运算,采用查找表的方法也可以获得很好的运行效果。

在除以某些特定的常数时,编写特定的函数完成此操作会比编译产生的代码效率高很多。ARM的C语言库中就有二个这样的符号型和无符号型数除以10的函数,用来完成十进制数的快速运算。在toolkit子目录的examplesexplasmdiv.c和examplesthumbdiv.c文件中,有这二个函数的ARM和Thumb版本。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

tcp/ip相关文章:tcp/ip是什么




评论


相关推荐

技术专区

关闭