中断异常处理流程

中断异常处理流程

ID:6933170

大小:69.00 KB

页数:6页

时间:2018-01-31

中断异常处理流程_第1页
中断异常处理流程_第2页
中断异常处理流程_第3页
中断异常处理流程_第4页
中断异常处理流程_第5页
资源描述:

《中断异常处理流程》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、计算机体系结构中,异常或者中断是处理系统中突发事件的一种机制,几乎所有的处理器都提供这种机制。异常主要是从处理器被动接受的角度出发的一种描述,指意外操作引起的异常。而中断则带有向处理器主动申请的意味。但这两种情况具有一定的共性,都是请求处理器打断正常的程序执行流程,进入特定程序的一种机制。若无特别说明,对“异常”和“中断”都不作严格的区分。本文结合经过实际验证的代码对ARM9中断处理流程进行分析,并设计出基于S3C2410芯片的外部中断处理程序。1.异常中断响应和返回系统运行时,异常可能会随时发生。当一个异常出现以后,ARM微处理器会执行以下几步操作:1)将下一条指令的地址

2、存入相应连接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行。2)将CPSR复制到相应的SPSR中。3)根据异常类型,强制设置CPSR的运行模式位。4)强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处。这些工作是由ARM内核完成的,不需要用户程序参与。异常处理完毕之后,ARM微处理器会执行以下几步操作从异常返回:1)将连接寄存器LR的值减去相应的偏移量后送到PC中。2)将SPSR复制回CPSR中。3)若在进入异常处理时设置了中断禁止位,要在此清除。这些工作必须由用户在中断处理函数中实现。为保证在ARM处理器发生异常时不至于处于未知状

3、态,在应用程序的设计中,首先要进行异常处理。采用的方式是在异常向量表中的特定位置放置一条跳转指令,跳转到异常处理程序。当ARM处理器发生异常时,程序计数器PC会被强制设置为对应的异常向量,从而跳转到异常处理程序。当异常处理完成以后,返回到主程序继续执行。可以认为应用程序总是从复位异常处理程序开始执行的,因此复位异常处理程序不需要返回。2.异常处理程序设计2.1异常响应流程由于向量表的限制,只能有一条指令B完成32MB范围内的跳转,并不能保证所有的异常处理函数都位于32MB范围内。为了扩展跳转范围,需要二次跳转才能把异常处理函数的地址传送给PC。异常处理调用关系如图1所示。三

4、星公司网站提供了test2410_r11软件包,其中2410init.s有如下代码:HandlerXXXsubsp,sp,#4;减少sp,保存跳转地址stmfdsp!,{r0};将工作寄存器压入堆栈ldrr0,=HandleXXX;将HandleXXX地址放入r0ldrr0,[r0];将中断程序入口地址放入r0strr0,[sp,#4];将中断程序入口地址压入堆栈ldmfdsp!,{r0,pc};将工作寄存器和中断程序入口地址弹出到r0和PC图1异常处理调用并且在RAM中定义了存有中断程序入口地址表_ISR_STARTADDRESS:AREARamData,DATA,REA

5、DWRITE^_ISR_STARTADDRESSHandleReset#4HandleUndef#4HandleSWI#4HandlePabort#4HandleDabort#4HandleReserved#4HandleIRQ#4HandleFIQ#4通常HandlerXXX位于程序入口地址32MB范围内,HandleXXX是以_ISR_STARTADDRESS为基地址的RAM中地址。该代码主要实现跳转功能,把异常处理程序地址HandleXXX送到PC中。例如产生IRQ中断时,PC会被强制设置为0x18,执行指令:bHandlerIRQ在HandlerIRQ程序段内,处理

6、器做一些必要的处理,就会将_ISR_STARTADDRESS表中存放的IRQ入口地址送入PC,然后开始执行相关中断程序。由于_ISR_STARTADDRESS表存放在RAM中,后面的C语言程序可以方便地更改相关中断服务程序的内容。2.2异常分支系统可能存在多个IRQ/FIQ的中断处理程序。为了从向量表入口处的跳转最终能找到正确的中断处理程序,需要设计一套处理机制和方法来实现。可以在ARM的异常向量表之外,增加一张关联中断控制器的向量表,向量表中的内容对应每个具体的中断源,可以协助跳转到不同的中断处理程序。当响应外设的一个中断请求时,首先触发ARM核的中断,进人中断程序,再通

7、过中断控制器识别中断源,使PC能够自动获得中断处理程序的地址。有的芯片支持特殊的硬件分支功能,依据中断源自动跳转到向量表的相应地址,多数情况下是用软件来处理异常分支。在S3C2410体系中,中断的调用可以看成是经历了2次“中断向量表”的查询。2410init.s中的以下代码完成功能就是查询中断偏移寄存器INTOFFSET,得到当前中断的中断号,并根据中断号再调用相关的中断服务程序。IsrIRQsubsp,sp,#4stmfdsp!,{r8-r9}ldrr9,=INTOFFSETldrr9,[r9]ldrr8,=Ha

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。