ARM的相关知识

ARM 79浏览

ARM的七种运行模式:
User: 非特权模式,一般大多数任务运行在这个模式下。FIQ: 快速中断模式,当高优先级中断(fast-快速中断)发生时进入。RQ: 正常中断模式,当低优先级中断(normal –正常中断)发生时进入。Supervisor: 管理模式,当处理器复位或软中断指令执行时进入,操作系统内核通常处于这种模式。Abort: 中止模式,当处理器访问存储器失败时(memory access violations)进入。Undef: 未定义模式,当处理遇到没有定义的指令或处理器不支持的指令时进入。System: 系统模式,是一种特殊的用户模式-使用与用户模式完全一样的寄存器,允许对cpsr的完全读/写访问。

arm异常处理方式:
1、异常出现的原因:(1)指令执行引起的异常:软件中断、未定义指令(包括所要求的协处理器不存在对于协处理器指令)、预取址中止(存储器故障)、数据中止。
                  (2) 外部产生的中断:复位、FIQ、IRQ。
2、异常的种类:
    (1)、复位(RESET)
    a、当处理器复位引脚有效时,系统产生复位异常中断,程序跳转到复位异常中断处理程序处执行,包括系统加电和系统复位。
    b、通过设置PC跳转到复位中断向量处执行称为软复位。
    (2)、未定义的指令
    当ARM处理器或者是系统中的协处理器认为当前指令未定义时,产生未定义的指令异常中断,可以通过改异常中断机制仿真浮点向量运算。
    (3)、软件中断
    这是一个由用户定义的中断指令(SWI)。该异常由执行SWI指令产生,可用于用户模式下的程序调用特权操作指令。在实时操作系统中可以通过该机制实现系统功能调用。
    (4)、指令预取终止(Prefech Abort)
    如果处理器预取的指令的地址不存在,或者该地址不允许当前指令访问,当被预取的指令执行时,处理器产生指令预取终止异常中断。
    (5)、数据访问终止(DATAABORT)
    如果数据访问指令的目标地址不存在,或者该地址不允许当前指令访问,处理器产生数据访问终止异常中断。
    (6)、外部中断请求(IRQ)
    当处理器的外部中断请求引脚有效,而且CPSR的寄存器的I控制位被清除时,处理器产生外部中断请求异常中断。系统中个外设通过该异常中断请求处理服务。
    (7)、快速中断请求(FIQ)
    当处理器的外部快速中断请求引脚有效,而且CPSR的F控制位被清除时,处理器产生外部中断请求异常中断。

3、出现异常后CPU自动处理的过程:(1)拷贝CPSR到SPSR_<mode>
                             (2)设置适当的CPSR位: 改变处理器状态进入ARM状态;改变处理器模式进入相应的异常模式;设置中断禁止位禁止相应中断
                             (3)更新LR_<mode>,这个寄存器中保存的是异常返回时的链接地址
                             (4)设置PC到相应的异常向量
                              异常向量表:http://blog.chinaunix.net/attachment/201205/23/20937170_1337783710UPK1.jpg
4、异常中断处理后返回: (1)、将所有修改过的用户寄存器从处理程序的保护栈中恢复。
                      (2)、将SPSR复制回CPSR中,将连接寄存器LR的值减去相应的偏移量后送到PC中。
                      (3)、若在进入异常处理时设置了中断禁止位,要在此清除。
                      复位异常处理程序不需要返回。

寄存器的组织方式:user:r0~r12,r13(sp),r14(lr),r15(pc),cpsr
                fiq:r0~r7,r15,cpsr,改变(r8~r14),增加(spsr)
                irq:改变(r13,r14),增加(spsr)
                svc:改变(r13,r14),增加(spsr)
                abort:改变(r13,r14),增加(spsr)
                undef:改变(r13,r14),增加(spsr)
    程序状态寄存器           条件标志                ...   禁止中断           状态               处理器模式
         cpsr   N(符号) Z(零) C(进位) V(溢出)   ...     I F        0(arm) 1(thumb)     0000  0001 0010 0011  0111  1011  1111
                                                                                           user  fiq  irq  svc  abort undef  sys