ARM的异常与CPSR

来源:互联网 发布:手机怎样申请开淘宝店 编辑:程序博客网 时间:2024/06/05 14:13

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永远只想正在取指的那条指令的地址

0 0
原创粉丝点击