教材:嵌入式系统及应用,罗蕾、李允、陈丽蓉等,电子工业出版社
编程模型
数据宽度(类型)
ARM 是 32 位读取/存储架构
字节型数据(Byte)
数据宽度为 8bits半字数据类型(Half Word)
数据宽度为 16bits,存取式必须以 2 字节对齐的方式- 字数据类型(Word)
数据宽度为 32bits,存取式必须以 4 字节对齐的方式
工作模式(处理器模式)
ARM处理器有七种基本的操作模式:
每一种模式只能访问自己的栈空间和不同的寄存器子集
有一些操作只能在特权模式下执行
工作状态
执行 BX 指令,并设置操作数寄存器的位[0] 为1,则进入 Thumb 状态
Thumb 状态下进入异常,异常处理返回时,自动转换为 Thumb 状态
执行 BX 指令,并设置操作数寄存器的位[0] 为0,则进入 ARM 状态
进入异常时,PC 放入异常模式链接寄存器中,从异常向量地址开始执行也可进入 ARM 状态
BX 是分支指令,完成程序跳转的同时,根据操作数位[0]的情况,完成状态的转换
状态的切换不影响处理器的模式
寄存器
在 ARM CPU Core 中,程序员可见的寄存器有 31 个通用寄存器和 6 个状态寄存器
ARM寄存器集(ARM State)
ARM寄存器集( Thumb State )
ARM State 与Thumb State寄存器关系
通用寄存器
(31个)是 R0 - R15,分为三类
- 没有对应影子寄存器的寄存器 R0 - R7
- 有对应影子寄存器的寄存器 R8 - R14
- 程序计数器 R15 (或者 PC)
影子寄存器是指该寄存器在不同的模式下对应的物理寄存器
所有模式下,R0-R7 所对应的物理寄存器都是相同的,它们的功能都是等同的,在中断或者异常处理程序中一般都需要对这几个寄存器进行保存
R8-R14:访问的物理寄存器取决于当前的处理器模式,若要访问特定的物理寄存器而不依赖当前的处理器模式,则要使用规定的名字
R8-R12:各有两组物理寄存器:一组为 FIQ 模式,另一组是除 FIQ 以外的其他模式
R13-R14:各有6个分组的物理寄存器,一个用于用户模式和系统模式,其他5个分别用于5种异常模式
R13(也被称为SP指针)被用作栈指针,通常在系统初始化时需要对所有模式下的SP指针赋值,当CPU在不同的模式时栈指针会被自动切换成相应模式下的值
R14 有两个用途,一是在调用子程序时用于保存调用返回地址,二是在发生异常时用于保存异常返回地址
R15 用作程序计数器(PC),可以被读写
- 读 PC 时,得到的值是当前 PC +8 或者 +12 的值(由于流水线,需根据具体 CPU 的实现来确定),不建议直接读取 PC 的值
- 写 PC 相当于将程序跳转到指定地址执行
- ARM state: bits [1:0] 未定义,bits[31:2] 即为 PC(因为指令都是32位宽,按字对齐)
THUMB state:bit [0] 未定义,bits[31:1] 即为 PC(因为指令都是16位宽,按半字对齐)
程序状态寄存器
CPSR(当前程序状态寄存器)在所有的模式下都是可以读写的,它主要包含条件标志、中断使能标志、当前处理器的模式、其它的一些状态和控制标志
模式控制位 M0 - M4
数据对齐
在 v6 架构之前,数据访问都必须针对要访问的大小把访问地址进行对齐,没有对齐的地址将会导致无法预料/未定义的结果
用“数据中止”异常来检测无效的未对齐数据访问(指令预取也可能出现没对齐)
没有对齐的地址数据可以通过多个对齐地址数据移位/掩码操作来实现
V6 架构添加了新的硬件来支持未对齐的数据访问
大小端
大小端决定了寄存器的内容和内存内容的格式关联
ARM 支持大端(Big-endian)和小端(Little-endian)的内存数据方式,可以通过硬件的方式设置端模式,也可以通过软件的方式来设置(V6 版本以上)
大端的数据存放
- 最高有效字节位于最低地址
- 最高有效字节的地址就是该 word 的地址
小端的数据存放
- 最低有效字节位于最低地址
- 最低有效字节的地址就是该 word 的地址
指令集
ARM 指令集
所有的指令长度都是32位 / 许多指令都在一个单独周期内执行
指令是条件执行的
Load(加载) / store(存储)架构
Thumb 指令集
Thumb-2 指令集
Thumb-2 主要是对 Thumb 指令集架构(ISA)的扩展指令
- 增加了32位指令,实现了几乎所有的 ARM 指令集架构的功能
- 保留了完整的16位 Thumb 指令集
- ARM1156T2-S 和 Cortex 系列支持 Thumb-2
- Cortex-M3 只支持 Thumb-2
不需要手动选择指令集
- 减少了剖析代码和理解执行方式的需求
- 编译器可以自动地选择 16 位和 32 位指令的混合
可以访问ARM态的行为
- 异常可以直接处理
- 可以访问协处理器
- 可以完成 v5TE 的高级数据处理
条件执行可以通过If-Then (IT) 指令,1-4 条紧接指令可以条件性地执行
Jazelle
Jazelle 使得 ARM 核可以执行8位的 Java 字节码
- 95%的字节码可以用硬件执行(典型)
- 功耗效率显著提高
当处理器在 Jazelle 态执行时
- 所有的指令都是8位宽
- 处理器进行字访问一次读4条指令