ARM异常中断处理及编程.ppt

上传人:m**** 文档编号:568591119 上传时间:2024-07-25 格式:PPT 页数:97 大小:412.01KB
返回 下载 相关 举报
ARM异常中断处理及编程.ppt_第1页
第1页 / 共97页
ARM异常中断处理及编程.ppt_第2页
第2页 / 共97页
ARM异常中断处理及编程.ppt_第3页
第3页 / 共97页
ARM异常中断处理及编程.ppt_第4页
第4页 / 共97页
ARM异常中断处理及编程.ppt_第5页
第5页 / 共97页
点击查看更多>>
资源描述

《ARM异常中断处理及编程.ppt》由会员分享,可在线阅读,更多相关《ARM异常中断处理及编程.ppt(97页珍藏版)》请在金锄头文库上搜索。

1、第第7章章ARM异常中断处理及编程异常中断处理及编程 7.1ARM异常中断处理概述异常中断处理概述7.2ARM体系异常中断种类体系异常中断种类7.3ARM应用系统中异常中断处理程序的安装应用系统中异常中断处理程序的安装7.4ARM的的SWI异常中断处理程序设计异常中断处理程序设计7.5FIG和和IRQ异常中断程序设计异常中断程序设计7.6基于基于ARM9芯片芯片S3C2410异常中断程序设计异常中断程序设计第第7章章ARM异常中断处理及编程异常中断处理及编程 本章的主要内容:本章的主要内容:ARMARM异常中断处理概述异常中断处理概述异常中断的进入与退出异常中断的进入与退出 应用程序中异常中断

2、处理程序的安装应用程序中异常中断处理程序的安装SWISWI异常中断处理程序异常中断处理程序FIQFIQ和和IRQIRQ异常中断处理程序异常中断处理程序复位异常中断处理程序复位异常中断处理程序未定义异常中断未定义异常中断指令预取中止异常中断处理程序指令预取中止异常中断处理程序数据访问中止异常中断处理程序数据访问中止异常中断处理程序第第7章章ARM异常中断处理及编程异常中断处理及编程 7.1 ARM7.1 ARM异常中断处理概述异常中断处理概述ARMARM异常中断处理需要实现中断的响应、解析跳转和返回等异常中断处理需要实现中断的响应、解析跳转和返回等操操 作,以便支持上层应用程序的开发。作,以便支

3、持上层应用程序的开发。当异常中断发生时,系统执行完当前指令后,将跳转到相应当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。的异常中断处理程序处执行。当异常中断处理程序执行完成后,程序返回到发生中断的指当异常中断处理程序执行完成后,程序返回到发生中断的指令的下一条指令处执行。令的下一条指令处执行。进入异常中断处理程序时,要保存被中断的程序的执行现进入异常中断处理程序时,要保存被中断的程序的执行现 场。从异常中断处理程序退出时,要恢复被中断的程序的执行场。从异常中断处理程序退出时,要恢复被中断的程序的执行现场。现场。ARMARM体系中常在存储地址的低端固化了一个体系中

4、常在存储地址的低端固化了一个3232字节的硬件中字节的硬件中断向量表,用来指定各异常中断及其处理程序的对应关系。断向量表,用来指定各异常中断及其处理程序的对应关系。第第7章章ARM异常中断处理及编程异常中断处理及编程 当一个异常出现后,当一个异常出现后,ARMARM微处理器执行以下操作:微处理器执行以下操作:(1 1)保存处理器当前状态、中断屏蔽位以及各条件标志位;)保存处理器当前状态、中断屏蔽位以及各条件标志位; (2 2)设置当前程序状态寄存器)设置当前程序状态寄存器CPSRCPSR中相应的位;中相应的位; (3 3)将寄存器)将寄存器lr_mode设置成返回地址;设置成返回地址; (4

5、4)将程序计数器)将程序计数器(PC)(PC)值设置成该异常中断的中断向量地址,值设置成该异常中断的中断向量地址,从而跳转到相应的异常中断处理程序处执行。从而跳转到相应的异常中断处理程序处执行。 接收到中断请求后,接收到中断请求后,ARMARM处理器内核会自动执行以上四处理器内核会自动执行以上四步,程序计数器步,程序计数器PCPC总是跳转到相应的固定地址。总是跳转到相应的固定地址。从异常中断处理程序中返回:从异常中断处理程序中返回:(1 1)恢复被屏蔽的程序的处理器状态;)恢复被屏蔽的程序的处理器状态;(2 2)返回到发生异常中断的指令的下一条指令处继续执行。)返回到发生异常中断的指令的下一条

