ARM 的非 RISC 特征
允许特定指令的执行周期可变
增加桶形移位器
使用 16 位 Thumb 指令
使用条件执行指令
使用增强 DSP 指令
Jazelle
Jazelle 是ARM 引进的第 3 种指令集。执行 8 位指令,硬件完成超过 60% 的 Java 字节代码,其余代码由软件完成。 为了执行 Java 字节码,需要外加一个 Java 虚拟机的特殊版本。Jazelle 是一个封闭的指令集,没有公开。要从 ARM 及 SUN 获得许可,以得到额外的软件。
ARM 的 PC
在指令“执行”阶段, pc 总是指向该指令地址加 8 字节的地址。当处理器处于 Thumb 模式时, pc 的值为正在执行指令的地址加 4
3个值得注意的流水线特征
第一, 执行一条分支指令或直接修改 pc 而发生跳转时,会使 ARM 内核清空流水线。
第二, ARM10 使用分支预测技术,通过预测可能的分支并在指令执行前装载新的分支地址,从而减小了清空流水线的影响。
第三, 即使产生了一个中断,一条处于“执行”阶段的指令也将会完成。流水线里其它指令将会被放弃,而处理器将从向量表的适当入口开始填充流水线。
高效的 C 编程
大多数 ARM 数据处理操作都是 32 位的。基于这个原因,局部变量应该尽可能使用 32 的类型。(int 或者 long)同样,函数参数以及返回值也应该使用 32 位类型。
除法运算时使用无符号数执行速度更快。
对于存放在主存储器中的数组和全局变量,应尽可能地使用小尺寸的数据类型。可以节省空间。
使用无符号的循环计数值,For(I=64;I!=0;I--) 比 for(I=0;I<64;I++)效率高很多!
至少执行一次的循环使用 do-while 效率比较高。
局部变量不要太多(不要超过12个),重要变量和常用变量要使用寄存器。最内层循环变量比较重要。
函数参数不要超过4个(C++不要超过3个),太多时使用结构指针。
把比较小的被调用函数和调用函数放在同一个源文件中,并且要先定义,后调用。
建议一个新的局部变量来保存公共表达式的值,而且要避免使用局部变量的地址。
结构体元素要按照元素大小从小到大排列,内嵌的大的结构体使用指针。由于位填充方式编译器相关,可以人工对齐结构体内部元素。枚举类型编译器相关,所以在结构体中要谨慎使用。
位域会明显减低效率,应尽量避免使用。