ARM程序设计优化
from++; *p_to++ = *p_from++; *p_to++ = *p_from++; nbytes - = 16; } } 经过优化后,一次循环可以处理16 个字节。跳转指令带来的影响进一步得到减弱。不过可以看出, 调整后的代码在代码量方面有所增加。 (2)使用寄存器变量 CPU 对寄存器的存取要比对内存的存取快得多, 因此为变量分配一个寄存器, 将有助于代码的优化和运行效率的提高。整型、指针、浮点等类型的变量都可以分配寄存器; 一个结构的部分或者全部也可以分配寄存器。给循环体中需要频繁访问的变量分配寄存器也能在 一定程度上提高程序效率。1.3 指令集相关的优化方法 有时可以利用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、
- 基于DSP的Max-Log-MAP算法实现与优化(05-27)
- 二维DCT编码的DSP实现与优化(09-08)
- 浅谈Linux优化及安全配置(06-03)
- 嵌入式软件工程师必须知道的:volatile的作用(05-01)
- DSP的汇编程序优化(08-01)
- XC166单片机的DSP程序优化方法(08-07)