6、指令处继续执行。 当异常中断发生时,程序计数器当异常中断发生时,程序计数器PCPC所指的位置对于各种不同所指的位置对于各种不同的异常中断是不同的,同样,返回地址对于各种不同的异常的异常中断是不同的,同样,返回地址对于各种不同的异常中断也是不同的。中断也是不同的。第第7章章ARM异常中断处理及编程异常中断处理及编程 7.2ARM体系异常中断种类体系异常中断种类ARM处理器中主要有处理器中主要有7个异常(个异常(2个中断异常)个中断异常)复位(复位(RESET)未定义的指令未定义的指令软件中断软件中断指令与取终止(指令与取终止(PrefechAbort)数据访问终止(数据访问终止(DATAABOR

7、T)外部中断请求外部中断请求(IRQ)快速中断请求(快速中断请求(FIQ)第第7章章ARM异常中断处理及编程异常中断处理及编程 7.2.1异常中断向量表及异常中断优先级异常中断向量表及异常中断优先级在在ARMARM体系中,体系中,异常中断向量表的大小为异常中断向量表的大小为3232字节字节,每异常中断占,每异常中断占4 4个字节。个字节。 每个异常中断对应的中断向量表中的每个异常中断对应的中断向量表中的4 4个字节的空间中存放了个字节的空间中存放了一条跳转指令或者一一条跳转指令或者一条向条向PCPC寄存器中赋值的数据访问指令寄存器中赋值的数据访问指令。第第7章章ARM异常中断处理及编程异常中断

8、处理及编程 第第7章章ARM异常中断处理及编程异常中断处理及编程 1复位异常复位异常在以在以ARM为核的系统中,引起复位的原因有:为核的系统中,引起复位的原因有:上电复位上电复位 复位引脚上的复位脉冲复位引脚上的复位脉冲 对系统电源检测发现过压或欠压。对系统电源检测发现过压或欠压。 时钟异常复位。时钟异常复位。ARM处理器复位后,将进行以下操作:处理器复位后,将进行以下操作:强制进入管理模式;强制进入管理模式; 强制进入强制进入ARMARM状态;状态; 跳转到绝对地址跳转到绝对地址PC=0x00000000PC=0x00000000处执行;处执行; 禁止禁止IRQIRQ中断和中断和FIQFIQ

9、中断。中断。第第7章章ARM异常中断处理及编程异常中断处理及编程 复位后,程序状态寄存器如下:复位后,程序状态寄存器如下:.IFTM4M3M2M1M011010011 上电复位后,进入管理模式,执行操作系统程序,上电复位后,进入管理模式,执行操作系统程序,一般用做对系统初始化,例如开中断等;然后切换一般用做对系统初始化,例如开中断等;然后切换到用户模式,开始执行正常的用户程序。到用户模式,开始执行正常的用户程序。第第7章章ARM异常中断处理及编程异常中断处理及编程 切换到用户模式可使用下列程序:切换到用户模式可使用下列程序:MRSR0,CPSR;读状态寄存器;读状态寄存器BICR0,R0,#0

10、3;把末两位清;把末两位清0MSRCPRS_c,R0;把修改后的值加载给;把修改后的值加载给;状态寄存器,切换结束;状态寄存器,切换结束.;用户程序;用户程序第第7章章ARM异常中断处理及编程异常中断处理及编程 2未定义指令异常未定义指令异常ARMARM的未定义指令异常有以下两种情况:的未定义指令异常有以下两种情况:(1 1)遇到一条没有定义指令;)遇到一条没有定义指令;(2 2)执行一条对协处理器的操作指令没有应答。)执行一条对协处理器的操作指令没有应答。 未定义异常中断时,状态寄存器中的未定义异常中断时,状态寄存器中的F F位不变。位不变。 使用下列指令退出异常中断,返回原程序使用下列指令

11、退出异常中断,返回原程序 。把下一条指令的地址拷贝给把下一条指令的地址拷贝给LRLR;把程序状态寄存器把程序状态寄存器CPSRCPSR拷贝给拷贝给SPSR_undSPSR_und;强制进入未定义模式;强制进入未定义模式;强制进入到强制进入到ARMARM模式;模式;跳转到绝对地址跳转到绝对地址PC=0x00000004PC=0x00000004处执行;处执行;禁止禁止IRQIRQ中断。中断。第第7章章ARM异常中断处理及编程异常中断处理及编程 进入中断后,程序状态寄存器如下:进入中断后,程序状态寄存器如下:.IF T M4M3M2M1M01 x 0 1 10 1 1未定义异常中断返回时,使用下列

12、指令未定义异常中断返回时,使用下列指令返回到原中断处:返回到原中断处:MOVSPC,R14.第第7章章ARM异常中断处理及编程异常中断处理及编程 3软件中断异常软件中断异常是由指令是由指令SWI引起的。程序在执行这一指引起的。程序在执行这一指令后,进入异常中断。处理器响应中断,硬件令后,进入异常中断。处理器响应中断,硬件执行如下的操作:执行如下的操作:把下一条指令的地址拷贝给把下一条指令的地址拷贝给LRLR;把程序状态寄存器把程序状态寄存器CPSRCPSR拷贝给拷贝给SPSR_svcSPSR_svc;强制进入管理模式;强制进入管理模式;强制进入到强制进入到ARMARM状态;状态;跳转到绝对地址

13、跳转到绝对地址PC=0x00000008PC=0x00000008处执行;处执行;禁止禁止IRQIRQ中断。中断。第第7章章ARM异常中断处理及编程异常中断处理及编程 进入中断后的程序状态寄存器如下:进入中断后的程序状态寄存器如下:.IF T M4M3M2M1M01 x 0 1 00 1 1软件中断处理程序完成后,使用下列指令返回软件中断处理程序完成后,使用下列指令返回到原中断处:到原中断处:MOVSPC,R14第第7章章ARM异常中断处理及编程异常中断处理及编程 4 4预取指中止异常预取指中止异常 程序存储器引起的中止异常叫做预取指中止异常;程序存储器引起的中止异常叫做预取指中止异常;数据存

14、储器引起的中止异常叫做数据中止异常。数据存储器引起的中止异常叫做数据中止异常。 有两种可能如下:有两种可能如下: 当执行这条指令前程序发生跳转,则这条无效指当执行这条指令前程序发生跳转,则这条无效指令不引起异常中断;令不引起异常中断; 当执行到这条指令时,处理器会发生预取指中止当执行到这条指令时,处理器会发生预取指中止异常,引起中断。异常,引起中断。第第7章章ARM异常中断处理及编程异常中断处理及编程 当进入预取指异常中断时,处理器硬件响应中当进入预取指异常中断时,处理器硬件响应中断,执行以下的操作:断,执行以下的操作:把中断时把中断时PCPC的地址拷贝给的地址拷贝给LRLR;把程序状态寄存器

15、把程序状态寄存器CPSRCPSR拷贝给拷贝给SPSR_abtSPSR_abt;强制进入中止异常模式;强制进入中止异常模式;强制进入到强制进入到ARMARM状态;状态;跳转到绝对地址跳转到绝对地址PC=0x0000000CPC=0x0000000C处执行;处执行;禁止禁止IRQIRQ中断。中断。第第7章章ARM异常中断处理及编程异常中断处理及编程 进入中断后,程序状态寄存器如下:进入中断后,程序状态寄存器如下:.IF T M4M3M2M1M01 x 0 1 01 1 1 预取指中止异常中断返回时,应该预取指中止异常中断返回时,应该执行下列指令:执行下列指令: SUBS PCSUBS PC,R14

16、R14,#4.#4.第第7章章ARM异常中断处理及编程异常中断处理及编程 5数据中止异常数据中止异常ARM处理器访问数据存储器时,在读取数据的同时处理器访问数据存储器时,在读取数据的同时数据存储器发出了中止信号,引起数据中止异常。数据存储器发出了中止信号,引起数据中止异常。数据中止异常中断服务程序返回时,用下列指令:数据中止异常中断服务程序返回时,用下列指令:SUBSPC,R14,#8上述指令是返回到中断时所执行的指令,目的是再上述指令是返回到中断时所执行的指令,目的是再一次从数据存储器中读取数据。如果不再一次读取数一次从数据存储器中读取数据。如果不再一次读取数据,则执行下一条指令,此时使用下

17、列指令返回:据,则执行下一条指令,此时使用下列指令返回:SUBSPC,R14,#4第第7章章ARM异常中断处理及编程异常中断处理及编程 当进入数据中止异常中断时,处理器硬件响应中当进入数据中止异常中断时,处理器硬件响应中断,执行以下的操作:断,执行以下的操作:把中断时的把中断时的PC的地址拷贝给的地址拷贝给LR;把程序状态寄存器把程序状态寄存器CPSR拷贝给拷贝给SPSR_abt;强制进入中止异常模式;强制进入中止异常模式;强制进入到强制进入到ARM状态;状态;跳转到绝对地址跳转到绝对地址PC=0x00000010处执行;处执行;禁止禁止IRQ中断。中断。第第7章章ARM异常中断处理及编程异常

18、中断处理及编程 进入中断后,程序状态寄存器如下:进入中断后,程序状态寄存器如下:.IF T M4M3M2M1M01 x 0 1 01 1 1第第7章章ARM异常中断处理及编程异常中断处理及编程 6中断请求(中断请求(IRQ)异常)异常当当I=1时。则屏蔽时。则屏蔽IRQ中断,当中断,当I=0时,则允许时,则允许中断。处理器复位后置中断。处理器复位后置I为为1,关闭中断。,关闭中断。ARM系统中外设通过该异常中断请求处理服务。系统中外设通过该异常中断请求处理服务。例如:定时器中断、串行口通讯中断、外部信号例如:定时器中断、串行口通讯中断、外部信号中断和中断和A/D处理中断等。处理中断等。IRQ中

19、断是可屏蔽的。在中断是可屏蔽的。在状态寄存器中的状态寄存器中的I位就是位就是IRQ的屏蔽位。的屏蔽位。第第7章章ARM异常中断处理及编程异常中断处理及编程 当发生当发生IRQ中断时,处理器硬件响应中断,中断时,处理器硬件响应中断,执行下列操作:执行下列操作:把中断时的把中断时的PC的地址值拷贝给的地址值拷贝给LR;把程序状态寄存器把程序状态寄存器CPSR拷贝给拷贝给SPSR_irq;强制进入强制进入IRQ异常模式;异常模式;强制进入到强制进入到ARM状态;状态;跳转到绝对地址跳转到绝对地址PC=0x00000018处执行;处执行;禁止禁止IRQ中断。中断。第第7章章ARM异常中断处理及编程异常

20、中断处理及编程 进入中断后,程序状态寄存器如下:进入中断后,程序状态寄存器如下:.IF T M4M3M2M1M01 x 0 1 00 1 0 完成中断处理后,程序执行下列返回完成中断处理后,程序执行下列返回原中断处:原中断处: SUBS PC.R14SUBS PC.R14,#4.#4.第第7章章ARM异常中断处理及编程异常中断处理及编程 7.2.2支持中断跳转支持中断跳转的解析程序的解析程序(1 1)解析程序的概)解析程序的概念和作用念和作用 中断解析程序是中断解析程序是为了使得上层应用程为了使得上层应用程序与硬件中断跳转联序与硬件中断跳转联系起来所编写一段中系起来所编写一段中间的服务程序。间

21、的服务程序。 中断跳转流程中断跳转流程图如图图如图7.17.1所示。所示。第第7章章ARM异常中断处理及编程异常中断处理及编程 (2 2)解析过程)解析过程 以一次以一次IRQIRQ跳转为例说明解析过程,假定中断向量表跳转为例说明解析过程,假定中断向量表定义在定义在0x004000000x00400000开始的外部开始的外部RAMRAM空间,中断解析示例流程如空间,中断解析示例流程如图图7.2 7.2 所示。所示。 图中实线表示的流程都用图中实线表示的流程都用ARMARM汇编语言编写,一般作为汇编语言编写,一般作为bootboot代码的一部分放在系统的底层模块中。填写向量表的操作代码的一部分放

22、在系统的底层模块中。填写向量表的操作可以在上层应用程序中方便地实现,比如在可以在上层应用程序中方便地实现,比如在C C语言中:语言中: * *( ( intint *(0x00400018) = (*(0x00400018) = (intint) ISR_IRQ) ISR_IRQ;这样就将;这样就将IRQIRQ中断的服务中断的服务程序入口地址(程序入口地址(0x003002600x00300260)填写到中断向量表中的固定地址)填写到中断向量表中的固定地址0x004000180x00400018开始的开始的4 4字节空间了。字节空间了。 这样就可避免在应用程序中计算中断的跳转地址,并这样就可避

23、免在应用程序中计算中断的跳转地址,并可很方便的选择不同的函数作为指定中断的服务程序。当然,可很方便的选择不同的函数作为指定中断的服务程序。当然,在程序开发时要合理开辟好向量表,避免对向量表地址空间不在程序开发时要合理开辟好向量表,避免对向量表地址空间不必要的写操作。必要的写操作。 第第7章章ARM异常中断处理及编程异常中断处理及编程 第第7章章ARM异常中断处理及编程异常中断处理及编程 (3 3)解析程序的扩展)解析程序的扩展 在在ARMARM处理器中会包含很多中断源,通常处理器中会包含很多中断源,通常会在会在ARMARM内核外面扩展一个中断控制器来管理内核外面扩展一个中断控制器来管理各种原因

24、产生的中断。各种原因产生的中断。 如,三星公司的如,三星公司的S S3C4510B3C4510B处理器中的处理器中的IRQ/FIQIRQ/FIQ类型的中断源可以有类型的中断源可以有2121个个 S S3C44B0X3C44B0X有有2626个。个。解析程序的扩展解析程序的扩展处理流程可用图处理流程可用图7.37.3表示。表示。7.3 中断解析的扩展处理流程第第7章章ARM异常中断处理及编程异常中断处理及编程 7.3中断解析的扩展处理流程中断解析的扩展处理流程第第7章章ARM异常中断处理及编程异常中断处理及编程 (4) (4) 向量中断的处理向量中断的处理 在设计外部扩展的中断控制器时提供了一在

25、设计外部扩展的中断控制器时提供了一种叫做种叫做“向量中断向量中断”的中断跳转机制。与前面叙述的中断跳转机制。与前面叙述的扩展解析跳转流程有所不同,它不需要软件来识的扩展解析跳转流程有所不同,它不需要软件来识别具体的中断源,也就是不需要添加图别具体的中断源,也就是不需要添加图7.37.3中的中的IRQ/FIQIRQ/FIQ服务程序,而完全由硬件自动跳转到对应的服务程序,而完全由硬件自动跳转到对应的中断地址。其它跳转流程的原理都是一样的。这相中断地址。其它跳转流程的原理都是一样的。这相当于扩展了当于扩展了ARMARM内核的硬件中断向量表,减小了中断内核的硬件中断向量表,减小了中断响应延时。以响应延

26、时。以S3C2410XS3C2410X处理器的外部中断处理器的外部中断0 0为例,需为例,需要在其对应的硬件固定跳转地址要在其对应的硬件固定跳转地址0x000000200x00000020处添加处添加指令:指令: ldrldr pc,= pc,=HandlerEINTHandlerEINT,使得程序跳转到其,使得程序跳转到其服务程序服务程序HandlerEINT0HandlerEINT0处执行。向量中断的处理如处执行。向量中断的处理如图图7.47.4所示。所示。第第7章章ARM异常中断处理及编程异常中断处理及编程 图图7.4向量中断的处理向量中断的处理第第7章章ARM异常中断处理及编程异常中断

27、处理及编程 7.3 中断解析的扩展处理流程7.3ARM应用系统中异常中断处理程序的安装应用系统中异常中断处理程序的安装在在ARM应用程序中安装异常中断处理程序通常有下应用程序中安装异常中断处理程序通常有下列两种方法。列两种方法。使用跳转指令:可以在异常中断对应异常向量表使用跳转指令:可以在异常中断对应异常向量表中特定位置放置一条跳转指令,直接跳转到该异常中中特定位置放置一条跳转指令,直接跳转到该异常中断的处理程序。但只能在断的处理程序。但只能在32M32M空间范围内跳转。空间范围内跳转。 使用数据读取指令使用数据读取指令LDRLDR:使用数据读取指令:使用数据读取指令LDRLDR向向程序计数器

28、程序计数器PCPC中直接赋值。这种方法分为两步:先将中直接赋值。这种方法分为两步:先将异常中断处理程序的绝对地址存放在距离向量表异常中断处理程序的绝对地址存放在距离向量表4KB4KB范围内的一个存储单元中;再使用数据读取指令范围内的一个存储单元中;再使用数据读取指令LDRLDR将该单元的内容读取到程序计数器将该单元的内容读取到程序计数器PCPC中。中。第第7章章ARM异常中断处理及编程异常中断处理及编程 7.3 中断解析的扩展处理流程7.3.1在系统复位时安装异常中断处理程序在系统复位时安装异常中断处理程序1地址地址0x00处为处为ROM的情况的情况当地址当地址0x00x0处为处为ROMROM

29、时时: : 在异常中断向量表中,可以使用数据读在异常中断向量表中,可以使用数据读取指令取指令LDRLDR直接向程序计数器直接向程序计数器PCPC中赋值,也可中赋值,也可以直接使用跳转指令跳转到异常中断处理程序。以直接使用跳转指令跳转到异常中断处理程序。第第7章章ARM异常中断处理及编程异常中断处理及编程 使用数据读取指令使用数据读取指令LDR的示例如下所示:的示例如下所示:Vector_Init_BlockLDRPC,Reset_AddrLDRPC,Undefined_AddrLDRPC,SW_AddrLDRPC,Prefeth_AddrLDRPC,Abort_AddrNOPLDRPC,IRQ

30、_AddrLDRPC,FIQ_AddrReset_AddrDCDStart_Boot第第7章章ARM异常中断处理及编程异常中断处理及编程 Undefined_AddrDCDUndefined_HandleSW_AddrDCDSWI_HandlePrefeth_AddrDCDPrefeth_HandleAbort_AddrDCDAbort_HandleDCD0IRQ_AddrDCDIRQ_HandleFIQ_AddrDCDFIQ_Handle第第7章章ARM异常中断处理及编程异常中断处理及编程 使用跳转指令的示例如下所示:使用跳转指令的示例如下所示:Vector_Init_BlockBLRese

31、t_HandleBLUndefined_HandleBLSWI_HandleBLPrefeth_HandleBLAbort_HandleNOPBLIRQ_HandleBLFIQ_Handle第第7章章ARM异常中断处理及编程异常中断处理及编程 2.地址地址0x00处为处为RAM的情况的情况当地址当地址0x00x0处为处为RAMRAM时,时,中断向量表必须使用数据中断向量表必须使用数据读取指令直接指向读取指令直接指向PCPC中赋中赋值的形式。而且,必须使值的形式。而且,必须使用下面的代码把中断向量用下面的代码把中断向量表从表从ROMROM中复制到中复制到RAMRAM的地的地址址0x000x00开

32、始处的存储空间开始处的存储空间中。中断向量表从中。中断向量表从ROMROM中复中复制到制到RAMRAM的的代码段如下:代码段如下:MOV r8MOV r8,#0#0ADR r9ADR r9,Vector_Init_BlockVector_Init_Block; ;复制中断向量表(复制中断向量表(8 8字)字)LDMIA r9!LDMIA r9!,r0-r7r0-r7STMIA r8!STMIA r8!,r0-r7r0-r7; ;复制保存各中断处理函数复制保存各中断处理函数地址的表(地址的表(8 words8 words)LDMIA r9!LDMIA r9!,r0-r7r0-r7STMIA r8

33、!STMIA r8!,r0-r7r0-r7第第7章章ARM异常中断处理及编程异常中断处理及编程 7.3.2在在C程序中安装异常中断处理程序程序中安装异常中断处理程序安装异常中断处理程序的方法。安装异常中断处理程序的方法。1中断向量表中使用跳转指令的情况中断向量表中使用跳转指令的情况当中断向量表中使用跳转指令时,在当中断向量表中使用跳转指令时,在C程序中安装异常中断程序中安装异常中断处理程序的操作如下:处理程序的操作如下:(1 1)读取中断处理程序的地址。)读取中断处理程序的地址。(2 2)从上一步得到的地址中减去该异常中断对应的中断向量)从上一步得到的地址中减去该异常中断对应的中断向量的地址。

