arm的中断体系结构

2019-04-13 22:02发布

arm体系结构:arm920t

CPU一上电就处于 ARM 状态。
    如果对于arm的CPU的工作模式和状态有疑惑: ** ARM处理器的寄存器,ARM与Thumb状态,7中运行模式 
    如果对arm刚上电的工作模式和状态有疑惑:**arm 上电或复位时的状态,模式 

ARM异常中断处理概述
    1、中断的概念 
            中断是一个过程,是CPU在执行当前程序的过程中因硬件或软件的原因插入了另一段程序运行的过程。
            因硬件原因引起的中断过程的出现是不可预测的,即随机的,而软中断是事先安排的。
         
    2、中断源的概念  
            我们把可以引起中断的信号源称之为中断源。
             arm920T中有60中断源

            (1)子中断源20个:
         
            (2拥有15中断源的
          

            (4)摄像头接口:
           

    3、中断优先级的概念 
            ARM处理器中有7种类型的异常,按优先级从高到低的排列如下:
                复位异常(Reset)、
                数据异常(Data Abort)、
                快速中断异常(FIQ)、
                外部中断异常(IRQ)、
                预取异常(Prefetch Abort)、
                软件中断(SWI)、
                未定义指令异常(Undefined instruction)。

 
 ARM异常的优先级
 
ARM体系异常种类细说:
1.复位异常
        当处理器的复位引脚有效时,系统产生复位异常中断,程序跳转到复位异常中断处理程序处执行。
        复位异常中断通常用在下面两种情况下。 
            *系统上电。 
            *系统复位。 
        当复位异常时,系统执行下列伪操作: 
            R14_svc = UNPREDICTABLE value    //任意值
            SPSR_svc = UNPREDICTABLE value  //任意值
            CPSR[4∶0] = 0b10011  /*进入管理模式*/ 
            CPSR[5] = 0    /*处理器进入ARM状态*/ 
            CPSR[6] = 1    /*禁止快速中断*/ 
            CPSR[7] = 1    /*禁止外设中断*/ 
            If high vectors configured then 
                PC = 0xffff0000 
            Else 
                PC = 0x00000000 

        复位异常中断处理程序的主要功能: 
        *设置异常中断向量表。 
        *初始化数据栈和寄存器。 
        *初始化存储系统,如系统中的MMU等。 
        *初始化关键的I/O设备。 
        *使能中断。 
        *处理器切换到合适的模式。 
        *初始化C变量,跳转到应用程序执行。


2.未定义指令异常
        当ARM处理器执行协处理器指令时,它必须等待一个外部协处理器应答后,才能真正执行这条指令。
        若协处理器没有响应,则发生未定义指令异常。


3.软中断SWI
        软中断异常发生时,处理器进入特权模式,执行一些特权模式下的操作系统功能。

4.预取指令异常 
        预取指令异常是由系统存储器报告的。当处理器试图去取一条被标记为预取无效的指令时,
        发生预取异常。

5.数据访问中止异常 
        数据访问中止异常是由存储器发出数据中止信号,它由存储器访问指令Load/Store产生。
        当数据访问指令的目标地址不存在或者该地址不允许当前指令访问时,处理器产生数据访问中止异常。


6.外部中断IRQ 
        当处理器的外部中断请求引脚有效,而且CPSR寄存器的I控制位被清除时,处理器产生外部中断IRQ异常。
        系统中各外部设备通常通过该异常中断请求处理器服务。

7.快速中断FIQ 
        当处理器的快速中断请求引脚有效且CPSR寄存器的F控制位被清除时,处理器产生快速中断请求FIQ异常。



 
 当异常发生时处理器会把PC设置为一个特定的存储器地址。
    这一地址放在被称为向量表(vector table)的特定地址范围内。
    向量表的入口是一些跳转指令,跳转到专门处理某个异常或中断的子程序。 
            



ARM Generic Interrupt Controller : ARM GIC : arm 通用中断控制器
        如果对 通用中断控制器有疑惑的,请看:***arm 通用中断控制器 

中断的状态:
Inactive(不激活)   没有被激活或挂起的中断
Pending(挂起)      这个中断可以被硬件识别或是由软件产生的,正处於等待处理器处理。
Active(激活)        这个中断被处理器从通用中断控制器中的中断源中识别了出来,并且正在处理这个中断,且没有处理完成。
Active and pending(激活和挂起)  处理器正在处理某个中断,且通用中断控制器有一个挂起的中断,
                                                      这两个中断是属于同一个中断源的

中断流程:


       




进入异常
    在异常发生后,ARM内核会作以下工作: 
    1.在LR中保存下一条指令的地址(即返回地址) 
    2.将CPSR复制到适当的SPSR中; 
    3.将CPSR模式位强制设置为与异常类型相对应的值; 
    4.原来无论是ARM状态或THUMB状态,都进入ARM状态; 
    5.屏蔽快速中断和外部中断。 
    6.强制PC从相关的异常向量处取指。

        进入异常过程:
            1. 程序在系统模式下运行用户程序,假定当前处理器状态为Thumb状态、允许IRQ中断; 
            2. 用户程序运行时发生IRQ中断,硬件完成以下动作: 
                *置位I位(禁止IRQ中断)
                *清零T位(进入ARM状态)
                *设置MOD位,切换处理器模式至IRQ模式 
                *将下一条指令的地址存入IRQ模式的LR寄存器 
                *将CPSR寄存器内容存入IRQ模式的SPSR寄存器 
                *将跳转地址存入PC,实现跳转 
            

    中断响应步骤:
        1、保护断点, 
        2、寻找中断入口,根据不同的中断源所产生的中断,查找不同的入口地址。 
        3、执行中断处理程序。 
        4、中断返回

        具体实现如下:
            1.判断处理器状态
                当异常发生时,处理器自动切换到ARM状态,所以在异常处理函数中要判断
                在异常发生前处理器是ARM状态还是Thumb状态。这可以通过检测SPSR的T位来判断。
            
            2.向量表 
                每一个异常发生时总是从异常向量表开始跳转。最简单的一种情况是向量表里面的
                每一条指令直接跳向对应的异常处理函数。
                    异常处理向量表如下:
                

    利用跳转指令B建立异常向量表
        ENTRY      ;汇编程序开始 
        b reset      ;跳入reset处理程序 
        b HandleUndef    ;跳到未定义处理程序          
        b HandSWI    ;跳到软中断处理程序