ARM篇二--寄存器组织与异常处理
一、ARM寄存器组织
1 寄存器
概念
寄存器是处理器内部的存储器,没有地址
作用
一般用于暂时存放
参与运算的数据和运算结果分类
包括通用寄存器
、专用寄存器
、控制寄存器
2 ARM寄存器
3 专用寄存器
R15(PC,Program Counter)
程序计数器,用于存储当前取址指令的地址R14(LR,Link Register)
链接寄存器,一般有以下两种用途:- 执行跳转指令(BL/BLX)时,
LR会自动保存跳转指令下一条指令的地址程序
需要返回时将LR的值复制到PC即可实现 - 产生异常时,对应异常模式下的
LR会自动保存被异常打断的指令的下一条指令的地址
,异常处理结束后将LR的值复制到PC可实现程序返回
- 执行跳转指令(BL/BLX)时,
R13(SP,Stack Pointer)
栈指针,用于存储当前模式下的栈顶地址
4 CPSR寄存器
CPSR
(Current Program Status Register),当前程序状态寄存器
CPSR寄存器
分为四个域
,[31:24]
为条件域
用F
表示、[23:16]
为状态域
用S
表示、[15:8]
为预留域
用X
表示、[8:0]
为控制域
用C
表示
Bit[4:0]
[10000]User [10001]FIQ [10010]IRQ [10011]SVC
[10111]Abort [11011]Undef [11111]System [10110]Monitor
Bit[5]
[0]ARM状态 [1]Thumb状态
Bit[6]
[0]开启FIQ [1]禁止FIQ
Bit[7]
[0]开启IRQ [1]禁止IRQ
Bit[28]
当运算器中进行加法运算且产生符号位进位时该位自动置1,否则为0
当运算器中进行减法运算且产生符号位借位时该位自动置0,否则为1
Bit[29]
当运算器中进行加法运算且产生进位时该位自动置1,否则为0
当运算器中进行减法运算且产生借位时该位自动置0,否则为1
Bit[30]
当运算器中产生了0的结果该位自动置1,否则为0
Bit[31]
当运算器中产生了负数的结果该位自动置1,否则为0
二、ARM异常处理
1 异常
1.1 异常处理机制
1.2 ARM异常源
ARM的异常源
FIQ 快速中断请求引脚有效
IRQ 外部中断请求引脚有效
Reset 复位电平有效
Software Interrupt 执行swi指令
Data Abort 数据终止
Prefetch Abort 指令预取终止
Undefined Instruction 遇到不能处理的指令
1.3 ARM异常模式
2 ARM异常响应
2.1 产生异常的动作(自动)
1.拷贝CPSR中的内容到对应异常模式下的SPSR_<mode>
2.修改CPSR的值
2.1.修改中断禁止位禁止相应的中断
2.2.修改模式位进入相应的异常模式 产生异常
2.3.修改状态位进入ARM状态
3.保存返回地址到对应异常模式下的LR_<mode>
4.设置PC为相应的异常向量(异常向量表对应的地址)
2.2 异常向量表
异常向量表
的本质是内存中
的一段代码
- 表中为
每个异常源
分配了四个字节
的存储空间 - 遇到异常后
处理器自动将PC修改为对应的地址
- 因为
异常向量表空间有限
一般我们不会再这里写异常处理程序,而是在对应的位置写一条跳转指令
使其跳转到指定的异常处理程序
的入口
3 异常返回
ARM异常处理完返回的动作(自己编写)
1.将SPSR_<mode>的值复制给CPSR
使处理器恢复之前的状态
产生异常
2.将LR_<mode>的值复制给PC
使程序跳转回被打断的地址继续执行
4 异常优先级与速度
4.1 异常优先级
Reset
Data Abort
FIQ
IRQ
Prefetch Abort
Software Interrupt
Undefined instruction
优先级由高到低
4.2 异常向量表
FIQ的响应速度比IRQ快
- FIQ在
异常向量表位于最末
可直接把异常处理函数
写在异常向量表之后
,省去跳转 - FIQ模式有
5个私有寄存器(R8-R12)
执行中断处理程序前无需压栈保存寄存器,可直接处理中断 - FIQ的优先级高于IRQ
- 两个中断同时发生时先响应FIQ
- FIQ可以打断RIQ,但RIQ不能打断FIQ
三、ARM微架构
1 指令流水线
指令流水线
将指令的取址、解码、执行
三个执行过程,变成流水线形式执行,就是流水线指令。
ARM指令流水线
ARM7采用3级流水线
ARM9采用5级流水线
Cortex-A9采用8级流水线
PC的作用(取地址)
不管几级流水线,PC指向的永远是当前正在取指的指令,而当前正在执行的指令的地址为PC-8
2 多核处理器
多核处理器
即一个SOC片上系统
中集成了多个CPU核
作用
不同的线程可以运行在不同的核心中,做到真正的并发资源
多核处理器共用外设与接口资源
到这里就结束啦!