异常及中断处理讲解.docx

上传人:b****3 文档编号:1486997 上传时间:2022-10-22 格式:DOCX 页数:21 大小:356.02KB
下载 相关 举报
异常及中断处理讲解.docx_第1页
第1页 / 共21页
异常及中断处理讲解.docx_第2页
第2页 / 共21页
异常及中断处理讲解.docx_第3页
第3页 / 共21页
异常及中断处理讲解.docx_第4页
第4页 / 共21页
异常及中断处理讲解.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

异常及中断处理讲解.docx

《异常及中断处理讲解.docx》由会员分享,可在线阅读,更多相关《异常及中断处理讲解.docx(21页珍藏版)》请在冰豆网上搜索。

异常及中断处理讲解.docx

异常及中断处理讲解

一.ARM异常中断处理概述

1、中断的概念

中断是一个过程,是CPU在执行当前程序的过程中因硬件或软件的原因插入了另一段程序运行的过程。

因硬件原因引起的中断过程的出现是不可预测的,即随机的,而软中断是事先安排的。

2、中断源的概念

我们把可以引起中断的信号源称之为中断源。

3、中断优先级的概念

ARM处理器中有7种类型的异常,按优先级从高到低的排列如下:

复位异常(Reset)、数据异常(DataAbort)、快速中断异常(FIQ)、外部中断异常(IRQ)、预取异常(PrefetchAbort)、软件中断(SWI)和未定义指令异常(Undefinedinstruction)

二.ARM体系异常种类

下面是ARM的7种异常

当异常发生时,处理器会把PC设置为一个特定的存储器地址。

这一地址放在被称为向量表(vectortable)的特定地址范围内。

向量表的入口是一些跳转指令,跳转到专门处理某个异常或中断的子程序。

当异常产生时,ARMcore:

拷贝CPSR到SPSR_

设置适当的CPSR位:

改变处理器状态进入ARM状态

改变处理器模式进入相应的异常模式

设置中断禁止位禁止相应中断(如果需要)

保存返回地址到LR_

设置PC为相应的异常向量

返回时,异常处理需要:

从SPSR_恢复CPSR

从LR_恢复PC

Note:

这些操作只能在ARM态执行.

当异常发生时,分组寄存器r14和SPSR用于保存处理器状态,操作伪指令如下。

R14_=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[5]=0/*处理器进入ARM状态*/

/*CPSR[6]保持不变*/

CPSR[7]=1/*禁止外设中断*/

Ifhighvectorsconfiguredthen

PC=0xffff0004

Else

PC=0x00000004

3.软中断SWI

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

软中断异常发生时,处理器执行下列伪操作。

r14_svc=addressofnextinstructionaftertheSWIinstruction

SPSR_und=CPSR

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

CPSR[5]=0/*处理器进入ARM状态*/

/*CPSR[6]保持不变*/

CPSR[7]=1/*禁止外设中断*/

Ifhighvectorsconfiguredthen

PC=0xffff0008

Else

PC=0x00000008

4.预取指令异常

预取指令异常是由系统存储器报告的。

当处理器试图去取一条被标记为预取无效的指令时,发生预取异常。

如果系统中不包含MMU时,指令预取异常中断处理程序只是简单地报告错误并退出。

若包含MMU,引起异常的指令的物理地址被存储到内存中。

预取异常发生时,处理器执行下列伪操作:

r14_svc=addressoftheabortedinstruction+4

SPSR_und=CPSR

CPSR[4∶0]=0b10111/*进入特权模式*/

CPSR[5]=0/*处理器进入ARM状态*/

/*CPSR[6]保持不变*/

CPSR[7]=1/*禁止外设中断*/

Ifhighvectorsconfiguredthen

PC=0xffff000C

Else

PC=0x0000000C

5.数据访问中止异常

数据访问中止异常是由存储器发出数据中止信号,它由存储器访问指令Load/Store产生。

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

当数据访问中止异常发生时,处理器执行下列伪操作。

r14_abt=addressoftheabortedinstruction+8

SPSR_abt=CPSR

CPSR[4∶0]=0b10111

CPSR[5]=0

/*CPSR[6]保持不变*/

CPSR[7]=1/*禁止外设中断*/

Ifhighvectorsconfiguredthen

PC=0xffff000C10

Else

PC=0x00000010

当数据访问中止异常发生时,寄存器的值将根据以下规则进行修改:

①返回地址寄存器r14的值只与发生数据异常的指令地址有关,与PC值无关

②如果指令中没有指定基址寄存器回写,则基址寄存器的值不变

③如果指令中指定了基址寄存器回写,则寄存器的值和具体芯片的AbortModels有关,由芯片的生产商指定

④如果指令只加载一个通用寄存器的值,则通用寄存器的值不变

⑤如果是批量加载指令,则寄存器中的值是不可预知的值

⑥如果指令加载协处理器寄存器的值,则被加载寄存器的值不可预知

6.外部中断IRQ

当处理器的外部中断请求引脚有效,而且CPSR寄存器的I控制位被清除时,处理器产生外部中断IRQ异常。

系统中各外部设备通常通过该异常中断请求处理器服务。

当外部中断IRQ发生时,处理器执行下列伪操作。

r14_irq=addressofnextinstructiontobeexecuted+4

SPSR_irq=CPSR

CPSR[4∶0]=0b10010/*进入特权模式*/

CPSR[5]=0/*处理器进入ARM状态*/

/*CPSR[6]保持不变*/

CPSR[7]=1/*禁止外设中断*/

Ifhighvectorsconfiguredthen

PC=0xffff0018

Else

PC=0x00000018

7.快速中断FIQ

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

当快速中断异常发生时,处理器执行下列伪操作。

r14_fiq=addressofnextinstructiontobeexecuted+4

SPSR_fiq=CPSR

CPSR[4∶0]=0b10001/*进入FIQ模式*/

CPSR[5]=0

CPSR[6]=1

CPSR[7]=1

Ifhighvectorsconfiguredthen

PC=0xffff001c

Else

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的拷贝,达到

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1