《汇编语言程序设计 -基于ARM体系结构》课件第5章异常中断及编程.ppt

上传人(卖家):momomo 文档编号:5716674 上传时间:2023-05-05 格式:PPT 页数:63 大小:435.50KB
下载 相关 举报
《汇编语言程序设计 -基于ARM体系结构》课件第5章异常中断及编程.ppt_第1页
第1页 / 共63页
《汇编语言程序设计 -基于ARM体系结构》课件第5章异常中断及编程.ppt_第2页
第2页 / 共63页
《汇编语言程序设计 -基于ARM体系结构》课件第5章异常中断及编程.ppt_第3页
第3页 / 共63页
《汇编语言程序设计 -基于ARM体系结构》课件第5章异常中断及编程.ppt_第4页
第4页 / 共63页
《汇编语言程序设计 -基于ARM体系结构》课件第5章异常中断及编程.ppt_第5页
第5页 / 共63页
点击查看更多>>
资源描述

1、教学目的掌握异常中断的基本概念掌握复位处理程序的编写方法掌握SWI异常处理程序的编写方法掌握FIQ和IRQ中断处理程序的编写方法教学内容 5.1 ARM的异常和中断 5.2 ARM异常中断的处理过程 5.3复位处理程序 5.4 SWI异常中断处理程序 5.5 FIQ和IRQ异常中断处理程序 5.6未定义指令异常中断5.1 ARM的异常和中断 5.1.1异常和中断的基本概念 5.1.2 ARM的异常中断 5.1.3 向量表 5.1.4 异常的优先级别5.1.1异常和中断的基本概念异常和中断是这样一个过程:当CPU内部或外部出现某种事件(中断 源)需要处理时,暂停正在执行的程序(断点),转去执行请

2、求中断 的那个事件的处理程序(中断服务程序),执行完后,再返回被暂停 执行的程序(中断返回),从断点处继续执行,如图5-1所示。图5-1中断示意图异常和中断的处理过程基本一致,但二者并不完全等同。ARM处理器有7种可以使正常指令顺序中止执行的异常情况:复位、未定义指令、软件中断、指令预取中止、数据中止、中断请求(IRQ)、快速中断请求(FIQ)。微机的中断系统应具有以下功能:(1)中断响应:当中断源有中断请求时,CPU能决定是否响应 该请求。(2)断点保护和中断处理:在中断响应后,CPU能保护断点,并 转去执行相应的中断服务程序。每个中断服务程序都有一 个确定的入口地址,该地址称为中断向量。(

3、3)中断优先判断:当有两个或两个以上中断源同时申请中断 时,应能给出处理的优先顺序,保证先执行优先级高的中断。(4)中断嵌套:在中断处理过程中,发生新的中断请求,CPU应 能识别中断源的优先级别,在高级的中断源申请中断时,能 中止低级中断源的服务程序,而转去响应和处理优先级较高的 中断请求,处理结束后再返回较低级的中断服务程序,这一过 程称中断嵌套或多重中断。(5)中断返回:自动返回到断点地址,继续执行被中断的程序。5.1.2 ARM的异常中断ARM处理器支持7种异常情况:复位、未定义指令、软件中断、指令预 取中止、数据中止、中断请求(IRQ)、快速中断请求(FIQ)。1复位 ARM处理器中都

4、有一个输入引脚nRESET,这是引起ARM处理器复位异常的唯一原因。一般情况下,下列原因可以引起复位。上电复位:在上电后,复位使内部达到预定状态,特别是程序 跳到初始入口。复位引脚上的复位脉冲:这是由外部其他控制信号引起的。对系统电源检测发现过压或欠压引起复位。时钟异常复位等。系统复位后,进入管理模式,一般对系统初始化。例如开中断,初始化存储器等。然后切换到用户模式,开始执行正常的用户程序。2未定义 当ARM处理器遇到不能处理的指令时,会产生未定义指令异常。ARM未定义指令异常有以下两种情况:(1)遇到一条无法执行的指令,此指令没有定义 (2)执行一条对协处理器的操作指令,但协处理器没有应答

5、在正常情况下,我们不希望发生未定义指令异常。但在有些情 况下,可以利用这个异常,把它作为一个软件中断来利用。还有一些 指令代码,这些代码没有定义,属于无效的指令代码,但是并不能引 起未定义指令异常,这些代码被准备用于ARM指令集的进一步扩展。3软件中断 软件中断是由软件中断指令(SWI)引起的。软件中断是一个 很灵活的软件功能,和子程序调用不同,软件中断把程序导入管理模 式,请求执行特定的管理功能,而正常的子程序调用属于用户模式。4中止 产生中止异常意味着对存储器的访问失败。ARM微处理器在存 储器访问周期内检查是否发生中止异常。中止异常包括指令预取中止 和数据中止两种类型。(1)指令预取中止

