×
单片机 > 单片机程序设计 > 详情

ARM 体系的异常中断

发布时间:2020-08-27 发布时间:
|
 6.1   ARM 体系的异常中断 
 
6.1.1 异常中断的种类 
   当ARM 系统正常的程序执行流程发生暂时的停止时,称之为异常,ARM 系统对异常的 
响应过程称之为异常中断。例如当ARM  系统检测到外部的复位信号有效,ARM  系统的程 
序就会跳转到复位处理程序。在处理异常之前,ARM  内核保存当前的处理器状态,这样当 
处理程序结束时可以恢复执行原来的程序。当然ARM 体系的产生异常中断后,会按照一定 
的程序进行中断处理。下面我们分别介绍ARM  系统异常,ARM  体系异常中断包括复位、 
未定义的指令、软件中断,指令预取中断等。 
●复位(Reset ):当处理器的复位引脚有效时,系统产生复位异常中断,程序跳转到复位异 
常中断处理程序处执行。复位异常中断通常用在下面两种情况:①系统加电时 ②系统复位 
时。 
●未定义的指令(undefined instruction):当ARM 处理器或者时系统中是协处理器认为当前指 
令未定义时,产生未定义指令异常中断。可以通过该异常中断机仿真浮点向量的运算。 
●软件中断(Soft   interrupt   SWI):这时有用户定义的中断指令。可用于用户模式下的程序调 
试特权操作指令。在实际的操作中可以通过该机制实现系统功能的调用。 
●指令预取中止(Prefech Abort)     :如果处理器预取的指令的地址不存在,或者该地址不允许 
当前指令访问,当该预取的指令执行时,处理器产生指令预取中止异常中断。 
数据访问中止(Data       Abort):如果数据访问指令的目标地址不存在,或许该地址不允许当前 
指令访问,处理器产生。 
●外部中断请求(IRQ):当处理器的外部中断请求引脚有效,而且 CPSR  寄存器的 1 位控 
制位被清除时,处理器产生外部中断请求(IRQ)异常中断。系统中个外设通常通过该异常 
中断请求处理器服务。  
●快速中断请求(FIQ ):当处理器外部快速中断请求引脚有效,而且 CPSR  寄存器的 F  控 
制位被清除时,处理器产生外部中断请求(FIQ )异常中断。 
 
6.1.2 处理异常中断的寄存器 
中止模式(Abort abt )                            用于虚拟存储及存储保护 
未定义指令模式(Undefined und )                     用于支持通过软件仿真硬件的协处理器 
系统模式(System sys)                            用于运行特权级的操作系统 
 
     各种不同的处理器模式可能有对应于该处理器的物理寄存器组,如表 6.2 所示。其中, 
R13_svc 表示特权模式下的R13 寄存器,R_13abt 表示中止模式下的R13 寄存器,其余的各 
寄存器名称含义类推。 
 
                        表 6.2  各处理器模式物理寄存器组 
用户模式 系统模式  特权模式 中止模式 未定义指令模式 外部中断模式  快速中断模式 
   R0       R0       R0       R0        R0              R0           R0 
   R1       R1       R1       R1        R1              R1           R1 
   R2       R2       R2       R2        R2              R2           R2 
   R3       R3       R3       R3        R3              R3           R3 
   R4       R4       R4       R4        R4              R4           R4 
   R5       R5       R5       R5        R5              R5           R5 
   R6       R6       R6       R6        R6              R6           R6 
   R7       R7       R7       R7        R7              R7           R7 
   R8       R8       R8       R8        R8              R8           R8_fiq 
   R9       R9       R9       R9        R9              R9           R9_fiq 
   R10      R10      R10      R10       R10             R10          R10_fiq 
   R11      R11      R11      R11       R11             R11          R11_fiq 
   R12      R12      R12      R12       R12             R12          R12_fiq 
   R13      R13      R13_svc  R13_abt   R13_und         R13_irq      R13_fiq 
   R14      R14      R14_svc  R14_abt   R14_und         R14_irq      R14_fiq 
   PC       PC       PC        PC        PC              PC           PC 
 
