随着嵌入式技术的发展,人们对系统的智能化、小型化的要求也越来越高。基于ARM结构的微处理器以其高性能、低功耗、低价格等方面的优势被广泛应用于各种电子产品,特别是一些高端的嵌入式控制应用中,例如移动电话、工业控制、网络通信等方面。ARM技术具有很好的性能和功效,其合作伙伴包括许多世界顶级的半导体公司。可以说ARM技术几乎无处不在。
TCP/IP互联网协议族在全世界范围内已经成为开放系统互联的协议,它提供了很好的交互 *** 作能力,可兼容多种网络技术。嵌入式技术与TCP/IP技术的结合已经展现出强劲的发展势头和巨大的市场潜力。如何开发面向 ARM的高效代码,尤其是提高类似于TCP/IP协议栈等基础性的软件模块的执行效率已成为每个从事基于ARM的嵌入式系统开发人员必须思考的问题。
面向ARM的程序优化开发高效的程序涉及很多方面,包括优秀的算法实现、良好的编程风格以及针对目标的程序优化。程序优化是指软件编程基本结束后,利用软件开发工具对程序代码进行调整和改进,使程序能够更加充分地利用有限的软硬件资源,缩减代码尺寸,提高运行效率的过程。
在实际的程序设计过程中,程序优化的两个目标(运行速度和代码大小)往往是互相矛盾的。为了提高程序运行效率,就要以牺牲存储空间、增加代码量为代价;而为了减少程序代码量、压缩存储器空间,可能又要以降低程序运行效率为代价。按照优化的侧重点不同,程序优化可分为运行速度优化和代码尺寸优化。随着微电子技术的不断发展,存储空间已不再是制约系统集成的主要因素。面向ARM的程序优化主要是讨论如何在了解汇编语言和编译规则的基础上编写出能够高效运行的C语言程序。
作为高性能、低功耗的RISC芯片,ARM的C语言编译器已经非常成熟。尽管如此,在编写面向ARM的C源程序时,对程序进行必要的优化仍是提高程序运行效率的有效途径。以下是一些在实现TCP/IP协议过程中用到的比较典型的优化原则和方法,这些技术也适用于其他RISC指令集微处理器。
变量定义
32位 ARM处理器的指令集支持有符号/无符号的8位、16位、32位整型和浮点型变量类型,这不仅可以节省代码,而且可以提高代码的运行效率。按照作用范围的不同,C语言的变量可以划分为全局变量和局部变量。ARM编译器通常将全局变量定位在存储空间中,局部变量分配给通用寄存器。
在全局变量声明时,需要考虑最佳的存储器布局,使得各种类型的变量能以32位的空间位基准对齐,从而减少不必要的存储空间浪费,提高运行效率。如:
这里定义的四个变量形式相同,只是次序不同,却导致了在最终映像中不同的数据布局,如图1所示。显然第二种方式节约了更多的存储器空间。
对于局部变量,要尽量不使用32位以外的变量类型。当一个函数的局部变量数目不多时,编译器会把局部变量分配给内部寄存器,每个变量占一个32位的寄存器。这样short和char类型的变量不但起不到节省空间的作用,反而会耗费更多的指令周期来完成short和char的存取 *** 作。C语言代码及其编译结果如下所示:
条件执行
条件执行是程序中必不可少的基本 *** 作。典型的条件执行代码序列是由一个比较指令开始的,接下来是一系列相关的执行语句。ARM中的条件执行是通过对运算结果标志位进行判断实现的,一些带标志位的运算结果中,N和Z标志位的结果与比较语句的结果相同。尽管在C语言中没有带标志位的指令,但在面向ARM的C语言程序中,如果运算结果是与0作比较,编译器会移去比较指令,通过一条带标志位指令实现运算和判断。例如:
因此,面向ARM的C语言程序设计的条件判断应当尽量采用“与0比较”的形式。C语言中,条件执行语句大多数应用在if条件判断中,也有应用在复杂的关系运算(等)及位 *** 运算(&&,!,and等)中的。面向ARM的C语言程序设计中,有符号型变量应尽量采取x& lt;0、x>=0、x==0、x!=0的关系运算;对于无符号型的变量应采用x==0、x!=0(或者x>0)关系运算符。编译器都可以对条件执行进行优化。
对于程序设计中的条件语句,应尽量简化if和else判断条件。与传统的C语言程序设计有所不同,面向ARM的C语言程序设计中,关系表述中类似的条件应该集中在一起,使编译器能够对判断条件进行优化。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)