6、 指令预取访问存储器失败时产生的异常称为指令预取中止异常。此 时,存储器系统向ARM处理器发出存储器中止(Abort)信号,预取 的指令被记为无效,但只有当处理器试图执行无效指令时,指令预 取中止异常才会发生,如果指令未被执行,例如在指令流水线中发 生了跳转,则预取指令中止不会发生。(2)数据中止 ARM处理器访问数据存储器失败时产生的异常称为数据中止异常。此时,存储器系统向ARM处理器发出存储器中止(Abort)信号,表明数据存储器不能识别ARM处理器的读数据请求,系统的响应与 指令的类型有关。5中断请求(IRQ)IRQ异常属于正常的中断请求,可通过对处理器的nIRQ引脚输入低 电平产生,I

7、RQ的优先级低于FIQ,当程序执行进入FIQ异常时,IRQ可能 被屏蔽。若将CPSR的I位置为1,则会禁止IRQ中断,若将CPSR的I位清零,处理器会在指令执行完之前检查IRQ的输入。注意只有在特权模式下才能 改变I位的状态。6快速中断请求(FIQ)FIQ异常是为了支持数据传输或者通道处理而设计的。在ARM状态 下,系统有足够的私有寄存器,从而可以避免对寄存器保存的需求,减 小了系统上下文切换的开销。若将CPSR的F位置为1,则会禁止FIQ中断,若将CPSR的F位清 零,处理器会在指令执行时检查FIQ的输入。注意只有在特权模式下才能 改变F位的状态。可由外部通过对处理器上的nFIQ引脚输入低电

8、平产生 FIQ。5.1.3 向量表当一个异常中断发生时,处理器会把PC设置为一个特定的存储器地址。这一地址放在一个称为向量表的特定地址范围内。表5-1列出了异常向量的地址和进入模式。向量表的入口是一些跳转指令,跳转到专门处理某个异常或中断的子程序。常见的跳转指令有:(1)B 这条分支指令实现了相对于PC的分支跳转。(2)LDR PC,PC,#offset 这条寄存器装载指令把处理程序(handler)的入口地址从存储器装载到PC。(3)MOV PC,Immediate 这条MOV指令把一个立即数复制到PC。它可跨越全部的地址空间,但要注意受到地址对齐问题的限制。这个地址必须是一个由8位立即数循

9、 环右移偶数次得到的。每一个异常发生时,总是从异常向量表开始起跳的,例如:最简单的一种情况如图5-2所示。图5-2 B指令实现中断处理 向量表里面的每一条指令直接跳向对应的异常处理函数。其中 FIQ_Handler()可以直接从地址0 x1C 处开始,从而节省了一条跳转指 令,提高了FIQ的处理速度。5.1.4 异常的优先级别异常可以同时发生,当多个异常同时发生时,系统根据固定的优先级决定异常的处理次序。异常优先级由高到低的排列次序如表5-2所示。优先级最低的2种异常是:软件中断和未定义指令异常。可以通过设置CPSR中的I位 或F位来禁止某些异常,如表所示。每一种异常将按照表5-2中设置的优先

10、级得到处理。下面从最高优先级异常开始,逐一介绍这些异常是如何被处理的。复位异常是优先级最高的异常。一旦复位信号产生,总是会发生 复位异常。复位异常处理程序对系统进行初始化,包括配置存储器和 Cache。外部中断源必须在IRQ或者FIQ中断允许之前初始化,以避免在 还没有设置好相应的处理程序前产生中断。复位处理程序还要为所有处 理器模式设置堆栈指针。数据中止异常发生在存储控制器或MMU指示访问了无效的存储器 地址时,或者当前代码在没有正确的访问权限时,试图读/写存储器。由 于没有禁止FIQ异常,在一个数据中止处理程序中,可以发生FIQ异常。当FIQ服务完成后,控制权交还给数据中止处理程序。快速中

11、断请求(FIQ)异常发生在一个外部设备把内核的FIQ线置 为nFIQ时。FIQ异常是优先级最高的中断。内核在进入FIQ处理程序时,把FIQ和IRQ都禁止了,因此任何外部中断源都不能再次中断处理器,除 非在软件中重新允许了IRQ或FIQ。应该仔细设计FIQ处理程序,以便高效 地为异常处理服务。中断请求(IRQ)异常发生在一个外部设备把内核的IRQ线置为nIRQ时。IRQ异常是第二优先级中断。FIQ异常和数据中止异常都没有发生时,IRQ处理程序才能够进入。在进入IRQ处理程序时,内核禁止IRQ异常,直到当前中断源被清除。预取指中止异常即试图取指令而导致存储器访问失败的情 形。在流水线中,如果某条指