34、的地址。(3 3)从上一步得到的地址中减去)从上一步得到的地址中减去8 8,以允许指令预取。,以允许指令预取。(4 4)将上一步得到的地址右移)将上一步得到的地址右移 2 2位,得到以字(位,得到以字(3232位)为单位)为单位的偏移量。位的偏移量。(5 5)确保上一步得到的地址值高)确保上一步得到的地址值高8 8位为位为0 0,因为跳转指令只允,因为跳转指令只允许许2424位的偏移量。位的偏移量。(6 6)将上一步得到的地址与数据)将上一步得到的地址与数据0xea00 00000xea00 0000作逻辑或,从作逻辑或,从而得到将要写到中断向量表中的跳转指令的编码。而得到将要写到中断向量表中

35、的跳转指令的编码。第第7章章ARM异常中断处理及编程异常中断处理及编程 例例7.1使用跳转指令的中断向使用跳转指令的中断向量表量表unsignedInstall_Handler(unsignedroutine,unsigned*vector)/*在中断向量表中在中断向量表中vector处,处,添上合适的跳转指令添上合适的跳转指令*/*该跳转指令跳转到中断处理该跳转指令跳转到中断处理程序程序routine处。处。*/*程序返回原来的中断向量程序返回原来的中断向量*/unsignedvec,oldvec;vec=(routine(unsigned)vector0x8)2);if(vec&oxff0

36、00000)printf(“InstallationofHandlerfailed“);exit(1);vec=oxea000000|vec;oldvec=*vector;*vector=vec;return(oldvec);第第7章章ARM异常中断处理及编程异常中断处理及编程 2 2中断向量表中使用数据读取指令的情况中断向量表中使用数据读取指令的情况 当中断向量表中使用数据读取指令时,在当中断向量表中使用数据读取指令时,在C C 程程序中安装异常中断处理程序的操作过程如下:序中安装异常中断处理程序的操作过程如下:(1 1)读取中断处理程序的地址。)读取中断处理程序的地址。(2 2)从上一步得

37、到的地址中减去该异常中断对应的中)从上一步得到的地址中减去该异常中断对应的中断向量的地址。断向量的地址。(3 3)从上一步得到地址中减去)从上一步得到地址中减去8 8,以允许指令预取。,以允许指令预取。(4 4)将上一步得到地址与数据)将上一步得到地址与数据0xe59f f0000xe59f f000作逻辑或,作逻辑或,从而得到将要写到中断向量表中的数据读取指令的编码。从而得到将要写到中断向量表中的数据读取指令的编码。(5 5)将中断处理程序的地址放到相应的存储单元。)将中断处理程序的地址放到相应的存储单元。第第7章章ARM异常中断处理及编程异常中断处理及编程 例例7.2使用数据读取指令的中断

38、向量表使用数据读取指令的中断向量表unsignedInstall_Handler(unsignedlocation,unsigned*vector)/*/*在中断向量表中在中断向量表中vectorvector处,添上合适的指令处,添上合适的指令LDR pc, pc LDR pc, pc , #offset */, #offset */*/*该指令跳转的目标地址存放在存储单元该指令跳转的目标地址存放在存储单元locationlocation中中 * */ /*/*函数返回原来的中断向量函数返回原来的中断向量* */ /unsignedvec,oldvec;vec=(unsigned)locati

39、on(unsigned)vector0x8)|0xe59ff000;oldvec=*vector;*vector=vec;return(oldvec);第第7章章ARM异常中断处理及编程异常中断处理及编程 用下面的语句调用例用下面的语句调用例7.27.2的函数,实现的函数,实现用用C C语言程序完成中断处理程序的安装。语言程序完成中断处理程序的安装。unsigned *unsigned *irqvecirqvec = (unsigned *)0x18 ; = (unsigned *)0x18 ;Install_HandlerInstall_Handler (unsigned ) (unsign

40、ed ) IRQHandlerIRQHandler, , irqvecirqvec ) ; ) ;第第7章章ARM异常中断处理及编程异常中断处理及编程 7.4ARM的的SWI异常中断处理程序设计异常中断处理程序设计通过通过SWISWI异常中断指令,用户模式下应用程序可以异常中断指令,用户模式下应用程序可以调用系统模式下的代码。在实时操作系统中,通常使用调用系统模式下的代码。在实时操作系统中,通常使用SWISWI异常中断为用户应用程序提供系统功能调用。异常中断为用户应用程序提供系统功能调用。7.4.1 SWI7.4.1 SWI异常中断处理程序的实现异常中断处理程序的实现 在在SWISWI指令中包

41、括一个指令中包括一个2424位的立即数(中断调位的立即数(中断调用号),该立即数指示了用户要请求的特定的调用功能,用号),该立即数指示了用户要请求的特定的调用功能,所以在所以在SWISWI的异常中断中要读取这个中断调用号,然后的异常中断中要读取这个中断调用号,然后根据中断号,来调用相应的处理程序。这个过程可以分根据中断号,来调用相应的处理程序。这个过程可以分两步:第两步:第1 1步是步是SWISWI中断处理程序为汇编,用于确定中断处理程序为汇编,用于确定SWISWI指令中的指令中的2424位的立即数;第位的立即数;第2 2步是步是SWISWI异常中断处理的功异常中断处理的功能服务程序,是具体实

