新闻中心

EEPW首页>嵌入式系统>设计应用> ARM程序设计优化

ARM程序设计优化

作者: 时间:2011-04-30 来源:网络 收藏
1.3 指令集相关的方法

本文引用地址://m.amcfsurvey.com/article/150814.htm

  有时可以利用arm7 指令集的特点对程序进行

  (1)避免除法

  arm 7 指令集中没有除法指令,其除法是通过调用C 库函数实现的。一个32 位的除法通常需要20~140 个时钟周期。因此, 除法成了一个程序效率的瓶颈, 应尽量避免使用。有些除法可用乘法代替,例如: if ( (x / y) > z)可变通为 if ( x > (y × z)) 。在能满足精度,且存储器空间

  冗余的情况下, 也可考虑使用查表法代替除法。当除数为2 的幂次方时, 应用移位操作代替除法。

  (2)利用条件执行

  arm 指令集的一个重要特征就是所有的指令均可包含一个可选的条件码。当程序状态寄存器(PSR )中的条件码标志满足指定条件时, 带条件码的指令才能执行。利用条件执行通常可以省去单独的判断指令,因而可以减小代码尺寸并提高程序效率。

  (3)使用合适的变量类型

  arm 指令集支持有符号/ 无符号的8 位、16 位、32位整型及浮点型变量。恰当的使用变量的类型,不仅可以节省代码,并且可以提高代码运行效率。应该尽可能地避免使用char、short 型的局部变量,因为操作8 位/16 位局部变量往往比操作3 2 位变量需要更多指令, 请对比下列3 个函数和它们的汇编代码。

  intwordinc(inta) wordinc

  { ADD a1,a1,#1

  return a + 1; MOV pc,lr

  } shortinc

  shortshortinc(shorta) ADD a1,a1,#1

  { MOV a1,a1,LSL #16

  return a + 1; MOV a1,a1,ASR #16

  } MOV pc,lr

  charcharinc(chara) charinc

  { ADD a1,a1,#1

  return a + 1; AND a1,a1,#ff

  } MOV pc,lr

  可以看出, 操作3 2 位变量所需的指令要少于操作8位及16 位变量。

  1.4 存储器相关的方法

  (1)用查表代替计算

  在处理器资源紧张而存储器资源相对富裕的情况下, 可以用牺牲存储空间换取运行速度的办法。例如需要频繁计算正弦或余弦函数值时,可预先将函数值计算出来置于内存中供以后查找。

  (2)充分利用片内RAM

  一些厂商出产的arm 芯片内集成有一定容量的RAM,如Atmel 公司的AT91R40807 内有128KB 的RAM,夏普公司的LH75400/LH75401 内有32KB 的RAM。处理器对片内RAM 的访问速度要快于对外部RAM 的访问,所以应尽可能将程序调入片内RAM 中运行。若因程序太大无法完全放入片内RAM ,可考虑将使用最频繁的数据或程序段调入片内RAM 以提高程序运行效率。

  1.5 编译器相关的优化方法

  多数编译器都支持对程序速度和程序大小的优化,有些编译器还允许用户选择可供优化的内容及优化的程度。相比前面的各种优化方法, 通过设置编译器选项对程序进行优化不失为一种简单有效的途径。

  2 代码尺寸优化

  精简指令集计算机的一个重要特点是指令长度固定, 这样做可以简化指令译码的过程,但却容易导致代码尺寸增加。为避免这个问题,可以考虑采取以下措施来缩减程序代码量。

  2.1 使用多寄存器操作指令

  arm 指令集中的多寄存器操作指令LDM/STM 可以加载/ 存储多个寄存器,这在保存/ 恢复寄存器组的状态及进行大块数据复制时非常有效。例如要将寄存器R4~R12 及R14 的内容保存到堆栈中,若用STR 指令共需要10 条,而一条STMEA R13!, {R4 ?? R12, R14} 指令就能达到相同的目的,节省的指令存储空间相当可观。不过需要注意的是, 虽然一条LDM/STM 指令能代替多条LDR/STR 指令,但这并不意味着程序运行速度得到了提高。实际上处理器在执行LDM/STM 指令的时候还是将它拆分成多条单独的LDR/STR 指令来执行。

  2.2 合理安排变量顺序

  arm 7 处理器要求程序中的32 位/16 位变量必须按字/ 半字对齐,这意味着如果变量顺序安排不合理, 有可能会造成存储空间的浪费。例如:一个结构体中的4个32 位int 型变量i1 ~ i4 和4 个8 位char 型变量c1 ~ c4,若按照i1、c1、i2、c2、i3、c3、i4、c4 的顺序交错存放时, 由于整型变量的对齐会导致位于2 个整型变量中间的那个8 位char 型变量实际占用32 位的存储器,这样就造成了存储空间的浪费。为避免这种情况, 应将int 型变量和char 型变量按类似i1、i2、i3、i4、c1、c2、c3、c4 的顺序连续存放。

  2.3 使用Thumb 指令

  为了从根本上有效降低代码尺寸,公司开发了16 位的Thumb 指令集。Thumb 是体系结构的扩充。Thumb 指令集是大多数常用32 位指令压缩成16 位宽指令的集合。在执行时,16 位指令透明的实时解压成32 位ARM 指令并没有性能损失。而且程序在Thumb状态和ARM 状态之间切换是零开销的。与等价的32 位arm 代码相比,Thumb 代码节省的存储器空间可高达35% 以上。

  结语

  综上所述,优化的过程是在透彻了解软/ 硬件结构和特性的前提下,充分利用硬件资源,不断调整程序结构使之趋于合理的过程。其目的是最大程度发挥处理器效能,最大限度利用资源,尽可能提高程序在特定硬件平台上的性能。随着ARM 处理器在通信及消费电子等行业中的应用日趋广泛,优化技术将在基于arm 处理器的过程中发挥越来越重要的作用。

  值得注意的是,程序的优化通常只是软件设计需要达到的诸多目标之一, 优化应在不影响程序正确性、健壮性、可移植性及可维护性的前提下进行。片面追求程序的优化往往会影响健壮性、可移植性等重要目标。


上一页 1 2 下一页

关键词:优化程序设计ARM

评论


相关推荐

技术专区

关闭