基于ARM处理器的高效异常处理的解决方案
2015-03-27 来源:ck365
1 异常概述
嵌入式系统中异常/中断是指由处理器内部或外部源产生并引起系统处理的一个事件。根据事件源的不同将异常分为“异常”和“中断”两种,异常指由处理器内部源所引起的事件,如非法指令执行异常,地址访问异常等;中断指由处理器外部中断源引起的事件。嵌入式处理器对外部中断源一般由中断控制器进行统一管理并上报处理器。对于嵌入式系统,异常/中断均会导致处理器打断正常的程序执行流程,进入特定模式进行相应的异常处理。因此,对“异常”和“中断”一般不作严格区分。
作为嵌入式处理器,为了确保系统的实时性和程序执行的稳定性,ARM处理器支持完整的异常处理机制。ARM处理器共有7种异常类型,每种异常都有自己固定的异常向量地址,且在异常产生后,处理器会切换至相应的异常中断模式,具体描述如表1所示。
ARM支持多中断嵌套,因此各异常有固定的优先级,依次为:复位、数据中止、FIQ、IRQ、预取指中止、未定义指令和SWI。各异常向量之间只有4 bit的空间,因此向量表中只能放置跳转指令。通常异常处理结构如图1所示。
2 异常的响应和返回过程
2.1 异常的响应
当7种异常中的任何一个在允许响应的前提下发生时,处理器会进行必要的预处理,其动作如下:
(1)前程序状态字(Thc Current Program Status Register,CPSR)到各异常对应的备份程序状态字(The Saved Program Status Regis ter,SPSR)中。
(2)PSR中的控制位,使处理器进入相应的异常中断模式,同时切换程序状态为ARM状态,禁止IRQ中断,若异常响应为复位异常或FIQ异常,则还要禁止FIQ中断。
(3)回地址,并保存到相应的LR寄存器中。
(4)量地址入PC,跳转并执行中断服务程序。
2.2 异常的返回
异常返回在异常服务程序完成后执行,内核需要用户自行完成以下返回动作:(1)PSR寄存器的内容返还给CPSR寄存器。(2)R寄存器的值赋给PC。(3)入中断服务程序时保存了部分通用寄存器的值,此时需恢复这些被保存的通用寄存器的值,且在清除中断禁止位。
3 异常服务程序的设计
LPC3250硬件平台,板上集成两级中断控制,共支持74路中断源。其中一级中断控制器可接收32路外部中断请求,所有中断通过FIQ或IRQ中断信号通知ARM核,因此需中断控制器管理所有外部中断源。
中断控制器中,ATR(Activation Type Register)寄存器用于设置中断的触发方式,外部中断支持沿触发和电平触发;APR(Activation Polarity Register)寄存器用于确定中断类型,支持高电位有效和低电位有效;ITR(Interrupt Type Register)寄存器用于设置中断方式,包括FIQ和IRQ两种,其中FIQ的响应速度和优先级高于IRQ,支持数据传输或信道处理,通过独有的寄存器来减少占用其他寄存器,通常嵌入式系统将所有外部中断采用IRQ异常中断模式管理;IER(InterruptEnable Register)寄存器用于对外部中断进行屏蔽或使能;RSR(Raw Stat us Register)寄存器用于描述当前所有中断源状态。
中断源产生中断时,处理器从IRQ或FIQ异常入口开始执行处理例程。通常嵌入式系统根据中断源的差异存在不同的中断服务程序,为了正确判断出具体的中断源,设计在异常向量表之外,系统维护关联中断控制器的中断向量表,结构如表2所示。
中断向量表,用于存放具体中断源对应的中断服务程序的入口地址。当响应外设中断请求时,进入中断服务程序通过中断控制器识别中断源,并根据中断向量表执行处理例程。
LPC3250平台设计,不通过中断控制器进行中断源的优先级控制,通过RSR寄存器获取中断源状态后,由系统软件进行中断源优先级配置。中断处理中由系统选择当前最高优先级中断,并进入对应中断源的中断处理例程,中断处理过程如图2所示。
4 异常服务程序的实现
嵌入式实时操作系统中,无论是实时响应并处理来自各个被控对象的实时信息,还是对任务执行时间的管理、资源的限时等待等,均需要时钟的参与。因此,准确且具有足够精度的时钟对于实时系统必不可少。
每次时钟中断发生,时钟中断服务程序都会被执行。因此时钟中断服务程序执行的频率很高,每个系统周期都会被执行,这要求程序的处理高效、简洁。
由于ARM处理器中FIQ的响应速度和优先级均高于IRQ,因此采用FIQ方式实现对处理器时钟中断的处理,其他外部中断由IRQ异常统一管理,异常处理结构图如图3所示。
嵌入式时钟常用于向操作系统通过调度单位,因此中断状态会持续直至完成调度处理,处理完成后由时钟源进行中断清除,以开始下一周期计时。根据应用需求,时钟中断应设置为电平触发方式,通过APR和ATR寄存器,设置该时钟为高电平触发模式。通过ITR寄存器,设置该时钟为FIQ中断方式。
LPC3250处理器可配置多路时钟源,以μs级时钟(Millisecond Timer)为例,根据应用需求,在中断控制器中对该中断源进行以下主要设置:
Write(VIC_APR,0x3FF0EFF8);//通过APR寄存器MSTIMER_INT位置1,设置Millisecond Timer中断为高电位有效
write(VIC_ATR,0xFEFFFFFF);//通过ATR寄存器MSTIMER_INT位置0,设置Millisecond Timer为电平触发
write(VIC_ITR,0x08000000);//通过ITR寄存器MSTIMER_INT位置1,设置Millisecond Timer为FIQ中断方式
中断控制器中设置完成后,当发生时钟中断时,PC指向FIQ的异常向量入口0x1C处,由于FIQ的向量入口为ARM处理器7种异常向量的尾地址,因此无需通过跳转指令进行处理例程的跳转。在该入口处对中断进行以下主要处理:
sub lr,lr,#4计算返回地址
stmfd sp!,{ri-rm,lr}保存使用到的寄存器
…
mov lr,pc
ldr pc,=IntHandler
…
Ldmfd sp!,{ri-rm,pc}中断返回,表示将SPSR的值赋给CPSR
其中IntHandler为中断处理接口,主要完成为嵌入式操作系统提供基本的调度周期以及时钟中断源中断状态的清除。
完成时钟中断源的清除,需设置定时器中ISR(Millisecond Timer Interrupt Status register)寄存器,具体设置如下:
write(MSTIMER_ISR,0x1);//通过时钟中ISR寄存器MATCH0_INT位置1,清除时钟中断源
5 功能及性能测试
在完成设计、编码及交叉编译后,对该异常机制在LPC3250目标机上的运行的情况进行功能和性能测试。
5.1 功能测试
采用FIQ模式进行定时器中断处理,操作系统可正确获取调度周期,表明该中断处理功能正确。
5.2 性能测试
由于采用FIQ中断模式进行时钟中断处理,在异常入口处无需额外的跳转操作,直接进行时钟中断处理。且设计中FIQ只用于时钟中断,因此无需从中断控制器获取中断号的获取,减少了中断处理指令,进而降低了处理时间。LPC3250平台处理器主频为266MHz,处理器时钟周期为1/266μs,以1/1 000 s为单位向操作系统提供调度周期为例,总线周期误差累计实验数据如图4所示。
实验中,随着采样调度周期数的不断增加,IRQ模式下时钟计时与理论值的处理器时钟周期偏差数较FIQ模式明显偏多,FIQ模式计时比IRQ模式更接近实际计时。结果表明,通过FIQ模式进行的时钟中断较IRQ方式更精确。
6 结束语
本文提出一种高效的异常处理方案,并以时钟为例进行了验证。通过实现验证,采用上述FIQ中断模式所设计的时钟中断控制程序,较IRQ模式的时钟中断方式更为高效,能为嵌入式系统提供更为精确的调度周期,实验效果与预期相符。