CPSR        CPSR        CPSR       CPSR       CPSR       CPSR        CPSR 
 
                       SPSR_svs    SPSR_abt   SPSR_und   SPSR_irq    SPSR_fiq 
 
  如果异常中断处理程序中使用它自己的物理寄存器之外的其他寄存器,异常中段处理程序 
必须保存和恢复这些寄存器。 
  上表中各物理寄存器的名称在ARM 汇编语言中并没有被预定义。用户使用这些寄存器时, 
必须使用伪操作RN 来定义这些名称。例如我们要使用寄存器R13_abt 可以使用下面的语句。 
      R13_abt RN   R13 
  当几个异常中断同时发生时,就必须按照一定的次序来处理这些异常中断。在ARM 中通 
过给各异常中断赋予一定的优先级来实现这种处理次序。当然有些异常中断时不可能同时发 
生的,如指令预取中止异常中断和阮籍异常中断时由同一条指令的执行触发,它们时不可能 
同时发生的。处理器执行一个特定的异常中断的过程中,称为处理器处于特定的中断模式。 
各异常中断的中断向量地址以及中断的处理优先级如表 6.3 所示。 
 
                表 6.3 各异常中断的中断向量地址以及中断的处理优先级 
 
中断向量地址            异常中断类型             异常中断模式               优先级(6 级最低) 
0x0               复位                 特权模式(SVC)            
0x4               未定义的指令             未定义的指令中止模式  
0x8               软件中断               特权模式                
0x10              数据访问中止             中止模式                
0x14              保留                 未使用                  未使用 
0x18              外部中断请求             外部中断模式              
0x1c             快速中断请求              快速中断模式              
 
6.1.4  进入异常中断 
  ARM 处理器对异常中断的响应过程如下: 
  (1)  保存处理器当前状态、中断屏蔽位以及各条件标志位。这是通过将当前程序状态寄 
        存器 CPSR 的内容保存到将要执行的异常中断对应的SPSR 寄存器中实现的。各异 
        常中断有自己的物理 SPSR 寄存器。 
  (2 )  设置当前程序状态寄存器CPSR 中相应的位。包括设置CPSR 中的位,使处理器进 
        入相应的执行模式;设置 CPSR  中的位,禁止IRQ  中断,当进入FIQ 模式时,禁 
        止FIQ 中断。 
  (3)  将寄存器lr_mode 设置成返回地址。 
  (4 )  将程序计数器值(PC ),设置成该异常中断的中断向量地址,从而跳转到相应的异 
        常中断处理程序执行。 
   下面我们将分别介绍各种异常中断响应时ARM 系统执行的指令。 
   1.响应复位异常中断  
    当处理器的复位引脚有效时,处理器中止当前指令。当处理器的复位引脚变成无效时, 
   处理器开始执行下面的操作。  
   R14_svc=UNPREDICTABLE value  
   SPSR_svs=UNPREDICTABLE value  
     
   CPSR[4:0]=0b10011  
     
   CPSR[5]=0  
     
   CPSR[6]=1  
     
   CPSR[7]=1  
    If high vectors configured then  
   PC=0Xffff0000  
   Else  
   PC=0x00000000  
     
   2. 响应未定义指令异常中断  
   处理器响应未定义指令异常中断时的处理过程如下面的伪指令所示。  
   R14_und=address of next interaction after the undefined instruction  
   SPSR_und=CPSR  
     
   CPSR[4:0]=0b11011  
     
   CPSR[5]=0  
     
     
   CPSR[7]=1  
    if high vectors configured then  
   PC=0Xffff0004  
   Else  
   PC=0x00000004  
     
   3. 响应 SWI 异常中断  
   处理器响应 SWI 异常中断时的处理过程如下面的伪代码所示。  
   R14_svc=address of next instruction after the SWI instruction  
   SPSR_svc=CPSR  
     
   CPSR[4:0]=0b10011  
     
   CPSR[5]=0  
     
     
   If high vectors configured then   
   PC=0Xffff0000  
   Else  
   PC=0x00000000  
     
   4. 响应指令预取中止异常中断  
   处理响应指令预取中止异常中断时的处理过程如下面的伪代码所示。  
   R14_aht=address of the aborted instruction + 4  
   SPSR_abt=CPSR  
     
   CPSR[4:0]=0b10111  
     
   CPSR[5]=0  
     
   CPSR[6]=1  
     
   CPSR[7]=1  
   If high vectors configured then  
   PC=0Xffff001C  
   Else  
   PC=0x0000001c  
  
  
 