12、令的“执行”阶段没有优先级更高的异常 出现,将发生预取指中止异常。在进入相应的处理程序时,内核禁止 IRQ异常,而保持FIQ不变。如果允许了FIQ,并且发生了一个FIQ异 常,则它可在处理预取指中止过程中得到响应。软件中断(SWI)异常发生在执行SWI指令,且没有更高 优先级的异常标志置位的情况下,在进入相应的处理程序时,CPSR 将被设置成管理模式。如果系统使用嵌套SWI调用,则必须在跳转到 嵌套SWI之前,保存连接寄存器R14和SPSR的值,以免遭到破坏。5.2 ARM异常中断的处理过程 5.2.1异常中断响应过程 5.2.2异常中断的返回5.2.1异常中断响应过程当一个异常出现以后,AR

13、M微处理器会执行以下几步操作:1保存处理器当前状态、中断屏蔽位以及各条件标志位。这是通过将当前程序状态寄存器CPSR的内容复制到要执行的异常中断 对应的SPSR寄存器中实现的,各异常中断都有自己的物理SPSR寄存器。实 现这一操作的典型代码如下:SUB LR,LR,#4 ;保存中断的返回地址 STMFD SP!,LR MRS R14,SPSR ;保存状态寄存器,及其他工作寄存器 STMFD SP!,R12,R14 2设置当前程序状态寄存器CPSR中相应的位。改变处理器状态进入ARM 状态 改变处理器模式进入相应的异常模式 设置中断禁止位禁止相应中断 不管异常发生在ARM 还是Thumb 状态下

14、,处理器都将自动进入ARM 状态。如果此时处理器处于Thumb状态,则当异常向量地址加载入PC时,处理器自动切换到ARM状态。设置CPSR中的位,使处理器进入相应的执行模式(ARM处理器异常及其对应的模式如表5-3所示)。另一个需要注意的地方是中断使能被自动关闭,禁止IRQ中断,也就是说缺省情况下中断是不可重入的。当进入FIQ模式时,禁止新的FIQ中断,这是通过设置CPSR中的位来实现的。实现这一操作的典型代码如下:MRS R14,CPSR ;切换到系统模式,并使能中断BIC R14,R14,#0 x9FORR R14,R14,#Ox1F MSR CPSR_c,R14 3保存返回地址 将下一条

15、指令的地址存入相应的连接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行。若异常是从ARM状态进入,LR寄存器中保存的是下一条指令的 地址(当前PC4或PC8,与异常的类型有关);若异常是从Thumb 状态进入,则在LR寄存器中保存当前PC的偏移量,这样,异常处理程 序就不需要确定异常是从何种状态进入的。典型的代码如下:STMFD SP!,R0-R3,LR 4执行中断处理程序 强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应 的异常处理程序处。典型的代码如下:BL C_irq_handler ;跳转到C语言的中断处理程序 5.2.2异常中断的返回从异常中断的程序中返回

16、包括下面三个基本操作:1.恢复通用寄存器中的值 通用寄存器的恢复采用一般的堆栈操作指令。2.恢复状态寄存器的值 恢复被中断程序的处理器状态,将SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。3.修改PC的值 使得程序能返回到发生异常中断指令的下一条指令处执行,将LR_mode寄存器的内容复制到程序计数器PC中。PC 和CPSR 的恢复可以通过下面是3 个指令中的一条指令来实现:MOVS pc,lr SUBS pc,lr,#4 LDMFD sp!,pc前面提到进入异常时处理器会有一个保存LR的动作,但是该保存值并 不一定是正确中断的返回地址。下面以ARM处理器3级流水线结构为 例

17、,对此加以说明。实际上,当异常中断发生时,程序计数器PC所指的位置对于各种不 同的异常中断是不同的。同样,返回地址对于各种不同的异常中断也 是不同的。当异常发生时,程序计数器总是指向返回位置的下一条指 令,如图5-3所示。从图5-3可以看出,当程序执行完第1条指令(地址0 x8000)发生跳转时,程序计数器PC正指向第3条指令(地址0 x8008)。在执行完中断服务程序返回时,PC应该指向第2条指令(地址0 x8004)。第1条指令执行时,处理器硬件会自动把把PC(=0 x8008)保存 到LR 寄存器里面,但是接下去处理器会马上对LR 进行一个自动的调 整动作:LR=LR-0 x4。这样,最