42、现能服务程序,是具体实现SWISWI的各个功能,它即可用汇的各个功能,它即可用汇编语言,也可用编语言,也可用C C语言编程。语言编程。第第7章章ARM异常中断处理及编程异常中断处理及编程 1.第第1步用汇编语言编写的步用汇编语言编写的SWI异常中断处理程序异常中断处理程序由于是在底层操作,所以这个异常中断处理程序由于是在底层操作,所以这个异常中断处理程序得用汇编语言编写,例得用汇编语言编写,例7.37.3所示的所示的SWISWI异常中断处理程异常中断处理程序中的序中的blbl swi_service_funcswi_service_func指令是调用第指令是调用第2 2步的步的SWISWI异常

43、中断处理的功能服务程序,此函数是用于实现异常中断处理的功能服务程序,此函数是用于实现SWISWI的各个功能。的各个功能。第第7章章ARM异常中断处理及编程异常中断处理及编程 例7.3汇编语言编写的第1步SWI异常中断处理程序areatop_swicodereadonlyexportswi_headlerswi_headlerstmfdsp!,r0-r12,lr;保存r0至r12,lr的寄存器值ldrr0,lr,#-4;从存储器中取得SWI指令的所在地址bicr0,r0,#FF000000;读取24位中断调用号movr1,sp;=blswi_service_func;调用功能服务函数,见下面;中

44、断调用号通过r0寄存器传入;参数通过r1寄存器传入;=ldmfdsp!,r0-r12,pc;恢复调用前r0至r12,退出end第第7章章ARM异常中断处理及编程异常中断处理及编程 2. SWI2. SWI异常中断处理的中断服务程序异常中断处理的中断服务程序 为了具体实现为了具体实现SWISWI的各个功能,需编写的各个功能,需编写SWISWI异常中断处理的功能服务程序,它即可用汇异常中断处理的功能服务程序,它即可用汇编语言,也可用编语言,也可用C C语言编程。例语言编程。例7.47.4是用汇编语是用汇编语言编写的言编写的SWISWI异常中断处理的中断服务程序,例异常中断处理的中断服务程序,例7.

45、57.5是用是用C C语言编写的语言编写的SWISWI异常中断处理的中断服异常中断处理的中断服务程序。务程序。第第7章章ARM异常中断处理及编程异常中断处理及编程 例例7.4 7.4 汇编语言编写的汇编语言编写的SWISWI异常中断处理程序异常中断处理程序area area toplevelswitoplevelswi code code readonlyreadonlyexport export swi_headlerswi_headlerswi_headlerswi_headlerstmfdstmfd sp!, r0-r12, sp!, r0-r12, lrlr ;保存;保存r0r0至至r

46、12,lrr12,lr的寄存器值的寄存器值ldrldr r0, r0, lrlr, #-4, #-4; 从存储器中取得从存储器中取得SWISWI指令指令的所在地址的所在地址bicbic r0, r0, #FF000000 r0, r0, #FF000000; 读取读取2424位中断调用号位中断调用号movmov r1, sp r1, sp;判断立即数是否有效;判断立即数是否有效cmpcmp R0,#MaxOfSWI R0,#MaxOfSWI;判;判R0R0中数是否有效超过允许的最大值中数是否有效超过允许的最大值 ldrls pc,pc,r0,lsl #2 ldrls pc,pc,r0,lsl

47、#2 b OutOfSWIRange b OutOfSWIRange ;超出范围;超出范围 JumpListofSWI JumpListofSWI ;SWISWI的跳转表的跳转表dcd SWIPro_0dcd SWIPro_0;SWISWI对应立即数对应立即数0 0的中断处理程序入口地址的中断处理程序入口地址dcddcd SWIPro_1 SWIPro_1 ;SWISWI对应立即数对应立即数1 1的中断处理程序入口的中断处理程序入口地址地址第第7章章ARM异常中断处理及编程异常中断处理及编程 ;其他所有的软中断入口;其他所有的软中断入口 SWIPro_0 SWIPro_0 ;进入;进入SWIS

48、WI对应立即数对应立即数0 0的中断处理程序的中断处理程序 ;对应立即数;对应立即数0 0 的中断处理程序的中断处理程序 b b EndOfSWIEndOfSWI SWIPro1 SWIPro1 ;进入;进入SWISWI对应立即数对应立即数1 1的中断处理程序的中断处理程序;对应立即数;对应立即数1 1 的中断处理程序的中断处理程序 b b EndOfSWIEndOfSWI ;其他的;其他的SWI SWI 处理程序处理程序 EndOfSWIEndOfSWI ;结束;结束SWI SWI 中断处理程序中断处理程序ldmfdldmfd sp!, r0-r12, pc sp!, r0-r12, pc

49、; ;恢复调用前的恢复调用前的r0r0至至r12r12,退出中断程序,退出中断程序endend第第7章章ARM异常中断处理及编程异常中断处理及编程 例例7.5 7.5 用用C C语言编写的第语言编写的第2 2步步SWISWI异常中断处异常中断处理的中断服务程序理的中断服务程序 用用C C语言编写的第语言编写的第2 2步步SWISWI异常中断处理的中断异常中断处理的中断服务程序的函数原形如下:服务程序的函数原形如下:voidswi_service_func(unsignedintnumber,unsignedint*reg) 其中:参数其中:参数numbernumber是是SWISWI的中断调用

50、号,是的中断调用号,是利用从中断处理函数获得的中断调用号;参数利用从中断处理函数获得的中断调用号;参数regreg是是SWISWI异常中断第异常中断第1 1步(例步(例7.37.3)中断处理程序传递来的)中断处理程序传递来的数据栈指针。在第数据栈指针。在第1 1步的步的SWISWI异常中断处理程序调用第异常中断处理程序调用第2 2步中断处理程序的操作如下所示:步中断处理程序的操作如下所示: 设置设置C C程序将使用的第二个参数,根据程序将使用的第二个参数,根据ATPCSATPCS第个参数保存在寄存器第个参数保存在寄存器R1R1中中第第7章章ARM异常中断处理及编程异常中断处理及编程 movr1

51、,spblswi_service_func;调用功能服务函数,见下面调用功能服务函数,见下面;中断调用号通过中断调用号通过r0寄存器传入寄存器传入;参数通过参数通过r1寄存器传入寄存器传入第第2步步SWI异常中断处理的中断服务程序代码如下:异常中断处理的中断服务程序代码如下:voidswi_service_func(unsignedintnumber,unsignedint*reg)unsignedintreg1,reg2,reg3,reg4;/获取获取SWI前传入的参数前传入的参数reg1=reg0;reg2=reg1;reg3=reg2;reg4=reg3;第第7章章ARM异常中断处理及编

52、程异常中断处理及编程 switch(number)case0:/dosomethingbreak;case1:/dosomethingbreak;casen:/dosomethingbreak;default:/dosomething第第7章章ARM异常中断处理及编程异常中断处理及编程 / / 更新结果存入更新结果存入r0-r3r0-r3 reg0 = updata_reg1; reg0 = updata_reg1; reg1 = updata_reg2; reg1 = updata_reg2; reg2 = updata_reg3; reg2 = updata_reg3; reg3 = up

53、data_reg4; reg3 = updata_reg4; 第第7章章ARM异常中断处理及编程异常中断处理及编程 7.4.2SWI异常中断调用异常中断调用1在特权模式下调用在特权模式下调用SWI 执行执行SWISWI指令后,系统将会把指令后,系统将会把CPSRCPSR寄存器的寄存器的内容保存到寄存器内容保存到寄存器SPSR_svcSPSR_svc中,将返回地址保中,将返回地址保存到寄存器存到寄存器LR_svcLR_svc中。这样如果在执行中。这样如果在执行SWISWI指令指令时,系统已经处于特权模式下,这时寄存器时,系统已经处于特权模式下,这时寄存器SPSR_svcSPSR_svc和寄存器和

54、寄存器LR_svcLR_svc中的内容就会被破坏。中的内容就会被破坏。因此如果在特权模式下调用因此如果在特权模式下调用SWISWI功能(即执行功能(即执行SWISWI指令),比如在一个指令),比如在一个SWISWI异常中断处理程序异常中断处理程序中执行中执行SWISWI指令,就必须将原始的寄存器指令,就必须将原始的寄存器SPSR_svcSPSR_svc和寄存器和寄存器LR_svcLR_svc值保存在数据栈中。值保存在数据栈中。 第第7章章ARM异常中断处理及编程异常中断处理及编程 例如例如 7.6 7.6 在在SWISWI中断程序处理程序中保存寄存器中断程序处理程序中保存寄存器SPSR_svc

55、SPSR_svc和寄和寄存器存器LR_svcLR_svc值值area area top_switop_swi code code readonlyreadonlyexport export swi_headlerswi_headlerswi_headlerswi_headlerstmfdstmfd sp!, r0-r3,12, sp!, r0-r3,12, lrlr ; ; 保存保存r0r0至至r3,r12,lrr3,r12,lr的的寄存器值寄存器值;保存;保存SPSR_svcSPSR_svcmov r1,spmov r1,spMRS r0,spsrMRS r0,spsrstmfdstmfd

56、sp!, r0 sp!, r0;读取;读取SWISWI指令指令ldrldr r0, r0, lrlr, #-4, #-4; ; 从存储器从存储器中取得中取得SWISWI指令的所在地址指令的所在地址bicbic r0, r0, #FF000000 r0, r0, #FF000000; ; 读取读取2424位中断调用号,并存入寄位中断调用号,并存入寄存器存器r0r0中中第第7章章ARM异常中断处理及编程异常中断处理及编程 ;=blswi_service_func;调用功能服务函数,调用功能服务函数,;见下面中断调用号通过见下面中断调用号通过r0寄存器寄存器;传入参数通过传入参数通过r1寄存器传入寄

