ARM 异常中断处理

 

l         ARM有3种控制程序流程:

1.         正常执行过程,每执行一条ARM指令,PC增加4字节;每执行一条THUMB指令,PC增加2字节;

2.         跳转指令,B执行跳转操作,BL执行跳转操作,保存子程序返回地址,BX执行跳转,根据目标地址最低位可以切换到THUMB状态;BLX执行以上3种,跳转,保存,切换。

3.         异常中断发生。执行完当前指令,跳转到相应的异常中断处理程序,同时保存当前执行现场,中断执行完成,返回执行现场的下条指令。

各种异常对应不同寄存器,当多个异常发生时,由优先级响应处理

异常类型

具体含义

复位

当处理器的复位电平有效时,产生复位异常,程序跳转到复位异常处理程序处执行。

未定义指令

当ARM处理器或协处理器遇到不能处理的指令时,产生未定义指令异常。可使用该异常机制进行软件仿真。

软件中断

该异常由执行SWI指令产生,可用于用户模式下的程序调用特权操作指令。可使用该异常机制实现系统功能调用。

指令预取中止

若处理器预取指令的地址不存在,或该地址不允许当前指令访问,存储器会向处理器发出中止信号,但当预取的指令被执行时,才会产生指令预取中止异常。

数据中止

若处理器数据访问指令的地址不存在,或该地址不允许当前指令访问时,产生数据中止异常。

IRQ(外部中断请求)

当处理器的外部中断请求引脚有效,且CPSR中的I位为0时,产生IRQ异常。系统的外设可通过该异常请求中断服务。

FIQ(快速中断请求)

当处理器的快速中断请求引脚有效,且CPSR中的F位为0时,产生FIQ异常。

 

 

优先级

异  常

1(最高)

复位

2

数据中止

3

FIQ

4

IRQ

5

预取指令中止

6(最低)

未定义指令、SWI

当系统运行时,异常可能会随时发生,为保证在ARM处理器发生异常时不至于处于未知状态,在应用程序的设计中,首先要进行异常处理,采用的方式是在异常向量表中的特定位置放置一条跳转指令,跳转到异常处理程序,当ARM处理器发生异常时,程序计数器PC会被强制设置为对应的异常向量,从而跳转到异常处理程序,当异常处理完成以后,返回到主程序继续执行

地 址

异 常

进入模式

0x0000,0000

复位

管理模式

0x0000,0004

未定义指令

未定义模式

0x0000,0008

软件中断

管理模式

0x0000,000C

中止(预取指令)

中止模式

0x0000,0010

中止(数据)

中止模式

0x0000,0014

保留

保留

0x0000,0018

IRQ

IRQ

0x0000,001C

FIQ

FIQ

 

从上表还可以看出,cpsr的I位和F位可以屏蔽或使能某些异常。复位程序具有最高的优先级,是系统启动(或复位)时调用的程序。

1)它应该对异常处理程序的系统进行初始化(包括配置储存器和cache)。

2)保证在IRQ和FIQ中断允许之前初始化外部的中断源,避免在还没有设置好相应的处理程序前产生中断。

3)设置好各种处理器模式的堆栈指针。

      数据中止异常指示访问了无效的存储器地址,或者当前代码没有正确的数据访问权限。它不屏蔽FIQ,所以在处理过程中可以处理IRQ。
      FIQ中断的优先级比IRQ中断的优先级要高,且内核进入FIQ处理程序时,把FIQ和IRQ都禁止了,因此,任何外部中断源都不能被处理,如果要实现嵌套或者优先级时就要对上下文进行适当处理然后用软件使能中断。
      同样,要实现IRQ的嵌套,也要相应的上下文操作和软件开中断,但IRQ不能屏蔽FIQ请求。当IRQ中断请求出现时,只有当FIQ异常和数据中止异常都没有发生时,IRQ处理程序才被调用,并屏蔽IRQ中断,直到中断源被清除。
      预取指中断会屏蔽IRQ异常,但不影响FIQ。
      当上述的所有异常都没有发生,此时系统可以处理SWI异常,cpsr会被置成管理模式。如果要实现SWI的嵌套,也要保存r14(lr)和spsr。SWI和未定义指令异常共享同一优先级,所以两者不能同时出现。

 

 

 

ARM处理器模式及异常
      每种异常都导致内核进入一种特定的模式,但用户模式和系统模式只能通过修改cpsr来进入。当异常导致模式的改变时,内核自动地:
      × 把cpsr保存到相应异常模式下的spsr        到底是切换前的spsr还是切换后的?
      × 把pc波阿存到相应地异常模式下的lr
      × 设置cpsr到相应的模式,并切换到ARM模式
      × 跳转到相应的处理程序入口
 
当异常发生时,内核会跳转到向量表的相应位置,并执行当中的指令,通常,在向量表中会存放一些B,LDR PC等跳转指令,用来跳转到对应的处理程序,下面给出一个一地址0x00000000开始的向量表例子:
                          向量表地址      模式                          指令
                         0x00000000:   RESET:                  LDR pc,[pc,#rest]
                         0x00000004:   UNDEF:                   b  undInstr
                         0x00000008:   SWI:                      ldr pc,[pc,#swi];
                         0x0000000c:   PABT:                    ldr pc,[pc,#prefetch]
                         0x00000010:   DABT:                   ldr pc,[pc,#data]
                         0x00000014:   -------:                    ldr pc,[pc,#notassigned]
                         0x00000018:    IRQ:                     ldr pc,[pc,#irq]
                         0x0000001c:    FIQ:                      ldr pc,[pc,#fiq]
 
链接寄存器偏移
 
由于ARM的流水线特性,pc在执行一条指令时,已经指向当前指令后的第二条指令,所以,当IRQ异常发生时,链接寄存器lr的值其实是最后执行的指令的地址+8.
返回时应该跳到异常处理前最后一条指令的下一条指令,所以应该返回lr-4
 
下表给出了各种异常应使用的lr偏移。
 
            异常                            地址                           用法
            复位                            -                              没有定义
            数据中止                    lr - 4                         指向导致数据中止异常的那条指令
            FIQ                              lr - 4                         FIQ处理程序的返回地址
            IRQ                             lr - 4                         IRQ处理程序的返回地址
            预取指中止                lr - 4                         指向导致预取指中止异常的那条指令
            SWI                             lr                                指向SWI指令的下一条指令
            未定义指令                lr                                指向未定义指令的下一条指令
 
      另外,如果指令以pc为目标,且有后缀s,那么cpsr将自动从spsr中恢复,可以节省指令。用LDM的后缀^也有同样的效果。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值