18、终保存在LR里面的是第2条指令的地 址,所以当从中断程序返回时,LR 里面正好是正确的返回地址。由 于各种异常中断响应的过程不同,因此,保存在LR中的地址是不相同 的。大多数情况下保存在LR中的地址值是:LR保存的值=PC值4 因为保存在LR中的地址值是不同的,因而,不同的异常中断返 回时的指令也不同。表5-4给出了推荐的中断返回指令,从指令中可以知道保存在LR中的地址值。下面详细说明各类异常中断的返回过程:1SWI和未定义指令异常中断处理程序的返回 SWI和未定义指令异常中断是由当前执行的指令自身产生的,当SWI和未定义指令异常中断产生时,程序计数器PC的值还未更新,它指向当前指令后面第2条

19、指令(对于ARM指令来说,它指向当前指 令地址加8个字节的位置;对于Thumb指令来说,它指向当前指令地 址加4个字节的位置)。当SWI和未定义指令异常中断发生时,处理 器将值(PC-4)保存到异常模式下的寄存器LR_mode中。这时(PC-4)即指向当前指令的下一条指令。如图5-4所示。图5-4 SWI的返回地址 因此返回操作可以通过下面的指令来实现:MOV PC,LR 2IRQ和FIQ异常中断处理程序的返回 通常处理器执行完当前指令后,查询IRQ中断引脚及FIQ中断引 脚,并且查看系统是否允许IRQ中断及FIQ中断。如果有中断引脚有 效,并且系统允许该中断产生,处理器将产生IRQ异常中断或

20、FIQ异 常中断。当IRQ和FIQ异常中断产生时,程序计数器PC的值已经更 新,它指向当前指令后面第3条指令(对于ARM指令来说,它指向当 前指令地址加12个字节的位置;对于Thumb指令来说,它指向当前指 令地址加6个字节的位置)。当IRQ和FIQ异常中断发生时,处理器将 值(PC-4)保存到异常模式下的寄存器LR_mode中。这时(PC-4)即 指向当前指令后的第2条指令,如图5-5所示。图5-5 IRQ/FIQ的返回地址因此返回操作可以通过下面的指令来实现:SUBS PC,LR,#43指令预取中止异常中断处理程序的返回 在指令预取时,如果目的地址是非法的,该指令将被记成有问题的指令。指令

21、预取中止异常是由当前执行的指令自身产生的,当指令预取 中止异常产生时,程序计数器PC的值还未更新,它指向当前指令后面第 2条指令(对于ARM指令来说,它指向当前指令地址加8个字节的位置;对于Thumb指令来说,它指向当前指令地址加4个字节的位置)。当指令 预取中止异常发生时,处理器将值(PC-4)保存到异常模式下的寄存器 LR_mode中。这时(PC-4)即指向当前指令的下一条指令,如图5-6所示。图5-6 指令预取异常返回地址 因此返回操作可以通过下面的指令来实现:SUBS PC,LR,#4 该指令将寄存器LR中的值减4后,复制到程序计数器PC中,实现程序的返回,同时将SPSR_mode寄存

22、器内容复制到当前程序状态寄存器CPSR中。4数据访问中止异常中断处理程序的返回 当发生数据访问中止异常中断时,程序要返回到该有问题的数据 访问处,重新访问该数据。因此数据访问中止异常中断处理程序应该 返回到产生该数据访问中止异常中断的指令处,而不是像前1、2两种 情况下返回到发生中断的指令的下一条指令。数据访问中止异常中断是由数据访问指令指令自身产生的,当数 据访问中止异常产生时,程序计数器PC的值已经更新,它指向当前 指令后面第3条指令(对于ARM指令来说,它指向当前指令地址加12 个字节的位置)。当指令预取中止异常发生时,处理器将值(PC-4)保存到异常模式下的寄存器LR_mode中。这时

23、(PC-4)即指向当前指令 的第二条指令,如图5-7所示。图5-7 数据访问异常的返回地址因此返回操作可以通过下面的指令来实现:SUBS PC,LR,#85.3复位处理程序 5.3.1复位 5.3.2复位处理编程5.3.1复位 ARM处理器中都有一个输入引脚nRESET,这是引起ARM处理 器复位异常的唯一原因。ARM处理器复位是由外部复位逻辑引起的,有些复位可以使用软件进行控制。复位对系统影响很大,复位后,内 部寄存器重新恢复默认值,ARM内部的数据有可能丢失,而有些寄存 器的值是不确定的。一般情况下,下列原因可以引起复位。上电复位:在上电后,复位使内部达到预定状态,特别是程序 跳到初始入口