57、存器传入;=ldmfdsp!,r0;恢复调用前的恢复调用前的r0MSRspsr_cf,r0ldmfdsp!,r0-r3,r12,pc;恢复调用前的恢复调用前的r0至至r12,离开中断处理程序,离开中断处理程序end第第7章章ARM异常中断处理及编程异常中断处理及编程 2.从应用程序中调用从应用程序中调用SWI可分两种情况从应用程序中调用特定的可分两种情况从应用程序中调用特定的SWISWI功能:其一是使用汇编指令调用;其二是用功能:其一是使用汇编指令调用;其二是用C C程程序调用。序调用。 汇编指令调用特定的汇编指令调用特定的SWISWI功能只要将所需功能只要将所需要的参数按要的参数按ATPCS

58、ATPCS的要求放置在相应的寄存器中,的要求放置在相应的寄存器中,然后在指令然后在指令SWISWI中指定相应中指定相应2424位立即数(即待调位立即数(即待调用的用的SWISWI功能号)即可。功能号)即可。第第7章章ARM异常中断处理及编程异常中断处理及编程 例如例如7.7下面的例子是用汇编指令实现下面的例子是用汇编指令实现SWI的调用。的调用。SWI中断处理程序所需的参数放在寄存器中断处理程序所需的参数放在寄存器R0中,中,然后调用功能号为然后调用功能号为0x0的的SWI功能调用。功能调用。 MOV R0, #100MOV R0, #100 SWI 0x0 SWI 0x0第第7章章ARM异常

59、中断处理及编程异常中断处理及编程 例如例如7.8下下面面是是ARMARM公公司司的的ADS ADS 1.21.2中中自自带带的的一一个个完完整整的的用用C C语语言言程程序序调调用用特特定定的的SWISWI功功能能的的例例子子,例例子子中中提提供供了了4 4个个SWISWI功功能能调调用用,功功能能号号分分别别为为0x00x0、0x10x1、0x20x2和和0x30x3。其其中中SWI SWI 0x00x0和和SWI SWI 0x10x1使使用用两两个个整整型型的的输输入入参参数数,并并返返回回一一个个结结果果值值;SWI SWI 0x20x2使使用用4 4个个输输入入参参数数,并并返返回回一

60、一个个结结果果值值;SWI SWI 0x30x3使使用用4 4个个输输入入参参数数,并并返返回回4 4个结果值。个结果值。第第7章章ARM异常中断处理及编程异常中断处理及编程 从从C程序中调用特定的程序中调用特定的SWI功能程序代码如下:功能程序代码如下:/*头文件头文件swi.h*/_swi(0)intmultiply_two(int,int);_swi(1)intadd_two(int,int);_swi(2)intadd_multiply_two(int,int,int,int);structfour_resultsinta;intb;intc;intd;_swi(3)_value_in

61、_regsstructfour_resultsmany_operations(int,int,int,int);第第7章章ARM异常中断处理及编程异常中断处理及编程 /*主程序主程序main()*/#include#include“swi.h”unsigned*swi_vec=(unsigned*)0x08;externvoidSWI_Handler(void);/*使用使用Install_Handler()安装安装SWI异常中断处理程序异常中断处理程序*/unsignedInstall_Handler(unsignedroutine,unsigned*vector)unsignedvec,o

62、ld_vec;vec=(routine(unsigned)vector-8)2;if(vec&0xff000000)printf(“Handlergreaterthan32Mbytesfromvector“);第第7章章ARM异常中断处理及编程异常中断处理及编程 vec=0xea000000|vec;old_vec=*vector;*vector=vec;return(old_vec);intmain(void)intresult1,result2;structfour_resultsres_3;Install_Handler(unsigned)SWI_Handler,swi_vec);pri

