DSP

ARM 嵌入式系统开发 - 软件设计与优化

2019-07-13 19:55发布

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个),太多时使用结构指针。 把比较小的被调用函数和调用函数放在同一个源文件中,并且要先定义,后调用。 建议一个新的局部变量来保存公共表达式的值,而且要避免使用局部变量的地址。 结构体元素要按照元素大小从小到大排列,内嵌的大的结构体使用指针。由于位填充方式编译器相关,可以人工对齐结构体内部元素。枚举类型编译器相关,所以在结构体中要谨慎使用。 位域会明显减低效率,应尽量避免使用。