24、。复位引脚上的复位脉冲:这是由外部其他控制信号引起的。对系统电源检测发现过压或欠压。时钟异常复位等。系统复位后,进入管理模式,一般对系统初始化,具体内容与具 体系统相关,然后程序控制权交给应用程序,因而复位异常中断处理 程序不需要返回。5.3.2复位处理编程复位异常中断处理程序通常进行如下一些处理:将处理器切换到管理模式 初始化存储系统,如系统中的MMU等。初始化一些关键的I/O设备 设置异常中断向量表。初始化数据栈和寄存器。使用中断 初始化C语言环境变量,跳转到应用程序执行。例 5.1 下面是一个基于S3C2410芯片的复位处理程序 AREA STARTUP,CODE,READONLY EN

25、TRY CODE32 ;/*;*;*功能描述:初始化程序入口点 ;*;*START B INT_Reset LDR PC,Undefined_Addr LDR PC,SWI_Addr LDR PC,Prefetch_Addr LDR PC,Abort_Addr NOP LDR PC,IRQ_Addr LDR PC,FIQ_Addr EXPORT INT_Reset INT_Reset MRS R0,CPSR ;模式转换为管理模式,BIC R0,R0,#MODE_MASK ORR R0,R0,#MODE_SVC ORR R0,R0,#INTLOCK MSR CPSR_cxsf,R0 LDR R0

26、,=INTMSK ;硬件屏蔽中断 LDR R1,=0 xFFFFFFFF STR R1,R0,#0 LDR R0,=WTCON ;屏蔽看门狗 LDR R1,=0 x0 STR R1,R0 LDR R0,=LOCKTIME ;PLL稳定输出时间 LDR R1,=0 xffffff STR R1,R0 LDR R0,=MPLLCON ;设置CPU工作频率 LDR R1,=0X70022 ;Fin=10MHz,Fout=90MHz STR R1,R0 MOV R0,#0 ;关闭MMU MCR p15,0,R0,c1,c0,0 LDR R0,=BWSCON ;设置内存控制寄存器,LDR R1,=0X2

27、2111110 ;配置内存参数,初始化内存 STR R1,R0 INT_IRQ_Vectors ;设置异常中断向量表 DCD INT_EINT0_Shell ;Vector 00 DCD 0 ;Vector 01 DCD 0 ;Vector 02 ;初始化堆栈 LDR SP,=SYS_STACK ;初始化Sys模式下的堆栈 MRS R0,CPSR ;初始化IRQ模式下的堆栈 BIC R0,R0,#MODE_MASK ORR R0,R0,#MODE_IRQ MSR CPSR_cxsf,R0 LDR SP,=IRQ_STACK MRS R0,CPSR ;转回系统模式,并使能中断标志位 ;*;C语言

28、的调用(跳至应用程序);*IMPORT C_Entry B C_Entry 分析:通过以上例子可以知道复位处理程序的基本过程如下:一旦复位发生,处理器便开始执行地址0 x00000000处的指令 B INT_Reset,随即跳转到复位处理程序INT_Reset处,该程 序首先将模式转换为管理模式,接下来对硬件做一些初始化工 作,如看门狗、工作频率设置、内存设置等等,具体的芯片不 同,这些参数的设置也不同,上例给出了三星公司的基于 ARM9内核的S3C2410芯片初始化的简单例子。初始化工作完 成后程序跳转到C语言程序实现某个具体的应用。5.4 SWI异常中断处理程序 5.4.1SWI异常中断处

29、理程序的实现 5.4.2 SWI异常中断调用5.4.1SWI异常中断处理程序的实现 通过SWI异常中断,用户模式的应用程序可以调用系统模式下的 代码。在实时操作系统中,通常使用SWI异常中断为用户应用程序提 供系统功能。在SWI指令中包含一个24位立即数,该立即数指示了用户请求的 特定SWI功能。在SWI异常中断处理程序要读取该24位立即数,这涉及到SWI异 常模式下对寄存器LR的读取,并且要从存储器读取该SWI指令。这样 需要使用汇编程序来实现。SWI的处理过程如图5-8所示 图5-8 SWI处理过程 通常SWI异常中断处理程序分为两级:第1级SWI异常中断处理 程序为汇编程序,用于确定SW

30、I指令中的24位的立即数;第2级SWI 异常中断处理程序具体实现SWI的各个功能,它可以是汇编程序,也 可以是C程序。1第1级SWI异常中断处理程序 第1级SWI异常中断处理程序从存储器中读取该SWI指令。在进入 SWI异常中断处理程序时,LR寄存器中保存的是该SWI指令的下一条 指令。LDR R0,LR,#-4 下面的指令,从该SWI指令中读取其中的24位立即数。BIC R0,R0,#0 xFF000000 综合上面所述,例5.2程序是一个第1级SWI异常中断处理程序的模板。例 5.2 1级SWI异常中断处理程序模板 AREA ToplevelSwi,CODE,READONLY ;定义该段代

31、码的名称和属性 EXPORT SWI_Handler SWI_Handler STMFD SP!,R0-R12,LR ;保存用到的寄存器 LDR R0,LR,#-4 ;计算该SWI指令的地址,;并把它读取到寄存器R0中 BIC R0,R0,#0 xFF000000 ;将SWI指令中的24位立即数 ;存放到R0寄存器中 ;使用R0寄存器中的值,调用相应的SWI异常中断的第2级处理程序 LDMFD SP!,R0-R12,PC ;恢复使用到的寄存器,并返回 END2.使用汇编程序的第2级SWI异常中断处理程序 可以使用跳转指令,根据由第1级中断处理程序得到的SWI指令中的立即 数的值,直接跳转到实现

32、相应SWI功能的处理程序。例 5.3 2级的SWI异常中断处理程序为汇编语言程序的例子 CMP R0,MaxSWI ;判断R0寄存器中的立即数值是否超过允许的最大值 LDRLS PC,PC,R0,LSL#2 B SWIOutOfRange SWIJumpTable DCD SWInum0 DCD SWInum1 ;其他的DCD SWInum0 ;立即数为0对应的SWI中断处理程序 B EndofSWI SWInum1 ;立即数为1对应的SWI中断处理程序 B EndofSWI ;其他的SWI中断处理程序 EndofSWI ;结束中断处理程序 将例5.3程序代码嵌入在程序例5.2中,组成一个完整

33、的SWI异常中断处理程序。3使用C程序的第2级SWI异常中断处理程序 第2级SWI异常中断处理程序可以是C程序。这时,利用从第1级 SWI异常中断处理程序得到的SWI指令中的24位立即数来跳转到相应 的处理程序。例 5.4 C程序类型的SWI异常中断第2级中断处理程序模板 void C_SWI_handler(unsigned number)switch(number)case 0:/*SWI号为0时执行的代码*/break;case1:/*SWI号为1时执行的代码*/break;/*各种SWI号执行的代码*/default:/*无效的SWI号时执行的代码*/在程序中,将得到的SWI指令中的2

