1. ARM寄存器

1.1 综述

  • ARM有37个寄存器(31个通用寄存器+6个状态寄存器)
  • 寄存器不能全部同时看到,在不同的处理器状态和工作模式下,确定哪些寄存器对编程者可见

    1.2 结构

    image.png

    1.2.1 寄存器个数

    各模式公用:CPSR 1个
    system/user:R0~R15 16个
    FIQ影子寄存器:R8~R14 7个
    SPSR_fiq 1个
    Supervisor影子寄存器:R13~R14 2个
    SPSR_svc 1个
    Abort影子寄存器:R13~R14 2个
    SPSR_abt 1个
    IRQ影子寄存器:R13~R14 2个
    SPSR_irq 1个
    Udefine影子寄存器:R13~R14 2个
    SPSR_und 1个
    总计:1+16+3*5+5 = 37

    1.3 通用寄存器

    1.3.1 分类

  • 没有对应影子寄存器:R0-R7

  • 有对应影子寄存器:R8-R14
  • 程序计数器:R15(PC)


R0-R7为真正意义上的通用寄存器,没有任何特殊假设,功能等同,中断异常处理程序中需要对这几个寄存器保存
访问具体的物理处理器取决于当前的模式,依据规定的寄存器的名字进行操作
R8-R12有2组物理寄存器,一个是FIQ模式自己的,一个是其它模式的
R13-R14有6组物理寄存器,六个模式有各自的R13-R14(User和System共用一组)
R13栈指针(SP指针)CPU在不同模式下会自动切换
R14链接寄存器(LR指针)有两个功能:保存调用子程序结束后需要返回的地址,发生异常时保存异常的返回地址
R15程序计数器(PC指针)指向正在取址的地址
使用寄存器最少的是用户模式
可使用的通用寄存器最少的模式是快速中断模式

1.3.2 特别注意

  • R14(LR)在不同功能下的区别
    调用子程序返回的地址为调用程序前的下一条指令地址,
    而发生异常返回的地址会根据异常的类型,调用不同偏移的下一条指令地址
  • R14(LR)在异常嵌套中存在风险
    例如当连续发生两次IRQ中断时,会导致发生第二层中断时,R14_irq会保存第一层中断发生的下一条指令地址,而冲洗掉应该保存的用户模式下中断发生的下一条指令地址,导致程序跑飞回不到原来位置。
    解决办法:(1)将用户模式下中断发生的下一条指令地址入栈,返回时从栈读地址返回
    (2)使用不同的模式嵌套,如第一层中断用FIQ,第二层用IRQ,分别使用的是R14_fiq,
    和R14_irq,不存在被冲洗的风险
  • R15(PC)的读取限制
    从R15读取的值是处理器正在取址的地址,即当前正在执行指令地址加上8个字节(三级流水线)。而ARM状态下指令以字为单位(4字节),所以在ARM状态下R15的寄存器最低两位总是0。(Thumb状态最低总为0)

    1.4 对齐方式

  • ARM:字对齐

  • Thumb:半字对齐

1.5 程序状态寄存器

2.png

1.5.1 条件代码标志

4.png
大多数的数据处理指令可以选择是否影响条件代码标志位(指令带S标志),有的指令强制影响
所有的ARM指令都可以按条件执行,但Thumb指令中只有分支指令可按条件执行

1.5.2 控制位

  • CPSR的低8位,发生异常时这些位会被改变,当处理器运行于特权模式时,这些位可通过程序修改
I IRQ中断禁止位 置1,禁止中断,置0,使能中断
F FIQ中断禁止位 置1,禁止中断,置0,使能中断
T 处理器状态位 置1,Thumb模式,置0,ARM模式

切换T时,ARM/Thumb状态时,ARM的工作模式和寄存器内容不变

  • 模式位如下

文字.png

2. ARM异常

2.1 异常来源

  • 内部:软中断
  • 外部:外设中断请求

需要用到IDT(异常向量表)
X86和ARM处理异常的区别:
X86发生异常时,根据中断号×4,在IDT中定位CPU到指定的向量地址,读取要执行的程序的地址
ARM发生异常时,根据发生中断的模式(IRQ,FIQ…),在IDT中定位到指定的向量地址,读取要执行的指令的地址,一般是一条跳转指令,而且,这时候只知道发生终端的总称,还需要具体判断发生中断的是哪个设备

一个是指令一个是程序,需要区分

2.2 进入异常

  1. PC+4/+8 —>LR (ARM状态),PC+2/+4 —>LR (Thumb状态)
  2. CPSR —> SPSR
  3. 根据异常模式更改CPSR(MOD:M4~0)
  4. I/F置1,禁止中断
  5. 根据IDT更改PC

异常总是在ARM状态下处理,会自动切换

2.3 退出异常

  1. LR-1/-2.. —> PC(根据异常类型返回)
  2. SPSR —> CPSR
  3. I/F置0,恢复中断(SPSR —> CPSR这个动作会自动恢复)


2.4 中止

发生在对存储器不能访问时

  • 预取中止:发生在指令预取过程中
  • 数据中止:发生在对数据的访问中

2.5 软件中断指令(SWI)

  • 进入管理模式

2.6 未定义指令

  • 陷阱程序

2.7 异常优先级

image.png

2.8 复位

nRESET信号被拉低,处理器放弃正在执行的指令
在复位后,除PC(0地址)和CPSR(管理模式)之外的所有寄存器的值都不确定
处理器操作:

  • CPSR:M[4:0]管理模式
  • I/F置位,(关中断)
  • T清零,(进入ARM状态)
  • PC从0X00取指
  • 返回到ARM状态,恢复执行

3. Thumb指令集

3.1 指令特点

  • 紧密度优化
  • 提升窄内存性能
  • 是ARM指令集子集
  • 没有条件执行
  • 只使用低端寄存器R0-R7
  • 常量大小限制
  • 不是常规指令集,编译器生成,而不是手动编写
  • BX指令切换ARM/Thumb状态

切换T时,ARM/Thumb状态时,ARM的工作模式和寄存器内容不变

4. 内存和I/O

  • ARM线性地址空间,【ARM嵌入式】寄存器/异常/内存IO - 图6
  • 字宽寄存器,按字节顺序寻址
  • 支持大端小端

访问对齐
如果存储器格式与芯片的存储器格式不符时,只有以字为单位的数据存取才正确

4.1 存放格式

  • 大端模式:高数据位,低地址位
  • 小端模式:低数据位,低地址位

半字占2个字节
字节占4个字节

4.2 I/O

4.2.1 接口信息

CPU与I/O设备之间的接口信息:数据、状态、控制信息

  • 数据信息
    • 数字量
    • 模拟量
    • 开关量
  • 状态信息
    • 反应外设当前工作状态
    • READY/BUSY
  • 控制信息
    • 读写
    • 时序
    • 中断
    • 片选

4.2.2 端口编址

  • 存储器映射编址
    • I/O与内存统一编址。I/O单元和内存单元同一地址空间
    • 优点:可采用丰富的内存操作指令访问I/O单元,无需单独的I/O地址译码电路,无需专用I/O指令
    • 缺点:外设占用内存空间,I/O程序不易读
    • 举例:ARM
  • I/O映射编址
    • 分开编址
    • 优点:I/O不占内存空间,I/O程序易读
    • 缺点:I/O操作指令单一的传送指令,需要地址译码电路
    • 举例:通用处理器

ARM的I/O端口内存映射

  • 寄存器
  • 不同于正常的存储器位置的操作,没有高速缓存和无缓冲区(避免对正常时序的影响)