异常中断处理概述

异常中断处理概述

 

1.       ARM中异常中断处理概述

1)      在正常程序执行过程中,每执行一条ARM指令,程序计数器寄存器PC的值加4个字节;每执行一条Thumb指令,程序计数器寄存器PC的值加两个字节.整个过程是顺序执行.

2)      通过跳转指令,程序可以跳转到特定的地址标号处执行,或者跳转到特定的子程序处执行;

B指令用于执行跳转操作;

BL指令在执行跳转操作的同时,保存子程序的返回地址;

BX指令在执行跳转操作的同时,根据目标地址的最低位可以将程序状态切换到Thumb状态;

BLX指令执行3个操作:跳转到目标地址处执行,保存子程序的返回地址(R15保存在R14),根据目标地址的最低位可以将程序状态切换到Thumb状态.

3)      当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行.在当异常中断处理程序执行完成后,程序返回到发生中断的指令的下一条指令处执行.

4)      在进入异常中断处理程序时,要保存被中断的程序的执行现场,在从异常中断处理程序退出时,要恢复被中断的程序的执行现场.本章讨论ARM体系中的异常中断机制.

2.       ARM体系中异常中断种类.

ARM体系中的异常中断如下表所示:

 

ARM体系中的异常中断

异常中断名称

含义

复位(RESET)

当处理器的复位引脚有效时,系统产生复位异常中断,程序跳转到复位异常中断处理程序处执行.复位异常中断通常用在下面两种情况:

系统加电时

系统复位时

跳转到复位中断向量处执行,称为软复位

数据访问中止(Data Abort)

如果数据访问指令的目标地址不存在,或者该地址不允许当前指令访问,处理器产生数据访问中止异常中断

快速中断请求(FIQ)

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

外部中断请求(IRQ)

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

预取指令中止(Prefech Abort)

如果处理器预取的指令的地址不存在,或者该地址不允许当前指令访问,当该被预取的指令执行时,处理器产生指令预取中止异常中断

软件中断(software interrupt SWI)

这是一个有用化定义的中断指令.可用于用户模式下的程序调用特权操作指令.在实时了操作系统(RTOS)中可以通过该机制实现系统功能调用

未定义的指令(undefined instruction)

ARM处理器或者是系统中的协处理器认为当前指令未定义时,产生未定义的指令异常中断.可以通过该异常中断机制仿真浮点向量运算

3.       异常中断向量表及异常中断优先级

中断向量表中指定了各异常中断及其处理程序的对应关系.它通常存放在存储地址的低端.ARM体系中,异常中断向量表的大小为32字节.其中,每个异常中断占据4个字节大小,保留了4个字节空间.

每个异常中断对应的中断向量表的4个字节的空间中存放了一个跳转指令或者一个PC寄存器中赋值的数据访问指令.通过这两种指令,程序将跳转到相应的异常中断处理程序处执行.

当几个异常中断同时发生时,就必须按照一定的次序来处理这些异常中断.ARM中通过给各异常中断富裕一定的优先级来实现这种处理次序.当然有些异常中断是不坑能同时发生的,如指令预取中止异常中断和软件中断(SWI)异常中断是有同一条指令的执行触发的,他们是不可能同时发生的.处理器执行某个特定的异常中断的过程中,称为处理器处于特定的中断模式.各异常中断的中断向量地址以及中断的处理优先级如表2所示.

 

各异常中断的中短向量地址以及中断的处理优先级

中断向量地址

异常中断类型

异常中断模式

优先级(6最低)

0x0

复位

特权模式(SVC)

1

0x4

未定义的指令

未定义指令中止模式(Undef)

6

0x8

软件中断(SWI)

特权模式(SVC)

6

0x0c

指令预取中止

中止模式

5

0x10

数据访问中止

中止模式

2

0x14

保留

未使用

未使用

0x18

外部中断请求(IRQ)

外部中断(IRQ)模式

4

0x1c

快速中断请求(FIQ)

快速中断(FIQ)模式

3

 

4.       异常中断使用的寄存器

各异常中断对应着一定的处理器模式.应用程序通常运行在用户模式下.ARM中的处理器模式如表3所示.

 

ARM中的处理器模式

处理器模式