34、4位立即数(称为SWI功能 号)保存在寄存器RO中。根据ATPCS,1级中断处理程序可以通过指令BL C_SWI_Handler 来调用程序中的代码,从而组成一个完整的SWI异常中断处理程序,如例5.5程序所示。例 5.5 第2级中断处理程序为C程序的SWI异常中断处理程序 AREA TopLevelSwi,CODE,READONLY;定义该段代码的名称和属性 EXPORT SWI_Handler IMPORT C_SWI_Handler SWI_Handler STMFD SP!,R0-R12,LR ;保存用到的寄存器 LDR R0,LR,#-4 ;计算该SWI指令的地址,并把它读取 到寄存

35、器R0中 BIC R0,R0,#0 xFF000000 ;将SWI指令中的24 位立即数存放到 R0寄存器中 BL C_SWI_Handler ;调用相应的SWI异常中断的第2级处理程序 LDMFD SP!,R0-R12,PC ;恢复使用到的寄存器,并返回 END 如果第1级的SWI异常中断处理程序将其栈指针做为第二参数传递给C程 序类型的第2级中断处理程序,就可以实现在两级中断处理程序之间传递参 数。这时C程序类型的第2级中断处理程序函数原型如下所示,其中参数reg是SWI异常中断第1级中断处理程序传递来得数据栈指针。Void C_SWI_handler(unsigned number,un

36、signed*reg)在第1级的SWI异常中断处理程序调用第2级中断处理程序的操作如下:MOV R1,SP ;设置C程序将使用的第二个参数,;根据ATPCS第二个参数保存在寄存器R1中 BL C_SWI_Handler ;调用C程序 在第2级中断处理程序,可以通过下面的操作读取参数,这些参数是在 SWI异常中断产生时各寄存器的值,这些寄存器值可以保存在SWI异常中断对应的数据栈中。value_in_reg_0=reg0 value_in_reg_1=reg1 value_in_reg_2=reg2 value_in_reg_3=reg3 在第2级中断处理程序可以通过下面的操作返回结果:reg0

37、=updated_value_0 reg1=updated_value_1 reg2=updated_value_2 reg3=updated_value_35.4.2 SWI异常中断调用1在特权模式下调用SWI 执行SWI指令后,系统将会把CPSR寄存器的内容保存到寄存器 SPSR_svc中,将返回地址保存到寄存器LR_svc中。这样如果在执行 SWI指令时,系统已经处于特权模式下,这时寄存器SPSR_svc和寄 存器LR_svc中的内容就会被破坏。因此如果在特权模式下调用SWI功 能(即执行SWI指令),比如在一个SWI异常中断程序中执行SWI指令,就必须将原始的寄存器SPSR_svc和寄

