异常及中断处理讲解Word文档下载推荐.docx
《异常及中断处理讲解Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《异常及中断处理讲解Word文档下载推荐.docx(21页珍藏版)》请在冰豆网上搜索。
mode>
设置适当的CPSR位:
改变处理器状态进入ARM状态
改变处理器模式进入相应的异常模式
设置中断禁止位禁止相应中断(如果需要)
保存返回地址到LR_<
设置PC为相应的异常向量
返回时,异常处理需要:
从SPSR_<
恢复CPSR
从LR_<
恢复PC
Note:
这些操作只能在ARM态执行.
当异常发生时,分组寄存器r14和SPSR用于保存处理器状态,操作伪指令如下。
R14_<
exception_mode>
=returnlink
SPSR_<
=CPSR
CPSR[4∶0]=exceptionmodenumber
CPSR[5]=0/*进入ARM状态*/
If<
==resetorFIQthen
CPSR[6]=1/*屏蔽快速中断FIQ*/
CPSR[7]=1/*屏蔽外部中断IRQ*/
PC=exceptionvectoraddress
异常返回时,SPSR内容恢复到CPSR,
连接寄存器r14的内容恢复到程序计数器PC。
注:
cortex-A8系统中支持通过设置CP15的c12寄存器将异常向量表的首地址设置在任意地址。
例如:
mcrp15,0,r0,c12,c0,0
1.复位异常
当处理器的复位引脚有效时,系统产生复位异常中断,程序跳转到复位异常中断处理程序处执行。
复位异常中断通常用在下面两种情况下。
系统上电。
系统复位。
当复位异常时,系统执行下列伪操作:
R14_svc=UNPREDICTABLEvalue
SPSR_svc=UNPREDICTABLEvalue
CPSR[4∶0]=0b10011/*进入特权模式*/
CPSR[5]=0/*处理器进入ARM状态*/
CPSR[6]=1/*禁止快速中断*/
CPSR[7]=1/*禁止外设中断*/
Ifhighvectorsconfiguredthen
PC=0xffff0000
Else
PC=0x00000000
复位异常中断处理程序的主要功能:
设置异常中断向量表。
初始化数据栈和寄存器。
初始化存储系统,如系统中的MMU等。
初始化关键的I/O设备。
使能中断。
处理器切换到合适的模式。
初始化C变量,跳转到应用程序执行。
2.未定义指令异常
当ARM处理器执行协处理器指令时,它必须等待一个外部协处理器应答后,才能真正执行这条指令。
若协处理器没有相应,则发生未定义指令异常
当未定义异常发生时,系统执行下列的伪操作:
r14_und=addressofnextinstructionaftertheundefinedinstruction
SPSR_und=CPSR
CPSR[4∶0]=0b11011/*进入未定义指令模式*/
/*CPSR[6]保持不变*/
PC=0xffff0004
PC=0x00000004
3.软中断SWI
软中断异常发生时,处理器进入特权模式,执行一些特权模式下的操作系统功能。
软中断异常发生时,处理器执行下列伪操作。
r14_svc=addressofnextinstructionaftertheSWIinstruction
PC=0xffff0008
PC=0x00000008
4.预取指令异常
预取指令异常是由系统存储器报告的。
当处理器试图去取一条被标记为预取无效的指令时,发生预取异常。
如果系统中不包含MMU时,指令预取异常中断处理程序只是简单地报告错误并退出。
若包含MMU,引起异常的指令的物理地址被存储到内存中。
预取异常发生时,处理器执行下列伪操作:
r14_svc=addressoftheabortedinstruction+4
CPSR[4∶0]=0b10111/*进入特权模式*/
CPSR[5]=0/*处理器进入ARM状态*/
CPSR[7]=1/*禁止外设中断*/
PC=0xffff000C
PC=0x0000000C
5.数据访问中止异常
数据访问中止异常是由存储器发出数据中止信号,它由存储器访问指令Load/Store产生。
当数据访问指令的目标地址不存在或者该地址不允许当前指令访问时,处理器产生数据访问中止异常。
当数据访问中止异常发生时,处理器执行下列伪操作。
r14_abt=addressoftheabortedinstruction+8
SPSR_abt=CPSR
CPSR[4∶0]=0b10111
CPSR[5]=0
PC=0xffff000C10
PC=0x00000010
当数据访问中止异常发生时,寄存器的值将根据以下规则进行修改:
①返回地址寄存器r14的值只与发生数据异常的指令地址有关,与PC值无关
②如果指令中没有指定基址寄存器回写,则基址寄存器的值不变
③如果指令中指定了基址寄存器回写,则寄存器的值和具体芯片的AbortModels有关,由芯片的生产商指定
④如果指令只加载一个通用寄存器的值,则通用寄存器的值不变
⑤如果是批量加载指令,则寄存器中的值是不可预知的值
⑥如果指令加载协处理器寄存器的值,则被加载寄存器的值不可预知
6.外部中断IRQ
当处理器的外部中断请求引脚有效,而且CPSR寄存器的I控制位被清除时,处理器产生外部中断IRQ异常。
系统中各外部设备通常通过该异常中断请求处理器服务。
当外部中断IRQ发生时,处理器执行下列伪操作。
r14_irq=addressofnextinstructiontobeexecuted+4
SPSR_irq=CPSR
CPSR[4∶0]=0b10010/*进入特权模式*/
/*CPSR[6]保持不变*/
PC=0xffff0018
PC=0x00000018
7.快速中断FIQ
当处理器的快速中断请求引脚有效且CPSR寄存器的F控制位被清除时,处理器产生快速中断请求FIQ异常。
当快速中断异常发生时,处理器执行下列伪操作。
r14_fiq=addressofnextinstructiontobeexecuted+4
SPSR_fiq=CPSR
CPSR[4∶0]=0b10001/*进入FIQ模式*/
CPSR[6]=1
CPSR[7]=1
PC=0xffff001c
PC=0x0000001c
三.ARM异常的优先级
四.ARM处理器模式和异常
ARM处理器异常及其对应的模式:
每一种异常都会导致内核进入一种特定的模式。
也可以通过编程改变CPSR,进入任何一种ARM处理器模式。
用户模式和系统模式是仅有的不可以通过异常进入的两种模式,也就是说,要进入这两张模式必须通过编程改变CPSR
五.ARM异常响应和处理程序返回
1.中断响应的概念
中断响应大致可以分为以下几个步骤:
1、保护断点,即保存下一将要执行的指令的地址,就是把这个地址送入堆栈。
Sublr,lr,#4
Stmfdsp!
{r0-r12,lr}
2、寻找中断入口,根据不同的中断源所产生的中断,查找不同的入口地址。
Blc_irq_handler
3、执行中断处理程序。
可以写在main函数中
4、中断返回:
执行完中断指令后,就从中断处返回到主程序,继续执行。
Ldmfdsp!
{r0-r12,pc}^
2.ARM异常响应流程
1.判断处理状态
2.向量表
跳转指令B的跳转范围为±
32MB,但很多情况下不能保证所有的异常处理函数都定位在向量的32MB范围内,需要更大范围的跳转,而且由于向量表空间的限制,只能由一条指令完成。
具体实现方法有下面两种。
(1)MOVPC,#imme_value这种办法将目标地址直接赋值给PC。
但这种方法受格式限制不能处理任意立即数。
这个立即数由一个8位数值循环右移偶数位得到。
(2)LDRPC,[PC+offset]把目标地址先存储在某一个合适的地址空间,然后把这个存储器单元的32位数据传送给PC来实现跳转。
这种方法对目标地址值没有要求。
但是存储目标地址的存储器单元必须在当前指令的±
4KB空间范围内。
注意:
在计算指令中引用offset数值的时候,要考虑处理器流水线中指令预取对PC值的影响。
3.从异常处理程序中返回
1.恢复被中断程序的处理器状态
PC和CPSR的恢复可以通过一条指令来实现,下面是3个例子。
MOVSPC,LR
SUBSPC,LR,#4
LDMFDSP!
,{PC}^
这几条指令是普通的数据处理指令,特殊之处在于它们把程序计数器寄存器PC作为目标寄存器,并且带了特殊的后缀“S”或“^”。
其中“S”或“^”的作用就是使指令在执行时,同时完成从SPSR到CPSR的拷贝,达到