描述

用户模式

正常程序执行的模式

快速中断模式

用于高速数据传输和通道处理

外部中断模式

用于通常的中断处理

特权模式

供操作系统使用的一种保护模式

中止模式

用于虚拟存储及存储保护

未定义指令模式

用于支持通过软件仿真硬件的协处理器

系统模式

用于运行特权级的操作系统任务

 

各种不同的处理器模式可能有对应于该处理器模式的物理寄存器组,如表4所示,其中,R13_svc表示特权模式下的R13寄存器,R13_abt表示中止模式下的R13寄存器,其余的各寄存器名称含义类推.

 

4    各处理器模式的物理寄存器组

用户模式

系统模式

特权模式

中止模式

未定义指令模式

外部中断模式

快速中断模式

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_iiq

R13_fiq

R14

R14

R14_svc

R14_abt

R14_und

R14_iiq

R14_fiq

PC

PC

PC

PC

PC

PC

PC

CPSR

CPSR

CPSR

CPSR

CPSR

CPSR

CPSR

 

 

SPSR_svc

SPSR_abt

SPSR_und

SPSR_iiq

SPSR_fiq

 

 

如果异常中断处理程序中使用它自己的物理寄存器之外的其它寄存器,异常中断处理程序必须保存和恢复这些寄存器.

在表4中各物理寄存器的名称(R13_svc)ARM汇编语言中并没有被预定义.用户使用这些寄存器时,必须使伪操作RN来定义这些名称.如可以通过下面操作定义寄存器名称R13_svc:

R13_svc  RN  R13

 

 

一.      进入和退出异常中断的过程

1.         ARM处理器对异常中断的相应过程

ARM处理器对异常中断的响应过程如下:

a.       保存处理器当前状态,中断屏蔽位以及各条件标志位.只是通过将当前程序状态寄存器CPSR的内容保存到将要执行的异常总段对应的SPSR寄存器中实现的.各异常中断有自己的物理SPSR寄存器.

b.       设置当前程序CPSR中相应的位.包括设置CPSR中的位,使处理器进入相应的执行模式;设置CPSR中的位,禁止IRQ:当进入FIQ模式时,禁止FIQ中断.

c.       将寄存器LR_modeR14)设置成返回地址,R14R15中得到PC的备份.

d.       将程序计数器值PC设置成该异常中断的中断向量地址,从而跳转到相应的异常中断处理程序处执行.

上述的处理器对异常中断的相应过程可以用如下的伪代码描述.

 

e.         响应复位异常中断.

当处理器的复位引脚有效时,处理器中止当前指令.当处理器的复位引脚变成无效时,处理器开始执行下面的操作.

 

R14_svc = UNPREDICTABLE value

SPSR_svc = UNPREDICTABLE value

CPSR[4:0] = 0b10011  //进入特权模式

CPSR[5] = 0          //切换到ARM状态

CPSR[6] = 1          //禁止FIQ异常中断

CPSR[7] = 1          //禁止IRQ中断

If high vectors configured then

PC = 0xffff0000

Else

PC = 0x00000000

 

f.          响应未定义指令异常中断

处理器相应未定义指令异常中断时的处理过程如下面的伪代码所示.

 

R14_und = address of next instruction after the undefined instruction

SPSR_und = CPSR

CPSR[4:0] = 0b11011  //进入未定义指令异常中断模式

CPSR[5] = 0          //切换到ARM状态

CPSR[6] = 1          //禁止FIQ异常中断

CPSR[7] = 1          //禁止IRQ中断

If high vectors configured then

PC = 0xffff0004

Else

PC = 0x00000004

 

g.         响应SWI异常中断

处理器相应SWI异常中断时的处理过程如下面的伪代码所示.

 

R14_svc = address of next instruction after the SWI instruction

SPSR_svc = CPSR

CPSR[4:0] = 0b10011  //进入特权模式

CPSR[5] = 0          //切换到ARM状态

CPSR[6] = 1          //禁止FIQ异常中断

CPSR[7] = 1          //禁止IRQ中断

If high vectors configured then

PC = 0xffff0008

Else

PC = 0x00000008

 

h.         响应指令预取中止异常中断.