6.1.5 退出异常中断 
ARM 系统处理完中断后从异常中断处理程序中返回包括下面的步骤。  
     ● 恢复被中断的程序的处理状态,即将 SPSR_mode 寄存器内容复制到当前程序状态 
        寄存器 CPSR中。  
     ● 返回到发生异常中断的指令的下一条指令处执行。即将 lr_mode 寄存器的内容复 
        制程序计数器 PC 中。  
因为整个应用系统时从复位异常中断处理程序执行的,所以复位异常中断处理程序不需要返 
回。  
   实际上,当异常中断发生时,程序程序计数器 PC 所致的位置对于各种不同的异常中断是 
不同的。同样,返回地址对于各种不同的异常中断也是不同的。  
下面我们分别介绍各种异常中断处理程序的返回方法。  
1.SWI 和未定义指令异常中断处理程序的返回  
SWI 和未定义指令异常中断是由当前执行的指令自身产生的,当 SWI 和未定义指令异常中断 
产生时,程序及顺气 PC的值还未更新,它指向当前指令后面第 2 指令(对于 ARM指令来说, 
它指向当前指令地址加 8 个字节的位置;对于 Thumb 指令来说,它指向当前指令地址加 4 
个字节的位置)。当 SWI 和未定义指令异常中断发生时,处理器将值(PC-4)保存到异常模 
式下的寄存器 lr_mode中。这时(PC-4)即指向当前的下一条指令。因此返回操作可以通过 
下面的指令来实现:  
MOV PC,LR  
  该指令将寄存器 LR 中的值复制到程序计数器 PC 中,实现程序返回,同时将 SPSR_mode 
寄存器内容复制到当前程序状态寄存器 CPSR 中。  
  当异常中断处理程序中使用了数据栈时,可以通过下面的指令在进入异常中断处理程序时 
保存被中断程序的执行现场,在退出异常中断处理程序时恢复被中断程序执行现场。异常中 
断处理程序中使用的数据栈由用户提供。  
  STMFD SP! ,(reglist lr)  
   ; ...  
  LDMFD SP! ,reglist pc)^  
  在上述指令中,reglist 是异常中断处理程序使用的寄存器立表。标识符^指示将 
SPSR_mode 寄存器内容复制到当前程序状态寄存器 CPSR 中。该指令只能在特权模式下使用。  
  
2.IRQ和 FIQ 异常中断处理程序的返回  
 通常处理器执行完当前指令后,查询 IRQ 中断引脚及 FIQ 中断引脚,并且查看系统时否允 
许 IRQ 中断及 FIQ 中断。如果有中断引脚有效,并且系统允许该中断产生,处理器将产生 
IRQ 异常中断或 FIQ 异常中断。当 IRQ 和FIQ 异常中断产生时,程序计数器 PC 的值也经更 
新,它指向当前指令后面第 3 条指令(对预 ARM 指令来说,它指向当前指令地址加 12 个字 
节的位置;对于 Thumb 指令来说,它指向当前指令地址加 6 个字节的位置)。当 IRQ 和 FIQ 
异常中断发生时,处理器将值(PC-4)保存到异常模式下的寄存器 lr_mode 中。这时(PC-4) 
即指向当前指令后的第 2 条指令。因此返回操作可以通过下面的指令来实现:  
   SUBS  PC , LD, #4  
该指令将寄存器LR中的值减4后,复制到程序计数器PC中,实现程序返回,同时将SPSR_mode 
寄存器内容复制到当前程序状态寄存器 CPSR 中。  
当异常中断处理程序中使用了数据栈时,可以通过下面的指令进入异常中断处理程序时保存 
被中断程序的执行现场。异常中断处理程序中使用的数据栈由用户提供。  
  SUBS LR,LR,#4  
  STMFD SP!,{reglistl,lr}  
  ; ...  
  LDMFD SP!{reglist ,pc}^  
  在上述指令中,reglist 是异常中断处理程序中使用的寄存器列表。标识符^指示将 