38、存器LR_svc中的值保存在数据 栈中。例5.6程序说明了在SWI中断处理程序中如何保存寄存器SPSR_svc 和寄存器LR_svc的值。例 5.6 SWI中断处理程序中如何保存寄存器SPSR_svc和寄存器LR_svc的值 STMFD SP!,R0-R12,LR ;保存寄存器,包括寄存器LR_svc MOV R1,SP ;保存SPSR_svc MRS R0,SPSR STMFD SP!,R0 LDR R0,LR,#-4 ;读取SWI指令 BIC R0,R0,#0 xFF000000 ;计算SWI指令中的24位立即数 ;并将其存放到R0寄存器中 BL C_SWI_Handler ;调用C_SW

39、I_Handler程序完成相应 的SWI功能 LDMFD SP!,R0 ;恢复SPSR_svc的值 MSR SPSR_cf,R0 LDMFD SP!,R0-R12,PC ;恢复使用到的寄存器,并返回 END2.从应用程序中调用SWI 这里分为两种情况考虑从应用程序中调用特定的SWI功能:一种考虑使用汇编指令调用特定的SWI功能;一种考虑从C程序中调用特定的SWI功能。使用汇编指令调用特定的SWI功能比较简单,将需要的参数按照 APTCS的要求放在相应的寄存器中,然后在指令SWI中指定相应24位 立即数(指定想要调用的SWI功能号)即可。例5.7的例子中,SWI中 断处理程序需要的参数放在R0中

40、,这里该参数值为100,然后调用功能 号为0 x0的SWI功能调用。MOV R0,#100 SWI 0 x0从C程序中调用特定的SWI功能比较复杂,因为这时需要将一个C程 序的子程序调用映射到一个SWI异常中断处理程序。这些被映射的C语 言子程序使用编译器伪操作_SWI来声明。3.从应用程序中动态调用SWI 在有些情况下,直到运行时才能够确定需要调用的SWI功能号。这时,有两种方法处理这种情况。第1种方法是在运行时得到SWI功能号,然后构造出相应的SWI指令的编码,把这个指令的编码保存在某个存储单元中,执行该指令 即可。第2种方法使用一个通用的SWI异常中断处理程序,将运行时需 要调用的SWI

41、功能号作为参数传递给该通用的SWI异常中断处理程 序,通用的SWI异常中断处理程序根据参数值调用相应的SWI处理程 序完成需要的操作。在操作系统中通常使用一个SWI功能号和一个寄存器来提供很多的SWI功能调用。这样可以将其他的SWI功能号留给用户使用。例 5.8 从应用程序动态调用SWI的例子 ifdef _thumb#define SemiSWI 0 xAB /*Thumb的semihosting SWI号为0 xAB*/else#define SemiSWI 0 x123456 /*ARM的semihosting SWI号为0 x123456*/#endif /*使用Semihosting

42、 SWI输出一个字符*/_swi(SemiSWI)void Semihosting(unsigned op,char*c);#define WriteC(c)Semihosting(0 x3,c)void write_a_character(int ch)char tempch=ch;WriteC(&tempch);5.5 FIQ和IRQ异常中断处理程序 5.5.1 IRQ/FIQ中断处理机制 5.5.2 IRQ/FIQ异常中断处理程序 5.5.3 IRQ异常中断处理程序举例5.5.1 IRQ/FIQ中断处理机制ARM提供的FIQ和IRQ异常中断用于外部设备向CPU请求中断服务。这两个异常中断

43、的引脚都是低电平有效的。当前程序状态寄存器CPSR的I控制位可以屏蔽这个异常中断请求:当程序状态寄存器CPSR中的I控制位为1时,FIQ和IRQ异常中断 被屏蔽;当程序状态寄存器CPSR中的I控制位为0时,CPU正常响应FIQ 和IRQ异常中断请求。FIQ异常中断为快速异常中断,它比IRQ异常中断优先级高,这主要 表现在下面的两个方面:当FIQ和IRQ异常中断同时产生时,CPU先处理FIQ异常中断。在FIQ异常中断处理程序中IRQ异常中断被禁止。由于FIQ异常中断通常用于系统中对于响应时间要求比较苛刻的任 务,ARM体系在设计上有一些特别的安排,以尽量减少FIQ异常中断 的响应时间。FIQ异常

44、中断的中断向量为0 x1C,位于中断向量表的最 后。这样FIQ异常中断处理程序可以直接放在地址0 x1C开始的存储单 元,这种安排省掉了中断向量表中的跳转指令,从而也就节省了中断 响应的时间。当系统中存在Cache时,可以把FIQ异常中断向量以及处 理程序一起锁定在Cache中,从而大大地提高了FIQ异常中断的响应时 间。除此之外,与其他模式相比,FIQ异常模式还有额外的5个物理寄 存器,这样在进入FIQ处理程序时可以不用保存这5个寄存器,从而也 提高了FIQ异常中断的执行速度。IRQ和FIQ中断处理机制如图5-9所示,ARM内核只有二个外部中断输 入信号nFIQ 和nIRQ,但对于一个系统来