处理器相应指令预取中止异常会总段时的处理过程如下面的伪代码所示.

 

R14_abt = address of  the aborted instruction + 4

SPSR_abt = CPSR

CPSR[4:0] = 0b10111  //进入指令预取中止模式

CPSR[5] = 0          //切换到ARM状态

CPSR[6] = 1          //禁止FIQ异常中断

CPSR[7] = 1          //禁止IRQ中断

If high vectors configured then

PC = 0xffff000c

Else

PC = 0x0000000c

 

i.          响应数据访问中止异常中断

处理器相应数据访问中止异常中断时的处理过程如下面的伪代码所示.

 

R14_abt = address of  the aborted instruction + 8

SPSR_abt = CPSR

CPSR[4:0] = 0b10111  //进入数据访问中止模式

CPSR[5] = 0          //切换到ARM状态

CPSR[6] = 1          //禁止FIQ异常中断

CPSR[7] = 1          //禁止IRQ中断

If high vectors configured then

PC = 0xffff0010

Else

PC = 0x00000010

 

j.          响应IRQ异常中断

处理器相应IRQ异常总段时的处理过程如下面的伪代码所示.

 

R14_irq = address of next instruction to be executed + 4

SPSR_irq = CPSR

CPSR[4:0] = 0b10010  //进入IRQ异常中断模式

CPSR[5] = 0          //切换到ARM状态

CPSR[6] = 0          //打开FIQ异常中断

CPSR[7] = 1          //禁止IRQ中断

If high vectors configured then

PC = 0xffff0018

Else

PC = 0x00000018

 

k.         响应FIQ异常中断

处理器相应FIQ异常中断时的处理过程如下面的伪代码所示.

2.         从异常中断处理程序种返回

基本操作:

1)    恢复被中断的程序的处理器状态,即将SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。

2)    返回到发生异常中断的指令的下一条指令处执行,即将LR_mode寄存器的内容复制程序计数器PC中。

1)  复位异常中断

不需要返回。整个应用系统是从复位异常中断处理程序开始执行的,因而它不需要返回。

2)  SWI和未定义指令异常中断处理程序的返回

SWI和未定义指令异常中断是由当前执行的指令自身产生的,

PC指向了第三条指令,但PC的值还没有更新,还为第二条指令的地址值

所以返回时,直接MOV PC,LR即可

3)  IRQFIQ异常中断处理程序的返回

通常处理器执行完当前指令后,查询IRQ中断引脚及FIQ中断引脚,并且查看系统是否允许IRQ中断及FIQ中断。如果由中断引脚有效,并且系统允许该中断产生,处理器将产生IRQ异常中断或FIQ异常中断。

PC指向了第三条指令,并且也得到更新

所以返回时,SUBS PC, LR, #4

4)  指令预取中止异常中断处理程序的返回

当发生指令预取中止异常中断时,程序要返回到该有问题的指令处,重新读取并执行该指令。因此指令预取中止异常中断程序应该返回到产生该指令预取中止异常中断的指令处,而不是像前面两种情况下返回到发生中断的指令的下一条指令。

PC指向第三条指令,还未更新,所以PC的值仍为第二条指令的地址

返回时,SUBS PC, LR, #4

5)  数据访问中止异常中断处理程序的返回

其也要返回发生错误的地址处

但,发生中断时,PC指向第三条指令,且已更新

所以,返回时,SUBS PC, LR, #8

CPSR 寄存器(和保存它的 SPSR 寄存器)中的位分配如下:

  31 30 29 28  ---   7   6   -   4   3   2   1   0
  N  Z  C  V         I   F       M4  M3  M2  M1  M0
 
                                 0   0   0   0   0     User26 模式// mode
                                 0   0   0   0   1     FIQ26 模式
                                 0   0   0   1   0     IRQ26 模式
                                 0   0   0   1   1     SVC26 模式
                                 1   0   0   0   0     User 模式
                                 1   0   0   0   1     FIQ 模式
                                 1   0   0   1   0     IRQ 模式
                                 1   0   0   1   1     SVC 模式
                                 1   0   1   1   1     ABT 模式
                                 1   1   0   1   1     UND 模式

 





原文地址:https://www.cnblogs.com/superit/p/3838696.html