ARM程序优化及其在嵌入式TCP/IP协议实现中的应用
环结束条件应该是“减到0” 的循环,结束条件尽量简单。应尽可能在关键循环中采取上述的判断形式,这样可以在关键循环中省去一些不必要的比较语句,减少不必要的开销,提高性能。如下面二个示例:
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版本。
面向ARM的程序优化在嵌入式TCP/IP协议实现中的应用
笔者采用ATMEL公司的AT91RM9200微处理器,配合以太网物理层驱动芯片(DM9161)构建面向网络的嵌入式系统硬件平台,如图2所示。在此平台上,实现基于ARM微处理器的嵌入式TCP/IP协议处理。
基于ARM的嵌入式系统直接面向以太网数据,典型的以太网数据封装格式如图3所示。根据以上的优化方法,在变量定义时需要考虑最佳的存储器布局,使得各种类型的变量能以32位的空间位基准对齐,对于功能函数中参加运算的数据应尽量采用32位的数据进行处理。
嵌入式TCP/IP协议的实现通常采用Linux中的TCP/IP网络结构层次。TCP/IP协议实现网络层和控制层的ARP/RARP、IP、ICMP、 TCP、UDP等协议,直接为HTTP、SMTP、FTP、TELNET等这样的应用层协议提供支持。每个系统都需要具体定义应用层程序和协议软件之间的接口。
协议处理的一般流程如图4所示。协议处理过程中需要多次条件判断,对IP地址和TCP数据的校验和处理循环比较是无法避免的,因此可以充分利用“与0比较”的条件判断和“减到0”的循环来优化程序设计。
结束语
除了以上所述的面向ARM的程序优化的原则和方法以外,C语言程序设计本身还有很多程序优化的方法。在上述基于ARM嵌入式系统硬件平台的系统开发过程中,充分利用面向ARM的C程序优化设计方法,可将TCP/IP协议处理模块的可执行代码减少5%以上,执行效率有所提高。实践证明,基于ARM的嵌入式系统设计中,在透彻了解ARM汇编指令的特性和编译过程的基础上,合理地使用程序优化的原则和方法可以有效地提高编译效率和代码执行效率。
协议 实现 应用 TCP IP 嵌入式 程序 优化 及其 ARM 相关文章:
- 一种动态网络负载平衡集群的实践方法(04-16)
- 基于DSP的嵌入式TCP/IP协议的研究与实现(04-06)
- SIP协议在嵌入式Linux中的实现 (07-16)
- 基于Windows CE的嵌入式网络收音机(11-30)
- 基于DSP+ARM架构的协议转换器设计(01-12)
- 实时内核μC/OS-II下的网络监控系统的设计(04-13)