ARM的异常与CPSR

    xiaoxiao2021-03-25  86

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

    转载请注明原文地址: https://ju.6miu.com/read-14623.html

    最新回复(0)