首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

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

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

对于局部变量,要尽量不使用32位以外的变量类型。当一个函数的局部变量数目不多时,编译器会把局部变量分配给内部寄存器,每个变量占一个32位的寄存器。这样short和char类型的变量不但起不到节省空间的作用,反而会耗费更多的指令周期来完成short和char的存取操作。C语言代码及其编译结果如下所示:
                  1.2 条件执行
       
  条件执行是程序中必不可少的基本操作。典型的条件执行代码序列是由一个比较指令开始的,接下来是一系列相关的执行语句。ARM中的条件执行是通过对运算结果标志位进行判断实现的,一些带标志位的运算结果中,N和Z标志位的结果与比较语句的结果相同。尽管在C语言中没有带标志位的指令,但在面向ARM的C语言程序中,如果运算结果是与0作比较,编译器会移去比较指令,通过一条带标志位指令实现运算和判断。例如:
          
          因此,面向ARM的C语言程序设计的条件判断应当尽量采用“与0比较”的形式。C语言中,条件执行语句大多数应用在if条件判断中,也有应用在复杂的关系运算(<,==,>等)及位操运算(&&,!,and等)中的。面向ARM的C语言程序设计中,有符号型变量应尽量采取x<0、x>=0、x==0、x!=0的关系运算;对于无符号型的变量应采用x==0、x!=0(或者x>0)关系运算符。编译器都可以对条件执行进行优化。
          对于程序设计中的条件语句,应尽量简化if和else判断条件。与传统的C语言程序设计有所不同,面向ARM的C语言程序设计中,关系表述中类似的条件应该集中在一起,使编译器能够对判断条件进行优化。
        1.3 循  环
       
  循环是程序设计中非常普遍的结构。在嵌入式系统中,微处理器执行时间在循环中运行的比例较大,因此关注循环的执行效率是非常必要的。除了在保证系统正确工作的前提下尽量简化核循环体的过程以外,正确和高效的循环结束标志条件也非常重要。按照以上所述的“与0 比较”原则,程序中的循环结束条件应该是“减到0”的循环,结束条件尽量简单。应尽可能在关键循环中采取上述的判断形式,这样可以在关键循环中省去一些不必要的比较语句,减少不必要的开销,提高性能。如下面二个示例:
          
          fact1和fact2中通过定义局部变量a来减少对n的load/store操作。fact2函数遵循了“与0比较”原则,省去了fact1编译结果中的比较指令,并且,变量n在整个循环过程不参与运算,也不需要保存。由于省去了寄存器分配,从而给其他部分程序的编译带来了方便,提高了运行效率。
        “减到0”的方法同样适用于while和do语句。
          如果一个循环体只循环几次,可以用展开的方法提高运行效率。当循环展开后,不需要循环计数器和相关的跳转语句,虽然代码的长度有所增加,但是得到了更高的执行效率。
继承事业,薪火相传
返回列表