【1】异常处理流程
异常向量表
当异常产生时, ARM core:
拷贝 CPSR 到 SPSR_<mode>
设置适当的 CPSR 位:
改变处理器状态进入 ARM 态
改变处理器模式进入相应的异常模式
设置中断禁止位禁止相应中断 (如果需要)
保存返回地址到 LR_<mode>
设置 PC 为相应的异常向量
返回时, 异常处理需要:
从 SPSR_<mode>恢复CPSR
从LR_<mode>恢复PC
Note:这些操作只能在 ARM 态执行.
【2】为什么FIQ的响应速度比IRQ快
1. FIQs有高于IRQs的优先级
2. FIQ 向量位于异常向量表的最末. 异常处理程序可从异常量处连续执行
3. FIQ 模式有5个额外的私有寄存器 (r8-r12) 中断处理必须保护其使用的非私有寄存器
【3】程序状态寄存器(CPSR)
条件位:
N[31]: 负标记位,当ALU运算结果为负数,那么N = 1, 否则N = 0
Z[30]: 0标记位,当ALU运算结果为0,则Z = 1, 否则Z = 0
C[29]: 进位标记
当进行加法运算时:
产生进位(两个32位的数相加变成了33位的数)时:C = 1, 否则C = 0
0xffffffff + 0x1
当进行减法运算时:
产生借位时:C = 0, 否则C = 1
2 - 3
注意:对于非加减运算,不会影响C位
V[28]: 溢出标记(符号位溢出)
加法运算符号位溢出(0->1):
次高位进位,V = 1, 否则V = 0
减法运算符号位溢出(1->0):
次高位借位,V = 1, 否则V = 0
中断禁止位
I[7]: I = 1: 禁止 IRQ. I = 0 使能IRQ
F[6]: F = 1: 禁止 FIQ, F = 0 使能FIQ
处理器的状态位T[5]:
T = 0; 处理器处于 ARM 状态
T = 1; 处理器处于 Thumb 状态
处理器的模式位M[4:0]:
10000 User mode; 10001 FIQ mode; 10011 SVC mode;
10111 Abort mode; 11011 Undfined mode; 11111 System mode;
10110 Monitor mode; 10010 IRQ
【4】练习
1. 切换当前模式为IRQ模式
int a = CPSR //读
a = a & (~(0x1f<<0));
a = a | (0x12<<0);//改
CPSR = a //写
2. 禁止IRQ,进入arm状态
int a = CPSR //读
a = a | (0x1<<7) & (~(0x1<<5));
CPSR = a //写
3. 禁止FIQ,使能IRQ,进入arm状态,切换当前模式为IRQ模式
int a = CPSR //读
a = a | (0x1<<6) & (~(0x1<<7)) & (~(0x1<<5));
a = a & (~(0x1f<<0)) | (0x12<<0);
CPSR = a //写
【5】大小端
大端:高地址存放数据的低字节,低地址存放数据的高字节
小端:高地址存放数据的高字节,低地址存放数据的低字节
判读:
1, 先写4个字节的数据到某一内存下
2, 从这个地址读一个字节的数据,如果是高字节表示大端,如果是低地址表示小端
【6】流水线
无论多少级流水线,pc永远只想正在取指的那条指令的地址