目录
寄存器概念
寄存器是处理器内部的存储器,没有地址。
一般用于暂时存放参与运算的数据和运算结果。
包括通用寄存器、专用寄存器、控制寄存器。
注意:全局变量不允许使用寄存器
ARM寄存器
在某个特定模式下只能使用当前模式下的寄存器,一个模式下特有的寄存器其他模式下不可使用。三角是后援寄存器。
ARM专用寄存器
ARM专用寄存器是ARM架构中用于存储和操作CPU状态、中断、存储器和外设相关信息的寄存器。这些寄存器分为三类:程序状态寄存器(PSR)、中断状态寄存器(ISR)和系统控制寄存器(SCR)。以下是一些常见的ARM专用寄存器的介绍:
-
CPSR:当前程序状态寄存器,用于存储CPU的当前状态,包括程序状态、条件码、中断禁止和处理器模式等信息。
-
SPSR:保存程序状态寄存器,用于保存返回子程序时的CPSR,以便恢复到之前的状态。
-
PC(R15):程序计数器,用于存储当前正在执行的指令地址。
-
LR(R14):链接寄存器,用于保存返回地址,即调用子程序时的下一条指令地址。
-
SP(R13):栈指针,用于存储栈顶地址,在函数调用和中断处理时用于保存现场。
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异常处理
中断和异常的区别
中断和异常都是计算机系统中的事件,但是它们有以下区别:
-
触发方式:中断是由外部设备或者程序请求发起的,而异常是由计算机系统内部产生的错误或者意外情况触发的。
-
处理方式:中断处理程序的执行是由操作系统来决定的,中断处理程序的执行是在中断发生时立即执行的。而异常处理程序的执行则是由CPU自动完成,异常处理程序是由操作系统预定义的。
-
上下文切换:中断可能会导致上下文切换,即从当前进程切换到另外一个进程来处理中断程序。而异常处理程序的执行并不涉及上下文切换。
-
应用场景:中断常用于外设驱动、网络通信等方面,而异常则主要用于保证系统的稳定性和安全性。
总之,中断和异常虽然有些相似之处,但是它们的触发方式、处理方式以及应用场景等方面都有所不同。
异常的概念
在计算机系统中,异常(exception)是指程序执行过程中遇到的一种非正常的情况,例如除以零、无效指令、访问非法内存、中断请求等。异常与中断的概念密切相关,中断属于外部事件触发的异常,而异常则是一些内部错误或状态引起的异常。
ARM异常源
FIQ 快速中断请求引脚有效
IRQ 外部中断请求引脚有效
Reset 复位电平有效
Software Interrupt 执行swi指令
Data Abort 数据终止
Prefetch Abort 指令预取终止
Undefined Instruction 遇到不能处理的指令
ARM异常响应机制
1.拷贝CPSR中的内容到对应异常模式下的SPSR_<mode>
2.修改CPSR的值
2.1修改中断禁止位禁止相应的中断
2.2修改模式位进入相应的异常模式
2.3修改状态位进入ARM状态
3.保存返回地址到对应异常模式下的LR_<mode>
4.设置PC为相应的异常向量(异常向量表对应的地址)
ARM异常向量表
> 异常向量表的本质是内存中的一段代码。
> 表中为每个异常源分配了四个字节的存储空间。
> 遇到异常后处理器自动将PC修改为对应的地址。
> 因为异常向量表空间有限一般我们不会再这里写异常处理程序,而是在对应的位置写一条跳转指令使其跳转到指定的异常处理程序的入口。
注意:ARM的异常向量表的基地址默认在0x00地址 ,但可以通过配置协处理器来修改其地址。
异常的返回
1.将SPSR_<mode>的值复制给CPSR使处理器恢复之前的状态
2.将LR_<mode>的值复制给PC使程序跳转回被打断的地址继续执行
FIQ和IRQ
FIQ的响应速度比IRQ快
1. FIQ在异常向量表位于最末可直接把异常处理写在异常向量表之后,省去跳转
2. FIQ模式有5个私有寄存器(R8-R12)执行中断处理程序前无需压栈保存寄存器,可直接处理中断。
3. FIQ的优先级高于IRQ。