45、说,中断源可能多达几十 个。为此,在系统集成的时候,一般都会有一个异常控制器来处理异 常信号。用户程序可能存在多个IRQ/FIQ 的中断处理函数,为了从向 量表开始的跳转最终能找到正确的处理函数入口,需要设计一套处理 机制和方法。通常可以从硬件和软件两个角度考虑。图5-9中断处理机制 有的系统在ARM 的异常向量表之外,又增加了一张由中断控制器 控制的特殊向量表。当由外设触发一个中断以后,PC 能够自动跳到这 张特殊向量表中去,特殊向量表中的每个向量空间对应一个具体的中断 源。例如,假设某系统一共有20 个外设中断源,特殊向量表被直接放置 在普通向量表后面。如图5-10所示。图5-10 额外的

46、硬件异常向量表 当某个外部中断触发之后,首先触发ARM 的内核异常,中断控制 器检测到ARM 的这种状态变化,再通过识别具体的中断源,使PC 自 动跳转到特殊向量表中的对应地址,从而开始一次异常响应。需要检 查具体的芯片说明,是否支持这类特性。多数情况下是用软件来处理异常分支。如图5-11所示,因为软件 可以通过读取中断控制器来获得中断源的详细信息。图5-11 软件控制中断分支 因为软件设计的灵活性,用户可以设计出比上图更好的流程控制方法来。如图5-12所示,用户可以自定义向量表来实现中断的处理程序。图5-12 用户自定义向量表5.5.2 IRQ/FIQ异常中断处理程序可重入的异常中断处理程序

47、:在有些IRQ/FIQ异常中断处理程序中,允许新的IRQ/FIQ异常中断,这时将需要一些特别的操 作保证“老的”异常中断的寄存器不会被“新的”异常中断 破坏,这种IRQ/FIQ异常中断处理程序称为可重入的异 常中断处理程序(reentrant interrupt handler)。1不可重入的IRQ/FIQ异常中断处理程序 对于C语言不可重入的IRQ/FIQ异常中断处理程序可以使用关键 词_irq来说明。关键词_irq可以实现下面的操作:保存ATPCS规定的被破坏的寄存器 保存其他中断处理程序中用到的寄存器 同时将(LR-4)赋与程序计数器PC实现中断处理程序的返 回,并且恢复CPSR寄存器的

48、内容。当IRQ/FIQ异常中断处理程序调用了子程序时,关键词_irq可以使 IRQ/FIQ异常中断处理程序返回时从其数据栈中读取LR_irq值,并通过 SUBS PC,LR,#4实现返回。例 5.9 关键字_irq的作用 第1个程序使用关键词_irq声明 _irq void IRQHandle(void)volatile unsigned int base=(unsigned int*)0 x80000000;if(*base=1)C_int_handler();/调用相应的C语言处理程序 *(base+1)=0;第一个C语言程序对应的汇编语言程序如下:IRQHandler PROC STMF

49、D SP!,R0-R4,R12,LR MOV R4,#0 x80000000 LDR R0,R4,#0 SUB SP,SP,#4 ;CMP R0,#1 BLEQ C_int _handler MOV R0,#0 STR R0,R4,#4 ADD SP,SP,#4 LDMFD SP!,R0-R4,R12,LR SUBS PC,LR,#4 ENDP EXPORT IRQHandler 第2个程序没有使用关键词_irq声明 irq void IRQHandle(void)volatile unsigned int base=(unsigned int*)0 x80000000;if(*base=1)

50、C_int_handler();/调用相应的C语言处理程序 *(base+1)=0;第2个C语言程序对应的汇编语言程序如下:IRQHandler PROC STMFD SP!,R0-R4,R12,LR MOV R4,#0 x80000000 LDR R0,R4,#0 CMP R0,#1 BLEQ C_int _handler MOV R0,#0 STR R0,R4,#4 LDMFD SP!,R0-R4,R12,LR ENDP2可重入的IRQ/FIQ异常中断处理程序 如果在可重入的IRQ/FIQ异常中断处理程序中调用了子程序,子程序 的返回地址将被保存到寄存器LR_irq中,这时如果发生了IRQ

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

当前位置:首页 > 大学
版权提示 | 免责声明

1,本文(《汇编语言程序设计 -基于ARM体系结构》课件第5章异常中断及编程.ppt)为本站会员(momomo)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|