- 2.04 MB
- 2022-08-08 发布
- 1、本文档由用户上传,淘文库整理发布,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,请立即联系网站客服。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细阅读内容确认后进行付费下载。
- 网站客服QQ:403074932
第7章中断和异常本章重要内容1、中断和异常的基本概念2、中断(异常)服务程序的年结构3、处理器响应与处理中断(异常)的过程4、ARM的中断系统\n7.1中断和异常的基本概念中断是主机与外设进行数据通信的重要机制,它负责处理处理器外部的异常事件;异常实质上也是一种中断,只不过它主要负责处理处理器内部事件。7.1.1中断和异常1、什么叫中断\n当处理器遇有外部设备发生“紧急事件”需要它来处理时,它就必须停下“手头上的工作”先去处理这个“紧急事件”。处理器的这种工作过程,或者这种工作状态就叫做中断。2、什么叫中断请求当外部设备有紧急事件需要处理器进行处理时,外部设备必须向处理器发送一\n个电信号(脉冲或电平)来表示有事件需要处理器来处理。这个信号叫做中断请求信号,或称中断请求。3、什么叫中断源发出中断请求信号的外部设备或事件就叫做中断源。4、什么叫异常\n除了外部设备可以发出可以发出中断请求之后,处理器内部也会有一些事件可以发出中断请求,例如读取指令出错或在进行除法运算时除数为零等。为了与外部事件引起的中断相区别,人们把这种由内部事件引起的中断叫做异常。7.1.2中断请求信号的屏蔽\n处理器中用来屏蔽中断的积存器和开关如下:\n1、可屏蔽中断人们把带有开关,能阻止中断请求的中断输入端叫做可屏蔽中断信号输入端。这类中断叫可屏蔽中断。2、非屏蔽中断人们把不带开关,不能阻止中断请求的中断输入端叫做非屏蔽中断信号输入端。这类中断叫屏蔽中断。\n为了对处理器可以接收中断源的数目进行扩充及对中断进行必要的管理,在中断源和处理器之间还配有如下图所示的中断控制器。\n7.1.3中断优先级及中断嵌套1、中断优先级处理器通常只有一个可屏蔽中断请求输入端。对于具有多个中断源的系统来说,当有两个或两个以上中断源同时发生中断请求时就会出现所谓的竞争。具体实现方法有两种:硬件实现方法和软件实现方法。\n(1)硬件实现方法就是为计算机系统配备一套能按优先等级对中断源进行排队的硬件电路,以保证级别高的中断能先于级别低的中断被处理器响应。一般情况下,这个优先排队机构可能在处理器中有一套,在中断控制器中也有一套,甚至在借口电路中也会有一套。\n(2)软件实现方法就是把所有中断源的中断请求信号分成两路,其中一路经“或”逻辑送到处理器的中断请求输入端,而另一路则送入中断接口电路经数据总线送入处理器。中断源的软件查询法电路的接线如下图所示:\n软件查询法的中断服务程序的流程如下:\n\n2、中断嵌套\n7.1.4中断服务程序用来处理中断事件的程序叫做中断服务程序。中断服务程序的一般结构如下所示:\n\n中断服务程序与普通子程序的重要差别在于:中断服务程序要对中断嵌套进行必要的管理。既中断服务程序要根据需要,对程序状态寄存器中的中断允许标志进行相应的设置。7.1.5中断向量和中断向量表\n为了与普通子程序的首地址进行区分,中断服务程序的首地址通常被叫做中断向量,或中断矢量。以后还会看到,凡是能直接或间接指向中断服务程序的都叫中断向量。各种处理器如何来调用中断服务子程序的方法不尽相同,通常有两种方法。调用方法和转移方法。\n1、调用方法是在处理器收到中断中断请求之后,由中断系统硬件执行一条子程序调用指令来调用中断服务程序。2、转移方法是由中断系统硬件执行一条转移指令来转向中断服务程序。\n但是,不管哪种方法,有一点是共同的,即它们最终都需要获得中断服务程序首地址——中断向量。所有的中断向量都必须存放在一个固定的存储区域,这个集中存放了中断向量或与中断向量相关信息的存储区域就叫做中断向量表。一种中断处理硬件系统示意图如下:\n\n处理器在响应中断源2的中断时,其程序流程如下:\n7.1.6中断的处理过程1、处理器响应中断的条件处理器响应中断的条件主要有以下几个:(1)处理器程序状态寄存器的中断屏蔽标志处于非屏蔽状态。(2)没有更高级的中断中断请求正在响应或正在发出、挂起。\n(3)处理器在现行指令执行结束后。2、中断的处理器过程当有中断请求发生且满足上述条件时,计算机系统就会响应中断请求,并自动将被中断程序的下一条指令地址(断点地址)保存到堆栈和关闭中断;接下来便将自中断向量表查询得的与该中断源对应的中断向量送入PC,并转去执行中断服务程序。\n当执行到中断服务程序末尾时,执行中断返回指令或跳转指令,把保存的断点地址送回PC,以在断点处接续执行被中断的程序。\n7.2ARM的中断(异常)ARM处理器可以响应的中断(异常)有:中断、快中断、复位中断、软中断异常、预取指令中止异常、数据中止异常和未定义指令异常7种。7.2.1ARM的中断(异常)向量表1、低端和高端向量表\nARM有低端和高端两种向量表,用户可以根据需要选用其中一种,如下所示:\nARM中断(异常)的各个向量在向量表中的分配如下:中断(异常)向量在低端向量表的地址向量在高端向量表的地址复位(RESET)0x000000000xFFFF0000未定义指令(UNDEF)0x000000040xFFFF0004软中断(SWI)0x000000080xFFFF0008预取指令中止(PABT)0x0000000C0xFFFF000C数据中止(DABT)0x000000100xFFFF0010保留0x000000140xFFFF0014中断(IRQ)0x000000180xFFFF0018快中断(FIQ)0x0000001C0xFFFF001C\n处理器在响应中断(异常后),可以通过两次跳转转移到中断(异常)服务程序。两次跳转的示意图如下:\n2、中断(异常)向量表的保留项在实际应用系统中,常常会需要多个中断(异常)向量表,这时就需要利用这个保留项中数据来对这多个向量表进行区别。7.2.2ARM中断(异常)的管理ARM按事件的紧急程度为每个中断(异常)都定义了一个固定的优先级别。\nI位值F位值禁止的异常/中断中断优先级11复位(RESET)中断11-未定义指令(UNDEF)异常61-软中断(SWI)61-预取指令中止(PABT)异常51-数据中止(DABT)异常21-中断(IRQ)411快中断(FIQ)1I=1表示禁止IRQ中断;F=1表示禁止FIQ中断。\n1、普通中断(IRQ)和快中断(FIQ)外部设备的中断请求可以通过两个中断请求输入端进入处理器,其中一个是叫做IEQ的普通中断,另一个是叫做FIQ的快中断。所谓普通中断就是前面讲过的中断,而快中断就是能比普通中断响应快的中断。用下面的指令实现现场数据的压栈:\nSTMFDR13!,{R0,R4-R12,LR};压入堆栈用下面的指令将现场数据弹出:LDMFDR13!,{R0,R4-R12,PC};压入堆栈这种压栈和出栈操作都比较费时,它们增加了中断处理的延迟时间。另外,由于处理器在响应一个IRQ中断后要经历两次跳转才能转到中断服务程序,因此也增加了一些延时。\n为了减少中断延迟,ARM在普通中断IRQ的基础上又增加了一个快中断FIQ,以处理有快速要求的外设的中断。为减少延时,ARM在快中断中采取了两个措施:(1)专门为快中断FIQ设置了一个FIQ模式,并为这个模式配置了较多的私有寄存器,从而可使中断服务程序有足够的寄存\n器来使用,而不必与被中断服务程序使用同一组寄存器,这样就免去了因寄存器冲突而必需的保护及恢复现场工作。(2)ARM把FIQ的中断向量放在了中断(异常)向量表末尾0X0000001C处,因此它后面没有其它中断向量,允许用户将中断服务车工许程序直接放在这里。2、复位中断\n复位通常在两种情况下发生:(1)系统初始运行时的正常上电;(2)由程序引起的复位。复位中断的优先级别最高,当系统响应复位中断时,系统会进入ARM的管理模式(SVC模式)。3、软中断异常\nSWI是程序中使用的指令,从程序设计的角度来看,可以把它看承是一种目标地址固定为0X00000008的特殊转移指令。该指令除了目标地址为硬件提供的固定地址外,它还会在转移的同时使处理器自动进入管理模式(SVC模式),在该模式下可以访问系统中的所有资源。\n由于它是由用户在程序使用指令而产生的中断,所以叫做软中断。它也是所有中断(异常)中唯一的一个同步事件。4、预取指令中止异常和数据中止异常这是给操作系统存储管理模块准备的异常。5、未定义指令异常\n由于ARM是32位指令系统,理论上ARM可以拥有232个指令,但实际上它远远没有这么多指令。在实践中,用户通常利用这个异常中断服务程序来模拟某种硬件的功能,或自定义一些指令来完成一些特殊功能。7.2.3ARM中断(异常)运行模式\n处理器响应中断(异常)后所进入的模式如下表所示:中断(异常)进入的模式复位(RESET)管理模式(SVC)未定义指令(UNDEF)未定义指令中止模式(UND)软中断(SWI)管理模式(SVC)预取指令中止(PABT)中止模式(ABT)\n中断(异常)进入的模式数据中止(DABT)中止模式(ABT)快中断(FIQ)快中断模式(FIQ)中断(IRQ)中断模式(IRQ)续表7.2.4中断(异常)的响应过程及返回1、中断(异常)的响应过程\n当处理器响应中断(异常)请求后,系统的硬件电路一般需要先做四项准备工作:(1)把程序计数器(PC)中的当前地址值保存到连接寄存器LR中。(2)把当前程序状态寄存器(CPSR)中的内容保护到模式私有寄存器SPSR中。\n(3)将寄存器CPSR中的MODE域设置为中断(异常)应进入的运行模式。(4)对CPSR的I位和F位进行相应的设置,以防止再次响应同一个中断请求。接下来便到中断向量表中获取中断向量,转向用户所需编写的中断(异常)服务程序。下图为复位的工作过程。\n\n未定义指令响应过程:\n软中断响应过程:\n预取指令中止响应过程:\n数据访问中止异常响应过程:\nIRQ响应过程:\nFIQ的响应过程:\n2、中断(异常)处理的返回当一个中断(异常)发生时,处理器会自动在LR中保存一个与当前PC值相关的信息,中断服务程序可以利用这个信息来推算返回地址。具体如下表:异常/中断地址说明复位(RESET)--未定义指令(UNDEF)LR指向未定义指令的下一条指令软中断(SWI)LR指向SWI指令的下一条指令\n异常/中断地址说明预取指令中止(PABT)LR-4指向导致预取指令中止异常的那条指令数据中止(DABT)LR-8指向导致数据中止异常的那条指令中断(IRQ)LR-4IRQ处理程序的返回地址快中断(FIQ)R-4FIQ处理程序的返回地址续表\n异常处理完毕后之后,ARM微处理器会执行以下几步操作从异常返回:(1)将连接寄存器LR的值减去相应的偏移量后送到PC中。(2)将SPSR复制回CPSR中。(3)若在进入异常处理时设置了中断禁止位,则要在此清除。\n一个非嵌套中断的响应与处理过程如下:\n其框架代码如下:IRQ_handlerSUBR14,R14,#4STMFDR13!,{R0-R3,R12,R14}……..LDMFDR13!,{R0-R3,R12,PC}^\n作业1、什么叫中断?中断过程的发起者是中断源还是处理器?2、为什么ARM可以响应7种中断,但向量表却有8项?3、当中断处理结束时,如何根据连接寄存器LR的值推算返回地址?