63、ntf(“result1=multiply_two(2,4)=%dn”,result1=multiply_two(2,4);printf(“result2=multiply_two(3,6)=%dn”,第第7章章ARM异常中断处理及编程异常中断处理及编程 result2=multiply_two(3,6);printf(“add_two(result1,result2)=%dn”,add_two(result1,result2);printf(“add_multiply_two(2,4,3,6)=%dn”,add_multiply_two(2,4,3,6);res_3=many_operati

64、ons(12,4,3,1);printf(“res_3.a=%dn”,res_3.a);printf(“res_3.b=%dn”,res_3.b);printf(“res_3.c=%dn”,res_3.c);printf(“res_3.d=%dn”,res_3.d);return0;第第7章章ARM异常中断处理及编程异常中断处理及编程 ;第;第1步步SWI异常中断处理程序异常中断处理程序SWI_HandlerAREASWI_Area,CODE,READONLYEXPORTC_SWI_HandlerT_bitEQU0x20SWI_HandlerSTMFDsp!,r0-r3,r12,lrMOVr1

65、,spMRSr0,spsrSTMFDsp!,r0TSTr0,#T_bitLDRNEHr0,lr,#-2BICENr0,r0,#0xff00LDREQr0,lr,#-4第第7章章ARM异常中断处理及编程异常中断处理及编程 BICEQr0,r0,#0xff000000BLC_SWI_HandlerLDMFDsp!,r0MSRspsr_cf,r0LDMFDsp!,r0,r3,r12,pcEND;第;第2步步SWI异常中断处理程序异常中断处理程序voidC_SWI_Handler()voidC_SWI_Handler()switch(swi_num)第第7章章ARM异常中断处理及编程异常中断处理及编程

66、 case0;/对应于对应于SWI0x0regs0=regs0*regs1;break;case1;/对应于对应于SWI0x1regs0=regs0+regs1;break;case2;/对应于对应于SWI0x2regs0=(regs0*regs1)+(regs2*regs3);break;case3;/对应于对应于SWI0x3intw,x,y,z;第第7章章ARM异常中断处理及编程异常中断处理及编程 w=regs0;x=regs1;y=regs2;z=regs3;regs0=w+x+y+z;regs1=w-x-y-z;regs2=w*x*y*z;regs3=(w+x)*(yz);break;

67、第第7章章ARM异常中断处理及编程异常中断处理及编程 3. 3. 从应用程序中动态调用从应用程序中动态调用SWISWI 动态调用动态调用SWISWI是指在应用程序的运行时调用是指在应用程序的运行时调用SWISWI的的功能号。有两种方法实现动态调用功能号。有两种方法实现动态调用SWISWI功能号。功能号。 方法方法1 1:在运行时得到:在运行时得到SWISWI功能号,然后构造出相应功能号,然后构造出相应的的SWISWI指令的编码,把这个指令的编码保存在某个存储指令的编码,把这个指令的编码保存在某个存储单元中,执行该指令即可。单元中,执行该指令即可。 方法方法2 2:用一个通用的:用一个通用的SW

68、ISWI异常中断处理程序,将异常中断处理程序,将运行时需要调用的运行时需要调用的SWISWI功能号作为参数传递给该通用的功能号作为参数传递给该通用的SWISWI异常中断处理程序。通用的异常中断处理程序。通用的SWISWI异常中断处理程序异常中断处理程序根据参数值调用相应的根据参数值调用相应的SWISWI处理程序完成需要操作。处理程序完成需要操作。第第7章章ARM异常中断处理及编程异常中断处理及编程 在汇编程序中常用第在汇编程序中常用第2 2种方法种方法。在执行。在执行SWISWI指令指令之前先将需要调用的之前先将需要调用的SWISWI功能号放在某个寄存器(功能号放在某个寄存器(R0R0R12R

69、12都可以使用),在通用的都可以使用),在通用的SWISWI异常中断程序读异常中断程序读取该寄存器值,决定需要执行的操作,但有些取该寄存器值,决定需要执行的操作,但有些SWISWI处处理程序需要理程序需要SWISWI指令中的指令中的2424位立即数,因而上述两种位立即数,因而上述两种方法常常组合使用。方法常常组合使用。 在操作系统中通常使用一个在操作系统中通常使用一个SWISWI功能号和一个寄功能号和一个寄存器来提供很多的存器来提供很多的SWISWI功能调用,这样可以将其他的功能调用,这样可以将其他的SWISWI功能号留给用户使用。功能号留给用户使用。第第7章章ARM异常中断处理及编程异常中断

70、处理及编程 例例7.9 7.9 在在ARMARM体系中体系中semihostsemihost的实现的一个实例,的实现的一个实例,ARMARM程序使用程序使用SWI 0x123456SWI 0x123456来实现来实现semihostsemihost功功能调用;能调用;ThumbThumb程序使用程序使用SWI 0xABSWI 0xAB来实现来实现semihostsemihost功能调用。此例中将子程序功能调用。此例中将子程序WRITECWRITEC(unsigned op, char *c unsigned op, char *c )映射到)映射到somehostsomehost功能调用,具体

71、功能调用,具体semihostsemihost SWI SWI的子的子功能号通过参数功能号通过参数opop传递。传递。第第7章章ARM异常中断处理及编程异常中断处理及编程 7.5 FIG7.5 FIG和和IRQIRQ异常中断程序设计异常中断程序设计 IRQIRQ和和FIQFIQ是是ARMARM处理器的两种编程模式。处理器的两种编程模式。IRQIRQ是指中是指中断模式,断模式,FIRFIR是指快速中断模式。是指快速中断模式。IRQ IRQ 可以被可以被 FIQ FIQ 所中断,所中断,但但 IRQ IRQ 不能中断不能中断 FIQFIQ。为了使。为了使 FIQ FIQ 更快,所以这种模式有更快,

72、所以这种模式有更多的影子寄存器。更多的影子寄存器。FIQ FIQ 不能调用不能调用 SWISWI(软件中断)。(软件中断)。FIQ FIQ 还必须禁用中断。如果一个还必须禁用中断。如果一个 FIQ FIQ 例程必须重新启用中断,则例程必须重新启用中断,则它太慢了,并应该是它太慢了,并应该是 IRQ IRQ 而不是而不是 FIQFIQ。 设置设置IRQ/FIQIRQ/FIQ中断,若是中断,若是IRQIRQ中断则可以设置为向量中中断则可以设置为向量中断并分配中断优先级,否则为非向量断并分配中断优先级,否则为非向量IRQIRQ。然后可以设置中断。然后可以设置中断允许,以及向量中断对应地址或非向量中断

73、默认地址。当有允许,以及向量中断对应地址或非向量中断默认地址。当有中断后,若是中断后,若是IRQIRQ中断,则可以读取向量地址寄存器,然后跳中断,则可以读取向量地址寄存器,然后跳转到相应的代码。当要退出中断时,对向量地址寄存器写转到相应的代码。当要退出中断时,对向量地址寄存器写0 0,通知通知VICVIC(中断向量控制器)中断结束。当发生中断时,处理(中断向量控制器)中断结束。当发生中断时,处理器将会切换处理器模式,同时相关的寄存器也将会映射。器将会切换处理器模式,同时相关的寄存器也将会映射。第第7章章ARM异常中断处理及编程异常中断处理及编程 IRQIRQ(外部中断请求):(外部中断请求):

74、当处理器的外部中断请求引脚当处理器的外部中断请求引脚有效,且有效,且CPSRCPSR中的中的I I位为位为0 0时,产生时,产生IRQIRQ异常。系统的外设可以异常。系统的外设可以该异常请求中断服务(异常向量:该异常请求中断服务(异常向量:0x0000,00180x0000,0018);); FIQFIQ(快速中断请求):(快速中断请求):当处理器的快速中断请求引脚当处理器的快速中断请求引脚有效,且有效,且CPSRCPSR中的中的F F位为位为0 0时,产生时,产生FIQFIQ异常(异常向量:异常(异常向量:0x0000,001C0x0000,001C)。)。 使用外部中断应注意把某个引脚设置

75、为外部中断功能后,使用外部中断应注意把某个引脚设置为外部中断功能后,该引脚为输入模式,由于没有内部上拉电阻,所以必须外接一该引脚为输入模式,由于没有内部上拉电阻,所以必须外接一个上拉电阻,确保引脚不被悬空;个上拉电阻,确保引脚不被悬空; 除了引脚连接模块的设置,还需要设置除了引脚连接模块的设置,还需要设置VICVIC模块,才能产模块,才能产生外部中断,否则外部中断只能反映在生外部中断,否则外部中断只能反映在EXTINTEXTINT寄存器中;寄存器中;要使器件进入掉电模式并通过外部中断唤醒,软件应该正确要使器件进入掉电模式并通过外部中断唤醒,软件应该正确设置引脚的外部中断功能,再进入掉电模式。设

76、置引脚的外部中断功能,再进入掉电模式。第第7章章ARM异常中断处理及编程异常中断处理及编程 7.5.1 IRQ7.5.1 IRQ和和FIQFIQ异常中断处理程序异常中断处理程序 1 1不可重入的不可重入的IRQ/FIQIRQ/FIQ异常中断处理程序异常中断处理程序在在C C语言中,不可重入的语言中,不可重入的IRQ/FIQIRQ/FIQ异常中断处理程序异常中断处理程序可以使用关键词可以使用关键词_ _irqirq来说明。关键词来说明。关键词_ _irqirq可以实现下可以实现下面的操作:面的操作:保存保存APCSAPCS规定的被破坏的寄存器。规定的被破坏的寄存器。保存其他中断处理程序中用到的寄

77、存器。保存其他中断处理程序中用到的寄存器。同时将(同时将(LR-4LR-4)赋给程序计数器)赋给程序计数器PCPC实现中断处理程实现中断处理程序的返回,并且恢复序的返回,并且恢复CPSRCPSR寄存器的内容。寄存器的内容。 当当IRQ/FIQIRQ/FIQ异常中断处理程序调用了子程序时,异常中断处理程序调用了子程序时,关键词关键词_ _irqirq可以使可以使IRQ/FIQIRQ/FIQ异常中断处理程序返回时异常中断处理程序返回时从其数据栈中读取从其数据栈中读取LR_irqLR_irq值,并通过值,并通过 SUBS PCSUBS PC,LRLR,#4#4;实现返;实现返回。回。第第7章章ARM

78、异常中断处理及编程异常中断处理及编程 例例7.107.10的程序中说明了关键词的程序中说明了关键词_ _irqirq的作用。在例中的作用。在例中的两个的两个C C语言程序中,第语言程序中,第1 1个使用了关键词个使用了关键词_ _irqirq的声明,的声明,第第2 2个没有使用关键词个没有使用关键词_ _irqirq的声明。的声明。例例7.10 7.10 关键词关键词_ _irqirq的作用的作用/* /* 第第1 1个程序使用关键词个程序使用关键词_ _irqirq声明声明 * */ /_ _irqirq void void IRQHandlerIRQHandler (void) (void

79、) volatile unsigned volatile unsigned intint *base = (unsigned *base = (unsigned intint *) 0x80000000;*) 0x80000000; if (*base = 1) if (*base = 1) C_int_handlerC_int_handler ( ); / ( ); /调用相应的调用相应的C C语言处理语言处理程序程序 *(base+1) = 0; / *(base+1) = 0; /清除中断标志清除中断标志 第第7章章ARM异常中断处理及编程异常中断处理及编程 ;第;第1 1个个C C语言

80、程序对应的汇编程序语言程序对应的汇编程序IRQHandler PROCIRQHandler PROCSTMFD sp!,r0-r4.r12,lrSTMFD sp!,r0-r4.r12,lrMOV r4,#0x80000000MOV r4,#0x80000000LDR r0,r4,#0LDR r0,r4,#0SUB sp,sp,#4SUB sp,sp,#4CMP r0,#1CMP r0,#1BLEQ BLEQ C_int_handlerC_int_handlerMOV r0,#0MOV r0,#0STR r0,r4,#4STR r0,r4,#4ADD sp,sp,#4ADD sp,sp,#4LD

81、MFD sp!,r0-r4,r12,lrLDMFD sp!,r0-r4,r12,lrSUBS pc,lr,#4SUBS pc,lr,#4ENDPENDP第第7章章ARM异常中断处理及编程异常中断处理及编程 EXPORT EXPORT IRQHandlerIRQHandler/* /* 第第2 2个程序没有使用关键词个程序没有使用关键词_ _irqirq声明声明 * */ /irqirq void void IRQHandlerIRQHandler (void) (void) volatile unsigned volatile unsigned intint *base = (unsigned

82、 *base = (unsigned intint *) 0x80000000;*) 0x80000000; if (*base = 1) if (*base = 1) C_int_handlerC_int_handler ( ); / ( ); /调用相应的调用相应的C C语言处理语言处理程序程序 *(base+1) = 0; / *(base+1) = 0; /清除中断标志清除中断标志 第第7章章ARM异常中断处理及编程异常中断处理及编程 ;第;第1 1个个C C语言程序对应的汇编程序语言程序对应的汇编程序IRQHandlerIRQHandler PROC PROCSTMFD sp!,r4

83、.lrSTMFD sp!,r4.lrMOV r4,#0x80000000MOV r4,#0x80000000LDR r0,r4,#0LDR r0,r4,#0CMP r0,#1CMP r0,#1BLEQ BLEQ C_int_handlerC_int_handlerMOV r0,#0MOV r0,#0STR r0,r4,#4STR r0,r4,#4LDMFD sp!,r4,pcLDMFD sp!,r4,pcENDPENDP第第7章章ARM异常中断处理及编程异常中断处理及编程 2 2可重入的可重入的IRQ/FIQIRQ/FIQ异常中断处理程序异常中断处理程序 在可重入的在可重入的IRQ/FIQIR

84、Q/FIQ异常中断处理程序异常中断处理程序中调用子程序,子程序的返回地址是保存在寄中调用子程序,子程序的返回地址是保存在寄存器存器LR_irqLR_irq中,若这时又发生了中,若这时又发生了IRQ/FIQIRQ/FIQ异常异常中断,则这个寄存器中断,则这个寄存器LR_irqLR_irq中的值将会被破坏,中的值将会被破坏,那么被调用的子程序将不能正确返回。因此,那么被调用的子程序将不能正确返回。因此,对于可重入对于可重入IRQ/FIQIRQ/FIQ异常中断处理程序需要做异常中断处理程序需要做一些特殊的操作。一些特殊的操作。第第7章章ARM异常中断处理及编程异常中断处理及编程 第第1 1步中断处理

85、程序需完成下列操作(注:这一级步中断处理程序需完成下列操作(注:这一级不能用不能用C C语言编程):语言编程): 将返回地址保存到将返回地址保存到IRQIRQ的数据栈中。的数据栈中。 保存工作寄存器和保存工作寄存器和SPSR_irqSPSR_irq。清除中断标志。清除中断标志。将处理器切换到系统模式,重新使能(将处理器切换到系统模式,重新使能(IRQ/FIQIRQ/FIQ)。)。保存用户模式保存用户模式LRLR寄存器和被调用者不保存的寄存器。寄存器和被调用者不保存的寄存器。调用调用C C语言语言IRQ/FIQIRQ/FIQ异常中断处理程序。异常中断处理程序。当当C C语言的语言的IRQ/FIQ

86、IRQ/FIQ异常中断处理程序返回后,恢复用户异常中断处理程序返回后,恢复用户模式的寄存器,并禁止中断(模式的寄存器,并禁止中断(IRQ/FIQIRQ/FIQ)。)。切换到切换到IRQIRQ模式,禁止中断。模式,禁止中断。恢复工组寄存器和寄存器恢复工组寄存器和寄存器LR_irqLR_irq。 从从IRQIRQ异常中断处理程序中返回。异常中断处理程序中返回。第第7章章ARM异常中断处理及编程异常中断处理及编程 例例7.11 7.11 可重入的可重入的IRQ/FIQIRQ/FIQ异常中断处理程序异常中断处理程序AREA INTERRUPTAREA INTERRUPT,CODECODE,READON

87、LYREADONLYIMPORT IMPORT C_irq_handlerC_irq_handler ; ;引入引入C C语言的语言的IRQIRQ中断处理程序中断处理程序C_irq_handlerC_irq_handlerIRQIRQSUB lr,lr,#4SUB lr,lr,#4STMFD STMFD sp!,lrsp!,lr ; ;保存返回保存返回IRQIRQ处理程序地处理程序地址址MRS r14,SPSRMRS r14,SPSRSTMFD sp!,r12,r14 STMFD sp!,r12,r14 ; ;保存保存SPSR_irqSPSR_irq,及其他工,及其他工作寄存器作寄存器第第7章

88、章ARM异常中断处理及编程异常中断处理及编程 ; ; 在这里添加指令,清除中断标志位在这里添加指令,清除中断标志位;添加指令重新使能中断;添加指令重新使能中断MSR CPSR_c,#0x1F MSR CPSR_c,#0x1F ;切换到系统模式,并使能中断;切换到系统模式,并使能中断STMFD sp!,r0-r3,lrSTMFD sp!,r0-r3,lr ;保存用户模式的;保存用户模式的LR_usrLR_usr及被调用者不保存的寄存及被调用者不保存的寄存器器BL BL C_irq_handlerC_irq_handler ;跳转到;跳转到C C语言的中断处理程语言的中断处理程序序LDMFD sp

89、!,r0-r3,lr LDMFD sp!,r0-r3,lr ;恢复用户模式的寄存器;恢复用户模式的寄存器MSR CPSR_c,#0x92 MSR CPSR_c,#0x92 ;切换到;切换到IRQIRQ模式,禁止模式,禁止IRQIRQ中断,中断,FIQFIQ中断仍允许中断仍允许LDMFD sp!,r12,r14 LDMFD sp!,r12,r14 ;恢复工作寄存器和;恢复工作寄存器和SPSR_irqSPSR_irqLDMFD LDMFD sp!,pcsp!,pc ;从;从IRQIRQ处理程序返回处理程序返回ENDEND第第7章章ARM异常中断处理及编程异常中断处理及编程 7.5.2 7.5.2

90、多中断源的多中断源的IRQIRQ异常中断处理程序异常中断处理程序 下面通过一多中断源的下面通过一多中断源的IRQIRQ异常中断处理程序来说明异常中断处理程序来说明ARMARM中断的使用。例中是中断的使用。例中是3232个中断源,每个中断源对应一个单独的优个中断源,每个中断源对应一个单独的优先级值,优先级的取值范围为先级值,优先级的取值范围为0 03131。假设系统中的中断控制器。假设系统中的中断控制器的基地址为的基地址为IntBaseIntBase,存放中断优先级值的寄存器的偏移地址为,存放中断优先级值的寄存器的偏移地址为IntLevelIntLevel。寄存器。寄存器R13R13指向一个指向

91、一个FDFD类型的数据栈。类型的数据栈。例例7.12 7.12 多中断源的多中断源的IRQIRQ异常中断处理程序异常中断处理程序SUB lr,lr,#4SUB lr,lr,#4STMFD STMFD sp!,lrsp!,lr ;保存返回;保存返回IRQIRQ处理程序地址处理程序地址MRS r14,SPSRMRS r14,SPSRSTMFD sp!,r12,r14 STMFD sp!,r12,r14 ;保存;保存SPSRSPSR,及,及R12R12寄存器寄存器MOV r12,#IntBase MOV r12,#IntBase ;读取中断控制器的地址;读取中断控制器的地址LDR r12,r12,#

92、IntLevel LDR r12,r12,#IntLevel ;读取优先级最高的中断源的优先;读取优先级最高的中断源的优先级值级值 ;使能中断;使能中断第第7章章ARM异常中断处理及编程异常中断处理及编程 MSR r14.CPSRMSR r14.CPSRBIC r14,r14,#0x80BIC r14,r14,#0x80MSR CPSR_c,r14MSR CPSR_c,r14LDR PC,PC,r12,LSL #2 LDR PC,PC,r12,LSL #2 ;跳转到优先级最高的中断对应的中断处理;跳转到优先级最高的中断对应的中断处理程序程序NOPNOP;中断处理程序地址表;中断处理程序地址表D

93、CD Priority0HandlerDCD Priority0Handler;优先级为;优先级为0 0的中断对应中断处理程序地址的中断对应中断处理程序地址DCD Priority1HandlerDCD Priority1Handler;优先级为;优先级为1 1的中断对应中断处理程序地址的中断对应中断处理程序地址DCD Priority2HandlerDCD Priority2Handler;优先级为;优先级为2 2的中断对应中断处理程序地址的中断对应中断处理程序地址DCD Priority3Handler DCD Priority3Handler ;优先级为;优先级为3 3的中断对应中断处理

94、程序地的中断对应中断处理程序地址址;优先级为;优先级为0 0的中断对应的中断处理程序的中断对应的中断处理程序Priority0HandlerPriority0Handler STMFD sp!,r0-r11 STMFD sp!,r0-r11 ;保存工作寄存器;保存工作寄存器 第第7章章ARM异常中断处理及编程异常中断处理及编程 ;这里为中断程序的程序体;这里为中断程序的程序体 LDMFD sp!,r0-r11 LDMFD sp!,r0-r11 ;恢复工作寄存器;恢复工作寄存器 MRS r12,CPSR MRS r12,CPSR ORR r12,r12 ORR r12,r12 MSR CPSR_

95、c,r12 MSR CPSR_c,r12 ;禁止中断;禁止中断LDMFD sp!,r12,r14 LDMFD sp!,r12,r14 ;恢复;恢复SPSRSPSR及寄存器及寄存器r12r12MSR SPSR_csxf,r14MSR SPSR_csxf,r14;从优先级为;从优先级为0 0的中断处理程序返的中断处理程序返回回LDMFD LDMFD sp!,pcsp!,pc ;从;从IRQIRQ处理程序返回处理程序返回;优先级为;优先级为1 1的中断对应的中断处理程序的中断对应的中断处理程序Priority1HandlerPriority1Handler第第7章章ARM异常中断处理及编程异常中断处

96、理及编程 7.6 7.6 基于基于ARM9ARM9芯片芯片S3C2410S3C2410异常中断程序设计异常中断程序设计 7.6.1 7.6.1 异常中断响应和返回异常中断响应和返回 系统运行时,异常可能会随时发生。当一个异系统运行时,异常可能会随时发生。当一个异常出现以后,常出现以后,ARMARM微处理器会执行以下几步操作:微处理器会执行以下几步操作:(1)(1)将下一条指令地址存入相应连接寄存器将下一条指令地址存入相应连接寄存器LRLR,以便程序在处理异常返回时能从正确位置重新开始执以便程序在处理异常返回时能从正确位置重新开始执行。行。(2)(2)将将CPSRCPSR复制到相应的复制到相应的

97、SPSRSPSR中。中。(3)(3)根据异常类型,强制设置根据异常类型,强制设置CPSRCPSR的运行模式位。的运行模式位。(4)(4)强制强制PCPC从相关的异常向量地址取下一条指令从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处。执行,从而跳转到相应的异常处理程序处。 第第7章章ARM异常中断处理及编程异常中断处理及编程 异常处理完毕之后,异常处理完毕之后,ARMARM微处理器会执行以下微处理器会执行以下几步操作从异常返回:几步操作从异常返回:(1)(1)将连接寄存器将连接寄存器LRLR的值减去相应的偏移量后送的值减去相应的偏移量后送到到PCPC中。中。(2)(2)将将

98、SPSRSPSR复制回复制回CPSRCPSR中。中。(3)(3)若在进入异常处理时设置了中断禁止位,要若在进入异常处理时设置了中断禁止位,要在此清除。在此清除。 这些工作必须由用户在中断处理函数中实这些工作必须由用户在中断处理函数中实现。为保证在现。为保证在ARMARM处理器发生异常时不至于处于未知状处理器发生异常时不至于处于未知状态,在应用程序的设计中,首先要进行异常处理。采态,在应用程序的设计中,首先要进行异常处理。采用的方式是在异常向量表中的特定位置放置一条跳转用的方式是在异常向量表中的特定位置放置一条跳转指令,跳转到异常处理程序处执行程序。指令,跳转到异常处理程序处执行程序。第第7章章

99、ARM异常中断处理及编程异常中断处理及编程 7.6.2 7.6.2 异常处理程序设计异常处理程序设计 7.6.2.17.6.2.1 异常响应流程异常响应流程 由于向量表的限制,只能有一条指令由于向量表的限制,只能有一条指令B B完成完成32MB32MB范围范围内的跳转,并不能保证所有的异常处理函数都位于内的跳转,并不能保证所有的异常处理函数都位于32MB32MB范围内。范围内。为了扩展跳转范围,需要二次跳转才能把异常处理函数的地址为了扩展跳转范围,需要二次跳转才能把异常处理函数的地址传送给传送给PCPC。异常处理调用关系如图。异常处理调用关系如图7.57.5所示。所示。 三星公司网站提供了三星

100、公司网站提供了test2410_r11test2410_r11软件包,其中软件包,其中2410init.s2410init.s有如下代码:有如下代码:HandlerXXXHandlerXXXsubsub sp sp,spsp,#4 #4 ; ;减少减少spsp,保存跳转地址,保存跳转地址stmfdstmfd sp! sp!,r0r0 ; ;将工作寄存器压入堆栈将工作寄存器压入堆栈ldrldr r0 r0,= =HandleXXXHandleXXX ; ;将将HandleXXXHandleXXX地址放入地址放入r0r0ldrldr r0 r0,r0r0 ; ;将中断程序入口地将中断程序入口地址放

101、入址放入r0r0strstr r0 r0,spsp,#4 ;#4 ;将中断程序入口地址压入将中断程序入口地址压入堆栈堆栈ldmfdldmfd sp! sp!,r0r0,pcpc ; ;将工作寄存器和中断程序将工作寄存器和中断程序入口地址弹出到入口地址弹出到r0r0和和PCPC第第7章章ARM异常中断处理及编程异常中断处理及编程 图图7.57.5异常处理调用异常处理调用第第7章章ARM异常中断处理及编程异常中断处理及编程 并且在并且在RAM中定义了存有中断程序入口地中定义了存有中断程序入口地址表址表_ISR_STARTADDRESS:AREARamData,DATA,READWRITE_ISR_

102、STARTADDRESSHandleReset#4HandleUndef#4HandleSWI#4HandlePabort#4HandleDabort#4HandleReserved#4HandleIRQ#4HandleFIQ#4第第7章章ARM异常中断处理及编程异常中断处理及编程 通常通常HandlerXXXHandlerXXX位于程序入口地址位于程序入口地址32MB32MB范围内,范围内,HandleXXXHandleXXX是以是以_ISR_STARTADDRESS_ISR_STARTADDRESS为基地址的为基地址的RAMRAM中地中地址。该代码主要实现跳转功能,把异常处理程序地址址。该

103、代码主要实现跳转功能,把异常处理程序地址HandleXXXHandleXXX送到送到PCPC中。例如产生中。例如产生IRQIRQ中断时,中断时,PCPC会被强会被强制设置为制设置为0x180x18,执行指令:,执行指令:b b HandlerIRQHandlerIRQ在在HandlerIRQHandlerIRQ程序段内,处理器做一些必要的处理,就程序段内,处理器做一些必要的处理,就会将会将_ISR_STARTADDRESS_ISR_STARTADDRESS表中存放的表中存放的IRQIRQ入口地址送入入口地址送入PCPC,然后开始执行相关中断程序。由于,然后开始执行相关中断程序。由于_ISR_S

104、TARTADDRESS_ISR_STARTADDRESS表存放在表存放在RAMRAM中,后面的中,后面的C C语言程序语言程序可以方便地更改相关中断服务程序的内容。可以方便地更改相关中断服务程序的内容。第第7章章ARM异常中断处理及编程异常中断处理及编程 7.6.2.27.6.2.2 异常分支异常分支 系统可能存在多个系统可能存在多个IRQ/FIQIRQ/FIQ的中断处理程序。为了的中断处理程序。为了从向量表入口处的跳转最终能找到正确的中断处理程从向量表入口处的跳转最终能找到正确的中断处理程序,需要设计一套处理机制和方法来实现。可以在序,需要设计一套处理机制和方法来实现。可以在ARMARM的异

105、常向量表之外,增加一张关联中断控制器的向量的异常向量表之外,增加一张关联中断控制器的向量表,向量表中的内容对应每个具体的中断源,可以协表,向量表中的内容对应每个具体的中断源,可以协助跳转到不同的中断处理程序。助跳转到不同的中断处理程序。当响应外设的一个中断请求时,首先触发当响应外设的一个中断请求时,首先触发ARMARM核的核的中断,进人中断程序,再通过中断控制器识别中断源,中断,进人中断程序,再通过中断控制器识别中断源,使使PCPC能够自动获得中断处理程序的地址。有的芯片支能够自动获得中断处理程序的地址。有的芯片支持特殊的硬件分支功能,依据中断源自动跳转到向量持特殊的硬件分支功能,依据中断源自

106、动跳转到向量表的相应地址,多数情况下是用软件来处理异常分支。表的相应地址,多数情况下是用软件来处理异常分支。第第7章章ARM异常中断处理及编程异常中断处理及编程 在在S3C2410S3C2410体系中,中断的调用可以看成体系中,中断的调用可以看成是经历了是经历了2 2次次“中断向量表中断向量表”的查询。的查询。2410init.s2410init.s中的以下代码完成功能就是查询中的以下代码完成功能就是查询中断偏移寄存器中断偏移寄存器INTOFFSETINTOFFSET,得到当前中断的,得到当前中断的中断号,并根据中断号再调用相关的中断服中断号,并根据中断号再调用相关的中断服务程序。务程序。第第

107、7章章ARM异常中断处理及编程异常中断处理及编程 IsrIRQIsrIRQ sub sub sp sp,spsp,#4#4 stmfdstmfdsp!sp!,r8-r9r8-r9 ldr ldr r9 r9,=INTOFFSET=INTOFFSET ldr ldr r9 r9,r9r9 ldrldr r8 r8,=HandleEINT0=HandleEINT0 add add r8 r8,r8r8,r9r9,lsllsl #2#2 ldrldr r8 r8,r8r8 str str r8 r8,spsp,#8#8 ldmfd ldmfd sp! sp!,r8-r9r8-r9,pcpc 为了方便

108、为了方便C C程序使用中断,将程序使用中断,将IsrIRQIsrIRQ设为设为IRQIRQ的中的中断服务程序。断服务程序。 ldrldr r0 r0,=HandleIRQ=HandleIRQ ldr ldr r1 r1,=IsrIRQ=IsrIRQ strstr r1 r1,r0r0第第7章章ARM异常中断处理及编程异常中断处理及编程 7.6.2.37.6.2.3 中断函数设计中断函数设计标准的标准的ARMARM指令编译器提供了一个用来声明中断处理函数指令编译器提供了一个用来声明中断处理函数的关键字的关键字 irqirq,编译后的代码在处理异常事件前保存现场信息,编译后的代码在处理异常事件前保

109、存现场信息,处理异常事件后对现场信息进行恢复。中断函数设计如下:处理异常事件后对现场信息进行恢复。中断函数设计如下:static void _static void _irqirq Eint3Int(void) Eint3Int(void) ClearPending(BIT_EINT3); ClearPending(BIT_EINT3); Uart_Printf(EINT3 interrupt is Uart_Printf(EINT3 interrupt is occurred.n);occurred.n); num_intnum_int=3; /=3; /设置标志位设置标志位 定义中断处理程

110、序入口地址可用下面的语句实现:定义中断处理程序入口地址可用下面的语句实现: #define pISR_EINT3#define pISR_EINT3 (*(unsigned (*(unsigned *)(_ISR_STARTADDRESS+0x2c)*)(_ISR_STARTADDRESS+0x2c)在初始化程序,引用代码在初始化程序,引用代码pISR_EINT3=(U32)Eint3IntpISR_EINT3=(U32)Eint3Int,即,即可定义地址可定义地址_ISR_STARTADDRESS+0x2c_ISR_STARTADDRESS+0x2c内容是内容是Eint3IntEint3In

111、t的地址,的地址,外部中断外部中断3 3产生请求时即可调用中断处理函数产生请求时即可调用中断处理函数Eint3IntEint3Int。第第7章章ARM异常中断处理及编程异常中断处理及编程 7.6.3 7.6.3 外中断初始化程序设计外中断初始化程序设计S3C2410XS3C2410X的中断控制寄存器能接收来自的中断控制寄存器能接收来自5656个个中断源的请求。内部的外围模块和外部管脚产中断源的请求。内部的外围模块和外部管脚产生的多个中断请求通过中断控制器冲裁后,向生的多个中断请求通过中断控制器冲裁后,向ARM920TARM920T核发出核发出FIQFIQ或者或者IRQIRQ中断。中断。ARMA

112、RM内核只有内核只有2 2个外部中断输入信号个外部中断输入信号nIRQnIRQ和和nFIQnFIQ,在具体嵌入,在具体嵌入式系统中,需要用中断控制器管理多个外部中式系统中,需要用中断控制器管理多个外部中断源,选择其中一个中断,通过断源,选择其中一个中断,通过nIRQnIRQ或或nFIQnFIQ向向ARMARM内核发出中断请求,如图内核发出中断请求,如图7.67.6所示。所示。第第7章章ARM异常中断处理及编程异常中断处理及编程 图图7.6 FIQ7.6 FIQIRQIRQ中断处理过程中断处理过程第第7章章ARM异常中断处理及编程异常中断处理及编程 ARM920TARM920T内核可以识别正常中

113、断请求和快速中断内核可以识别正常中断请求和快速中断请求两种类型的外部中断,中断的行为模式由中断控请求两种类型的外部中断,中断的行为模式由中断控制器来设置。制器来设置。S3C2410XS3C2410X的中断控制器包括的中断控制器包括6 6类寄存器:类寄存器:中断源状态寄存器、中断模式寄存器、中断屏蔽寄存中断源状态寄存器、中断模式寄存器、中断屏蔽寄存器、优先级寄存器、中断状态寄存器,以及中断偏移器、优先级寄存器、中断状态寄存器,以及中断偏移寄存器。寄存器。 在初始化程序中,需要选择相应管脚的功能,在在初始化程序中,需要选择相应管脚的功能,在此定义此定义GPF3GPF3为为EINT3EINT3模式,

114、通过外部中断控制寄存器模式,通过外部中断控制寄存器EXTINT0EXTINT0设定设定EINT3EINT3是下降沿触发方式,通过设置中断是下降沿触发方式,通过设置中断源悬挂寄存器源悬挂寄存器SRCPNDSRCPND、中断悬挂寄存器、中断悬挂寄存器INTPNDINTPND和中断和中断屏蔽寄存器屏蔽寄存器INTMSKINTMSK开启开启EINT3EINT3。中断模式寄存器和中断。中断模式寄存器和中断优先级寄存器采用系统默认方式。优先级寄存器采用系统默认方式。 第第7章章ARM异常中断处理及编程异常中断处理及编程 具体代码实现如下:具体代码实现如下:void void Eint_Init(voidE

115、int_Init(void)rGPFCONrGPFCON = ( = (rGPFCONrGPFCON & 0x3f0c)|(17); & 0x3f0c)|(17);rEXTINT0 = (rEXTINT0 & (0x712) | rEXTINT0 = (rEXTINT0 & (0x712) | 0x212;0x212; pISR_EINT3=(U32)Eint3Int;pISR_EINT3=(U32)Eint3Int; rSRCPNDrSRCPND = BIT_EINT3; = BIT_EINT3; rINTPNDrINTPND = BIT_EINT3; = BIT_EINT3;rINTMSK

116、rINTMSK=( BIT_EINT3);=( BIT_EINT3); 如果采用如果采用EINT4EINT4EINT23EINT23之间的中断源,还需要之间的中断源,还需要设置外部中断悬挂寄存器设置外部中断悬挂寄存器EINTPENDEINTPEND和外部中断掩码寄和外部中断掩码寄存器存器EINTMASKEINTMASK的相关位。的相关位。 第第7章章ARM异常中断处理及编程异常中断处理及编程 在在C C语言的语言的Main()Main()程序中调用程序中调用Eint_InitEint_Init()()函数函数,即可完成中断处理的初始,即可完成中断处理的初始化操作。化操作。 若外部下降沿信号接到若外部下降沿信号接到GPF3GPF3管管脚,就可以调用脚,就可以调用Eint3IntEint3Int中断处理中断处理函数。函数。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号