SPSR_mode 寄存器内容复制到当前程序程序寄存器 CPSR 中。该指令只能在特权模式下使用。  
  
3.预取中止异常中断处理程序的返回  
在指令预取时,如果目标地址时非法的,该指令将被标记称有问题的指令。这时,流水线上 
该指令之前的指令继续执行。当执行到该被标记称有问题的指令时,处理器产生指令预取中 
止异常中断。  
   当发生指令预取中止异常中断时,程序要返回到该有问题的指令处,重新读取并执行该 
指令。因此指令预取中止异常中断程序应该返回到产生该指令预取中止异常中断的指令处。 
而不是像前面两种情况下返回到发生中断的指令的下一条指令。  
   指令预取中止异常中断时由当前执行的指令自身产生的,当指令预取中止异常中断产生 
时,程序计数器 PC 的值还未更新,指向它当前指令后面第 2 条指令(对于 ARM 指令来说, 
它指向当前指令地址加 8 各字节的位置;对于 Thumb 指令来说,它指向当前指令地址 4个字 
节的位置)。当指令预取中止异常中断发生时,处理器将值(PC-4)保存到异常模式下的寄 
存器 lr_mode 中。这时(PC-4)即指向当前指令的下一条指令。因此返回操作可以通过下面 
的指令来实现:  
SUSB   PC  , LR ,#4  
该指令将寄存器 LR 中的值减 4 后,复制到程序计数器 PC 中,实现程序的返回,同时将 
SPSR_mode 寄存器内容复制到当前程序状态寄存器 CPSR 中。  
    当异常中断处理程序中使用了数据栈时,可以通过下面的指令在进入异常中断处理程序 
时保存被中断程序的执行现场,在推出异常中断处理程序时恢复被中断程序的执行现场。异 
常中断处理程序中使用的数据栈由用户提供。  
    SUBS LR ,LR ,#4  
    STMFD SP! ,{reglist ,lr}  
    ;…  
    LDMFD SP!,{reglist ,pc}^  
    在上述指令中,reglist 是异常中断处理程序中使用的寄存器列表。标识符^指示将 
SPSR_mode 寄存器内容复制到当前程序状态寄存器 CPSR 中。该指令只能在特权模式下使用。  
      
4.数据访问中止异常中断处理程序返回  
    当发生数据访问中止异常中断时,程序要返回到该有问题的数据访问处,重新访问该数 
   据,因此数据访问中止异常中断程序应该返回到产生该数据访问中止异常中断的指令 
   处,而不是像前面两种情况下返回到当前指令的下一条指令。  
       数据访问中止异常中断是由数据访问指令产生的,当数据访问中止异常中断产生 
    时,程序计数器 PC 的值已经更新,它指向当前指令后面第二条指令(对于 ARM 指令来 
   说,它指向当前指令地址加 8 个字节的位置;对于 Thumb指令来说,它指向当前指令地 
   址加 4 个字节的位置)。当数据访问中止异常中断发生时,处理器将值(PC-4)保存到 
   异常模式下的寄存器 lr_mode 中。这时(PC-4)即指向当前指令的后第二条指令。因此 
   返回操作可以通过下面的指令来实现:  
       SUSB  PC ,LR #8  
         该指令将寄存器 LR 中的值减 8 后,复制到程序计数器 PC中,实现程序返回,同 
    时将 SPSR_mode 寄存器内容复制到当前程序状态寄存器 CPSR中。  
        当异常中断处理程序中使用了数据栈时,可以通过下面的指令在进入异常中断处理 
   程序时保存被中断程序保存的执行现场,在退出异常中断处理程序时恢复被中断程序的 
   执行现场。异常中断处理程序中使用的数据栈由用户提供。  
       SUSB   LR ,LR #8  
       STMFD SP ! ,{eglist ,lr}  
        ;...  
       LDMFD SP !{reglist,pc}^  
       在上述指令中,reglist是异常中断处理程序中使用的寄存器列表。标识符^指示将 
   SPSR_mode 寄存器内容复制到当前程序状态寄存器 CPSR 中。该指令只能在特权模式下 
   使用。  


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
AVR熔丝位操作时的要点和需要注意的相关事项