1、第第7章章 ARM异常中断处理及编程异常中断处理及编程 7.1 ARM异常中断处理概述异常中断处理概述7.2 ARM体系异常中断种类体系异常中断种类7.3 ARM应用系统中异常中断处理程序的安装应用系统中异常中断处理程序的安装7.4 ARM的的SWI异常中断处理程序设计异常中断处理程序设计7.5 FIG和和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_modelr_mode设置成返回
5、地址;设置成返回地址;(4 4)将程序计数器)将程序计数器(PC)(PC)值设置成该异常中断的中断向量地址,值设置成该异常中断的中断向量地址,从而跳转到相应的异常中断处理程序处执行。从而跳转到相应的异常中断处理程序处执行。接收到中断请求后,接收到中断请求后,ARMARM处理器内核会自动执行以上四处理器内核会自动执行以上四步,程序计数器步,程序计数器PCPC总是跳转到相应的固定地址。总是跳转到相应的固定地址。从异常中断处理程序中返回:从异常中断处理程序中返回:(1 1)恢复被屏蔽的程序的处理器状态;)恢复被屏蔽的程序的处理器状态;(2 2)返回到发生异常中断的指令的下一条指令处继续执行。)返回到
6、发生异常中断的指令的下一条指令处继续执行。当异常中断发生时,程序计数器当异常中断发生时,程序计数器PCPC所指的位置对于各种不同所指的位置对于各种不同的异常中断是不同的,同样,返回地址对于各种不同的异常的异常中断是不同的,同样,返回地址对于各种不同的异常中断也是不同的。中断也是不同的。第第7章章 ARM异常中断处理及编程异常中断处理及编程 7.2 ARM体系异常中断种类体系异常中断种类 ARM处理器中主要有处理器中主要有7个异常(个异常(2个中断异常)个中断异常)复位(复位(RESET)未定义的指令未定义的指令 软件中断软件中断 指令与取终止(指令与取终止(PrefechAbort)数据访问终
7、止(数据访问终止(DATAABORT)外部中断请求外部中断请求(IRQ)快速中断请求(快速中断请求(FIQ)第第7章章 ARM异常中断处理及编程异常中断处理及编程 7.2.1异常中断向量表及异常中断优先级异常中断向量表及异常中断优先级 在在ARMARM体系中,体系中,异常中断向量表的大小异常中断向量表的大小为为3232字节字节,每异常中断占,每异常中断占4 4个字节。个字节。每个异常中断对应的中断向量表中的每个异常中断对应的中断向量表中的4 4个个字节的空间中存放了字节的空间中存放了一条跳转指令或者一条一条跳转指令或者一条向向PCPC寄存器中赋值的数据访问指令寄存器中赋值的数据访问指令。第第7
8、章章 ARM异常中断处理及编程异常中断处理及编程 第第7章章 ARM异常中断处理及编程异常中断处理及编程 1复位异常复位异常 在以在以ARM为核的系统中,引起复位的原因有:为核的系统中,引起复位的原因有:上电复位上电复位 复位引脚上的复位脉冲复位引脚上的复位脉冲 对系统电源检测发现过压或欠压。对系统电源检测发现过压或欠压。时钟异常复位。时钟异常复位。ARM处理器复位后,将进行以下操作:处理器复位后,将进行以下操作:强制进入管理模式;强制进入管理模式;强制进入强制进入ARMARM状态;状态;跳转到绝对地址跳转到绝对地址PC=0 x00000000PC=0 x00000000处执行;处执行;禁止禁
9、止IRQIRQ中断和中断和FIQFIQ中断。中断。第第7章章 ARM异常中断处理及编程异常中断处理及编程 复位后,程序状态寄存器如下:复位后,程序状态寄存器如下:.IFTM4M3M2M1M0 110 10011 上电复位后,进入管理模式,执行操作系统程序,上电复位后,进入管理模式,执行操作系统程序,一般用做对系统初始化,例如开中断等;然后切换一般用做对系统初始化,例如开中断等;然后切换到用户模式,开始执行正常的用户程序。到用户模式,开始执行正常的用户程序。第第7章章 ARM异常中断处理及编程异常中断处理及编程 切换到用户模式可使用下列程序:切换到用户模式可使用下列程序:MRS R0,CPSR
10、;读状态寄存器;读状态寄存器 BIC R0,R0,#03;把末两位清;把末两位清0 MSR CPRS_c,R0;把修改后的值加载给;把修改后的值加载给 ;状态寄存器,切换结束;状态寄存器,切换结束 .;用户程序;用户程序第第7章章 ARM异常中断处理及编程异常中断处理及编程 2未定义指令异常未定义指令异常 ARMARM的未定义指令异常有以下两种情况:的未定义指令异常有以下两种情况:(1 1)遇到一条没有定义指令;)遇到一条没有定义指令;(2 2)执行一条对协处理器的操作指令没有应答。)执行一条对协处理器的操作指令没有应答。未定义异常中断时,状态寄存器中的未定义异常中断时,状态寄存器中的F F位
11、不变。位不变。使用下列指令退出异常中断,返回原程序使用下列指令退出异常中断,返回原程序 。把下一条指令的地址拷贝给把下一条指令的地址拷贝给LRLR;把程序状态寄存器把程序状态寄存器CPSRCPSR拷贝给拷贝给SPSR_undSPSR_und;强制进入未定义模式;强制进入未定义模式;强制进入到强制进入到ARMARM模式;模式;跳转到绝对地址跳转到绝对地址PC=0 x00000004PC=0 x00000004处执行;处执行;禁止禁止IRQIRQ中断。中断。第第7章章 ARM异常中断处理及编程异常中断处理及编程 进入中断后,程序状态寄存器如下:进入中断后,程序状态寄存器如下:.IF T M4M3M
12、2M1M0 1 x 0 1 10 1 1 未定义异常中断返回时,使用下列指令未定义异常中断返回时,使用下列指令返回到原中断处:返回到原中断处:MOVS PC,R14.第第7章章 ARM异常中断处理及编程异常中断处理及编程 3软件中断异常软件中断异常 是由指令是由指令SWI引起的。程序在执行这一引起的。程序在执行这一指令后,进入异常中断。处理器响应中断,硬指令后,进入异常中断。处理器响应中断,硬件执行如下的操作:件执行如下的操作:把下一条指令的地址拷贝给把下一条指令的地址拷贝给LRLR;把程序状态寄存器把程序状态寄存器CPSRCPSR拷贝给拷贝给SPSR_svcSPSR_svc;强制进入管理模式
13、;强制进入管理模式;强制进入到强制进入到ARMARM状态;状态;跳转到绝对地址跳转到绝对地址PC=0 x00000008PC=0 x00000008处执行;处执行;禁止禁止IRQIRQ中断。中断。第第7章章 ARM异常中断处理及编程异常中断处理及编程 进入中断后的程序状态寄存器如下:进入中断后的程序状态寄存器如下:.IF T M4M3M2M1M0 1 x 0 1 00 1 1软件中断处理程序完成后,使用下列指令返软件中断处理程序完成后,使用下列指令返回到原中断处:回到原中断处:MOVS PC,R14第第7章章 ARM异常中断处理及编程异常中断处理及编程 4 4预取指中止异常预取指中止异常 程序
14、存储器引起的中止异常叫做预取指中止异常;程序存储器引起的中止异常叫做预取指中止异常;数据存储器引起的中止异常叫做数据中止异常。数据存储器引起的中止异常叫做数据中止异常。有两种可能如下:有两种可能如下:当执行这条指令前程序发生跳转,则这条无效指当执行这条指令前程序发生跳转,则这条无效指令不引起异常中断;令不引起异常中断;当执行到这条指令时,处理器会发生预取指中止当执行到这条指令时,处理器会发生预取指中止异常,引起中断。异常,引起中断。第第7章章 ARM异常中断处理及编程异常中断处理及编程 当进入预取指异常中断时,处理器硬件响应中当进入预取指异常中断时,处理器硬件响应中断,执行以下的操作:断,执行
15、以下的操作:把中断时把中断时PCPC的地址拷贝给的地址拷贝给LRLR;把程序状态寄存器把程序状态寄存器CPSRCPSR拷贝给拷贝给SPSR_abtSPSR_abt;强制进入中止异常模式;强制进入中止异常模式;强制进入到强制进入到ARMARM状态;状态;跳转到绝对地址跳转到绝对地址PC=0 x0000000CPC=0 x0000000C处执行;处执行;禁止禁止IRQIRQ中断。中断。第第7章章 ARM异常中断处理及编程异常中断处理及编程 进入中断后,程序状态寄存器如下:进入中断后,程序状态寄存器如下:.IF T M4M3M2M1M0 1 x 0 1 01 1 1 预取指中止异常中断返回时,应该预
16、取指中止异常中断返回时,应该执行下列指令:执行下列指令:SUBS PCSUBS PC,R14R14,#4.#4.第第7章章 ARM异常中断处理及编程异常中断处理及编程 5数据中止异常数据中止异常 ARM处理器访问数据存储器时,在读取数据的同时处理器访问数据存储器时,在读取数据的同时数据存储器发出了中止信号,引起数据中止异常。数据存储器发出了中止信号,引起数据中止异常。数据中止异常中断服务程序返回时,用下列指令:数据中止异常中断服务程序返回时,用下列指令:SUBS PC,R14,#8 上述指令是返回到中断时所执行的指令,目的是再上述指令是返回到中断时所执行的指令,目的是再一次从数据存储器中读取数
17、据。如果不再一次读取数一次从数据存储器中读取数据。如果不再一次读取数据,则执行下一条指令,此时使用下列指令返回:据,则执行下一条指令,此时使用下列指令返回:SUBS PC,R14,#4第第7章章 ARM异常中断处理及编程异常中断处理及编程 当进入数据中止异常中断时,处理器硬件响应中当进入数据中止异常中断时,处理器硬件响应中断,执行以下的操作:断,执行以下的操作:把中断时的把中断时的PC的地址拷贝给的地址拷贝给LR;把程序状态寄存器把程序状态寄存器CPSR拷贝给拷贝给SPSR_abt;强制进入中止异常模式;强制进入中止异常模式;强制进入到强制进入到ARM状态;状态;跳转到绝对地址跳转到绝对地址P
18、C=0 x00000010处执行;处执行;禁止禁止IRQ中断。中断。第第7章章 ARM异常中断处理及编程异常中断处理及编程 进入中断后,程序状态寄存器如下:进入中断后,程序状态寄存器如下:.IF T M4M3M2M1M0 1 x 0 1 01 1 1第第7章章 ARM异常中断处理及编程异常中断处理及编程 6中断请求(中断请求(IRQ)异常)异常 当当I=1时。则屏蔽时。则屏蔽IRQ中断,当中断,当I=0时,则允许时,则允许中断。处理器复位后置中断。处理器复位后置I为为1,关闭中断。,关闭中断。ARM系统中外设通过该异常中断请求处理服务。系统中外设通过该异常中断请求处理服务。例如:定时器中断、串
19、行口通讯中断、外部信号例如:定时器中断、串行口通讯中断、外部信号中断和中断和A/D处理中断等。处理中断等。IRQ中断是可屏蔽的。在中断是可屏蔽的。在状态寄存器中的状态寄存器中的I位就是位就是IRQ的屏蔽位。的屏蔽位。第第7章章 ARM异常中断处理及编程异常中断处理及编程 当发生当发生IRQ中断时,处理器硬件响应中断,中断时,处理器硬件响应中断,执行下列操作:执行下列操作:把中断时的把中断时的PC的地址值拷贝给的地址值拷贝给LR;把程序状态寄存器把程序状态寄存器CPSR拷贝给拷贝给SPSR_irq;强制进入强制进入IRQ异常模式;异常模式;强制进入到强制进入到ARM状态;状态;跳转到绝对地址跳转
20、到绝对地址PC=0 x00000018处执行;处执行;禁止禁止IRQ中断。中断。第第7章章 ARM异常中断处理及编程异常中断处理及编程 进入中断后,程序状态寄存器如下:进入中断后,程序状态寄存器如下:.IF T M4M3M2M1M0 1 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跳转为例说明解析过程,假定中断向量表定义跳转为例说明解析过程,假定中断向量表定义在在0 x004000000 x00400000开始的外部开始的外部RAMRAM空间,中断解析示例流程如图空间,中断解析示例流程如图7.2 7.2 所示。所示。图中实线表示的流程都用图中实线表示的流程都用ARMARM
22、汇编语言编写,一般作为汇编语言编写,一般作为bootboot代码的一部分放在系统的底层模块中。填写向量表的操作代码的一部分放在系统的底层模块中。填写向量表的操作可以在上层应用程序中方便地实现,比如在可以在上层应用程序中方便地实现,比如在C C语言中:语言中:*(intint *(0 x00400018)=(0 x00400018)=(intint)ISR_IRQ)ISR_IRQ;这样就将;这样就将IRQIRQ中断的服务程序中断的服务程序入口地址(入口地址(0 x003002600 x00300260)填写到中断向量表中的固定地址)填写到中断向量表中的固定地址0 x004000180 x0040
23、0018开始的开始的4 4字节空间了。字节空间了。这样就可避免在应用程序中计算中断的跳转地址,并可这样就可避免在应用程序中计算中断的跳转地址,并可很方便的选择不同的函数作为指定中断的服务程序。当然,在很方便的选择不同的函数作为指定中断的服务程序。当然,在程序开发时要合理开辟好向量表,避免对向量表地址空间不必程序开发时要合理开辟好向量表,避免对向量表地址空间不必要的写操作。要的写操作。第第7章章 ARM异常中断处理及编程异常中断处理及编程 第第7章章 ARM异常中断处理及编程异常中断处理及编程(3 3)解析程序的扩展)解析程序的扩展 在在ARMARM处理器中会包含很多中断源,通常处理器中会包含很
24、多中断源,通常会在会在ARMARM内核外面扩展一个中断控制器来管理内核外面扩展一个中断控制器来管理各种原因产生的中断。各种原因产生的中断。如,三星公司的如,三星公司的S S3C4510B3C4510B处理器中的处理器中的IRQ/FIQIRQ/FIQ类型的中断源可以有类型的中断源可以有2121个个 S S3C44B0X3C44B0X有有2626个。个。解析程序的扩展解析程序的扩展处理流程可用图处理流程可用图7.37.3表示。表示。第第7章章 ARM异常中断处理及编程异常中断处理及编程 7.3 中断解析的扩展处理流程中断解析的扩展处理流程第第7章章 ARM异常中断处理及编程异常中断处理及编程(4)
25、(4)向量中断的处理向量中断的处理 在设计外部扩展的中断控制器时提供了一种叫在设计外部扩展的中断控制器时提供了一种叫做做“向量中断向量中断”的中断跳转机制。与前面叙述的扩的中断跳转机制。与前面叙述的扩展解析跳转流程有所不同,它不需要软件来识别具展解析跳转流程有所不同,它不需要软件来识别具体的中断源,也就是不需要添加图体的中断源,也就是不需要添加图7.37.3中的中的IRQ/FIQIRQ/FIQ服务程序,而完全由硬件自动跳转到对应的中断地服务程序,而完全由硬件自动跳转到对应的中断地址。其它跳转流程的原理都是一样的。这相当于扩址。其它跳转流程的原理都是一样的。这相当于扩展了展了ARMARM内核的硬
26、件中断向量表,减小了中断响应内核的硬件中断向量表,减小了中断响应延时。以延时。以S3C2410XS3C2410X处理器的外部中断处理器的外部中断0 0为例,需要为例,需要在其对应的硬件固定跳转地址在其对应的硬件固定跳转地址0 x000000200 x00000020处添加指处添加指令:令:ldrldr pc,=pc,=HandlerEINTHandlerEINT,使得程序跳转到其服务,使得程序跳转到其服务程序程序HandlerEINT0HandlerEINT0处执行。向量中断的处理如图处执行。向量中断的处理如图7.47.4所示。所示。第第7章章 ARM异常中断处理及编程异常中断处理及编程 图图
27、7.4 向量中断的处理向量中断的处理 第第7章章 ARM异常中断处理及编程异常中断处理及编程 7.3 ARM应用系统中异常中断处理程序的安装应用系统中异常中断处理程序的安装 在在ARM应用程序中安装异常中断处理程序通常有下应用程序中安装异常中断处理程序通常有下列两种方法。列两种方法。使用跳转指令:可以在异常中断对应异常向量表使用跳转指令:可以在异常中断对应异常向量表中特定位置放置一条跳转指令,直接跳转到该异常中中特定位置放置一条跳转指令,直接跳转到该异常中断的处理程序。但只能在断的处理程序。但只能在32M32M空间范围内跳转。空间范围内跳转。使用数据读取指令使用数据读取指令LDRLDR:使用数
28、据读取指令:使用数据读取指令LDRLDR向程序计数器向程序计数器PCPC中直接赋值。这种方法分为两步:先中直接赋值。这种方法分为两步:先将异常中断处理程序的绝对地址存放在距离向量表将异常中断处理程序的绝对地址存放在距离向量表4KB4KB范围内的一个存储单元中;再使用数据读取指令范围内的一个存储单元中;再使用数据读取指令LDRLDR将该单元的内容读取到程序计数器将该单元的内容读取到程序计数器PCPC中。中。第第7章章 ARM异常中断处理及编程异常中断处理及编程 7.3.1 在系统复位时安装异常中断处理程序在系统复位时安装异常中断处理程序 1地址地址0 x00处为处为ROM的情况的情况 当地址当地
29、址0 x00 x0处为处为ROMROM时时:在异常中断向量表中,可以使用数据读取在异常中断向量表中,可以使用数据读取指令指令LDRLDR直接向程序计数器直接向程序计数器PCPC中赋值,也可以中赋值,也可以直接使用跳转指令跳转到异常中断处理程序。直接使用跳转指令跳转到异常中断处理程序。第第7章章 ARM异常中断处理及编程异常中断处理及编程 使用数据读取指令使用数据读取指令LDR的示例如下所示:的示例如下所示:Vector_Init_BlockLDR PC,Reset_AddrLDR PC,Undefined_AddrLDR PC,SW_AddrLDR PC,Prefeth_AddrLDR PC,
30、Abort_AddrNOPLDR PC,IRQ_AddrLDR PC,FIQ_AddrReset_Addr DCD Start_Boot第第7章章 ARM异常中断处理及编程异常中断处理及编程 Undefined_Addr DCD Undefined_HandleSW_Addr DCD SWI_HandlePrefeth_Addr DCD Prefeth_HandleAbort_Addr DCD Abort_Handle DCD 0IRQ_Addr DCD IRQ_HandleFIQ_Addr DCD FIQ_Handle第第7章章 ARM异常中断处理及编程异常中断处理及编程 使用跳转指令的示例
31、如下所示:使用跳转指令的示例如下所示:Vector_Init_BlockVector_Init_BlockBL BL Reset_HandleReset_HandleBL BL Undefined_HandleUndefined_HandleBL BL SWI_HandleSWI_HandleBL BL Prefeth_HandlePrefeth_HandleBL BL Abort_HandleAbort_HandleNOPNOPBL BL IRQ_HandleIRQ_HandleBL BL FIQ_HandleFIQ_Handle第第7章章 ARM异常中断处理及编程异常中断处理及编程 2.地
32、址地址0 x00处为处为RAM的情况的情况 当地址当地址0 x00 x0处为处为RAMRAM时,时,中断向量表必须使用数据中断向量表必须使用数据读取指令直接指向读取指令直接指向PCPC中赋中赋值的形式。而且,必须使值的形式。而且,必须使用下面的代码把中断向量用下面的代码把中断向量表从表从ROMROM中复制到中复制到RAMRAM的的地址地址0 x000 x00开始处的存储空开始处的存储空间中。中断向量表从间中。中断向量表从ROMROM中复制到中复制到RAMRAM的的代码段如下:代码段如下:MOV r8MOV r8,#0#0ADR r9ADR r9,Vector_Init_BlockVector_
33、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!STMIA r8!,r0-r7r0-r7第第7章章 ARM异常中断处理及编程异常中断处理及编程 7.3.2 在在C程序中安装异常中断处理程序程序中安装异常中断处理程序安装异常中断处理程序的方法。安装异常中断处理程序的方法。1中断向量表中使用跳转
34、指令的情况中断向量表中使用跳转指令的情况 当中断向量表中使用跳转指令时,在当中断向量表中使用跳转指令时,在C 程序中安装异常中程序中安装异常中断处理程序的操作如下:断处理程序的操作如下:(1 1)读取中断处理程序的地址。)读取中断处理程序的地址。(2 2)从上一步得到的地址中减去该异常中断对应的中断向量)从上一步得到的地址中减去该异常中断对应的中断向量的地址。的地址。(3 3)从上一步得到的地址中减去)从上一步得到的地址中减去8 8,以允许指令预取。,以允许指令预取。(4 4)将上一步得到的地址右移)将上一步得到的地址右移 2 2位,得到以字(位,得到以字(3232位)为单位)为单位的偏移量。
35、位的偏移量。(5 5)确保上一步得到的地址值高)确保上一步得到的地址值高8 8位为位为0 0,因为跳转指令只允,因为跳转指令只允许许2424位的偏移量。位的偏移量。(6 6)将上一步得到的地址与数据)将上一步得到的地址与数据0 xea00 00000 xea00 0000作逻辑或,从而作逻辑或,从而得到将要写到中断向量表中的跳转指令的编码。得到将要写到中断向量表中的跳转指令的编码。第第7章章 ARM异常中断处理及编程异常中断处理及编程 例例7.1 使用跳转指令的中断向使用跳转指令的中断向量表量表unsigned Install_Handler(unsigned routine,unsigned
36、*vector)/*在中断向量表中在中断向量表中vector处,处,添上合适的跳转指令添上合适的跳转指令*/*该跳转指令跳转到中断处理该跳转指令跳转到中断处理程序程序routine处。处。*/*程序返回原来的中断向量程序返回原来的中断向量*/unsigned vec,oldvec;vec=(routine(unsigned)vector 0 x8)2);if(vec&oxff000000)printf(“Installation of Handler failed“);exit(1);vec=oxea000000|vec;oldvec=*vector;*vector=vec;return(ol
37、dvec);第第7章章 ARM异常中断处理及编程异常中断处理及编程 2 2中断向量表中使用数据读取指令的情况中断向量表中使用数据读取指令的情况 当中断向量表中使用数据读取指令时,在当中断向量表中使用数据读取指令时,在C C 程序中程序中安装异常中断处理程序的操作过程如下:安装异常中断处理程序的操作过程如下:(1 1)读取中断处理程序的地址。)读取中断处理程序的地址。(2 2)从上一步得到的地址中减去该异常中断对应的中)从上一步得到的地址中减去该异常中断对应的中断向量的地址。断向量的地址。(3 3)从上一步得到地址中减去)从上一步得到地址中减去8 8,以允许指令预取。,以允许指令预取。(4 4)
38、将上一步得到地址与数据)将上一步得到地址与数据0 xe59f f0000 xe59f f000作逻辑或,从作逻辑或,从而得到将要写到中断向量表中的数据读取指令的编码。而得到将要写到中断向量表中的数据读取指令的编码。(5 5)将中断处理程序的地址放到相应的存储单元。)将中断处理程序的地址放到相应的存储单元。第第7章章 ARM异常中断处理及编程异常中断处理及编程 例例7.2 使用数据读取指令的中断向量表使用数据读取指令的中断向量表unsigned Install_Handler(unsigned location,unsigned*vector)/*在中断向量表中在中断向量表中vectorvect
39、or处,添上合适的指令处,添上合适的指令LDR pc,pc,LDR pc,pc,#offset#offset */*该指令跳转的目标地址存放在存储单元该指令跳转的目标地址存放在存储单元locationlocation中中 */*函数返回原来的中断向量函数返回原来的中断向量*/unsigned vec,oldvec;vec=(unsigned)location (unsigned)vector 0 x8)|0 xe59ff000;oldvec=*vector;*vector=vec;return(oldvec);第第7章章 ARM异常中断处理及编程异常中断处理及编程 用下面的语句调用例用下面的语
40、句调用例7.27.2的函数,实现用的函数,实现用C C语言程序完成中断处理程序的安装。语言程序完成中断处理程序的安装。unsigned unsigned*irqvecirqvec=(unsigned =(unsigned*)0 x18;)0 x18;Install_HandlerInstall_Handler(unsigned)(unsigned)IRQHandlerIRQHandler,irqvecirqvec););第第7章章 ARM异常中断处理及编程异常中断处理及编程 7.4 ARM的的SWI异常中断处理程序设计异常中断处理程序设计 通过通过SWISWI异常中断指令,用户模式下应用程序可
41、以异常中断指令,用户模式下应用程序可以调用系统模式下的代码。在实时操作系统中,通常使用调用系统模式下的代码。在实时操作系统中,通常使用SWISWI异常中断为用户应用程序提供系统功能调用。异常中断为用户应用程序提供系统功能调用。7.4.1 SWI7.4.1 SWI异常中断处理程序的实现异常中断处理程序的实现 在在SWISWI指令中包括一个指令中包括一个2424位的立即数(中断调用位的立即数(中断调用号),该立即数指示了用户要请求的特定的调用功能,号),该立即数指示了用户要请求的特定的调用功能,所以在所以在SWISWI的异常中断中要读取这个中断调用号,然后的异常中断中要读取这个中断调用号,然后根据
42、中断号,来调用相应的处理程序。这个过程可以分根据中断号,来调用相应的处理程序。这个过程可以分两步:第两步:第1 1步是步是SWISWI中断处理程序为汇编,用于确定中断处理程序为汇编,用于确定SWISWI指令中的指令中的2424位的立即数;第位的立即数;第2 2步是步是SWISWI异常中断处理的功异常中断处理的功能服务程序,是具体实现能服务程序,是具体实现SWISWI的各个功能,它即可用汇的各个功能,它即可用汇编语言,也可用编语言,也可用C C语言编程。语言编程。第第7章章 ARM异常中断处理及编程异常中断处理及编程 1.第第1步用汇编语言编写的步用汇编语言编写的SWI异常中断处理程序异常中断处
43、理程序 由于是在底层操作,所以这个异常中断处理程序由于是在底层操作,所以这个异常中断处理程序得用汇编语言编写,例得用汇编语言编写,例7.37.3所示的所示的SWISWI异常中断处理程异常中断处理程序中的序中的bl bl swi_service_funcswi_service_func指令是调用第指令是调用第2 2步的步的SWISWI异常异常中断处理的功能服务程序,此函数是用于实现中断处理的功能服务程序,此函数是用于实现SWISWI的的各个功能。各个功能。第第7章章 ARM异常中断处理及编程异常中断处理及编程 例例7.3 7.3 汇编语言编写的第汇编语言编写的第1 1步步SWISWI异常中断处理
44、程序异常中断处理程序area area top_switop_swi code code readonlyreadonlyexport export swi_headlerswi_headlerswi_headlerswi_headlerstmfdstmfd sp!,r0-r12,sp!,r0-r12,lr lr;保存保存r0r0至至r12,lrr12,lr的寄存器值的寄存器值ldrldr r0,r0,lr lr,#-4;,#-4;从存储器中取得从存储器中取得SWISWI指令的所在地址指令的所在地址bicbic r0,r0,#FF000000;r0,r0,#FF000000;读取读取2424位
45、中断调用号位中断调用号movmov r1,sp r1,sp;=;=bl bl swi_service_funcswi_service_func;调用功能服务函数,见下面调用功能服务函数,见下面;中断调用号通过中断调用号通过r0r0寄存器传入寄存器传入;参数通过参数通过r1r1寄存器传入寄存器传入;=;=ldmfdldmfd sp!,r0-r12,pc;sp!,r0-r12,pc;恢复调用前恢复调用前r0r0至至r12r12,退出,退出endend第第7章章 ARM异常中断处理及编程异常中断处理及编程 2.SWI2.SWI异常中断处理的中断服务程序异常中断处理的中断服务程序 为了具体实现为了具体
46、实现SWISWI的各个功能,需编写的各个功能,需编写SWISWI异常中断处理的功能服务程序,它即可用异常中断处理的功能服务程序,它即可用汇编语言,也可用汇编语言,也可用C C语言编程。例语言编程。例7.47.4是用汇编是用汇编语言编写的语言编写的SWISWI异常中断处理的中断服务程序,异常中断处理的中断服务程序,例例7.57.5是用是用C C语言编写的语言编写的SWISWI异常中断处理的中断异常中断处理的中断服务程序。服务程序。第第7章章 ARM异常中断处理及编程异常中断处理及编程 例例7.4 7.4 汇编语言编写的汇编语言编写的SWISWI异常中断处理程序异常中断处理程序area area
47、toplevelswitoplevelswi code code readonlyreadonlyexport export swi_headlerswi_headlerswi_headlerswi_headlerstmfdstmfd sp!,r0-r12,sp!,r0-r12,lr lr;保存;保存r0r0至至r12,lrr12,lr的寄存器值的寄存器值ldrldr r0,r0,lr lr,#-4,#-4;从存储器中取得从存储器中取得SWISWI指令的所在地址指令的所在地址bicbic r0,r0,#FF000000 r0,r0,#FF000000;读取读取2424位中断调用号位中断调用号m
48、ovmov r1,sp r1,sp;判断立即数是否有效;判断立即数是否有效cmpcmp R0,#MaxOfSWI R0,#MaxOfSWI;判;判R0R0中数是否有效超过允许的最大值中数是否有效超过允许的最大值 ldrls pc,pc,r0,lsl#2 ldrls pc,pc,r0,lsl#2 b OutOfSWIRange b OutOfSWIRange ;超出范围;超出范围 JumpListofSWI JumpListofSWI ;SWISWI的跳转表的跳转表dcd SWIPro_0dcd SWIPro_0;SWISWI对应立即数对应立即数0 0的中断处理程序入口地址的中断处理程序入口地址
49、dcddcd SWIPro_1 SWIPro_1 ;SWISWI对应立即数对应立即数1 1的中断处理程序入口地的中断处理程序入口地址址第第7章章 ARM异常中断处理及编程异常中断处理及编程;其他所有的软中断入口;其他所有的软中断入口 SWIPro_0 SWIPro_0;进入;进入SWISWI对应立即数对应立即数0 0的中断处理程序的中断处理程序 ;对应立即数;对应立即数0 0 的中断处理程序的中断处理程序 b b EndOfSWIEndOfSWI SWIPro1 SWIPro1;进入;进入SWISWI对应立即数对应立即数1 1的中断处理程序的中断处理程序;对应立即数;对应立即数1 1 的中断处
50、理程序的中断处理程序 b b EndOfSWIEndOfSWI ;其他的;其他的SWI SWI 处理程序处理程序 EndOfSWIEndOfSWI ;结束;结束SWI SWI 中断处理程序中断处理程序ldmfdldmfd sp!,r0-r12,pc;sp!,r0-r12,pc;恢复调用前的恢复调用前的r0r0至至r12r12,退出中断,退出中断程序程序endend第第7章章 ARM异常中断处理及编程异常中断处理及编程 例例7.5 7.5 用用C C语言编写的第语言编写的第2 2步步SWISWI异常中断异常中断处理的中断服务程序处理的中断服务程序 用用C C语言编写的第语言编写的第2 2步步SW