当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]基于ARM9芯片S3C2410异常中断程序设计

摘要:验证的代码详细分析了基于ARM嵌入式系统的异常处理流程。然后阐明关键字“-irq”的作用,设计出中断处理函数。最后,通过设置中断控制寄存器,设计外部中断EINT3的初始化程序,并给出主程序流程图。实践证明程序运行稳定可靠。
关键字:S3C2410 异常 –irq 中断

引言

计算机体系结构中,异常或者中断是处理系统中突发事件的一种机制,几乎所有的处理器都提供这种机制。异常主要是从处理器被动接受的角度出发的一种描述,指意外操作引起的异常。而中断则带有向处理器主动申请的意味。但这两种情况具有一定的共性,都是请求处理器打断正常的程序执行流程,进入特定程序的一种机制。若无特别说明,对“异常”和“中断”都不作严格的区分。本文结合经过实际验证的代码对ARM9中断处理流程进行分析,并设计出基于S3C2410芯片的外部中断处理程序。

1.异常中断响应和返回

系统运行时,异常可能会随时发生。当一个异常出现以后,ARM微处理器会执行以下几步操作:

1)        将下一条指令的地址存入相应连接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行。

2)        将CPSR复制到相应的SPSR中。

3)        根据异常类型,强制设置CPSR的运行模式位。

4)        强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处。

这些工作是由ARM 内核完成的,不需要用户程序参与。异常处理完毕之后,ARM微处理器会执行以下几步操作从异常返回:

1)        将连接寄存器LR的值减去相应的偏移量后送到PC中。

2)        将SPSR复制回CPSR中。

3)        若在进入异常处理时设置了中断禁止位,要在此清除。

这些工作必须由用户在中断处理函数中实现。为保证在ARM处理器发生异常时不至于处于未知状态,在应用程序的设计中,首先要进行异常处理。采用的方式是在异常向量表中的特定位置放置一条跳转指令,跳转到异常处理程序。当ARM处理器发生异常时,程序计数器PC会被强制设置为对应的异常向量,从而跳转到异常处理程序。当异常处理完成以后,返回到主程序继续执行。可以认为应用程序总是从复位异常处理程序开始执行的,因此复位异常处理程序不需要返回。

2.异常处理程序设计

2.1   异常响应流程

由于向量表的限制,只能有一条指令B完成32MB范围内的跳转,并不能保证所有的异常处理函数都位于32MB范围内。为了扩展跳转范围,需要二次跳转才能把异常处理函数的地址传送给PC。异常处理调用关系如图1所示。

三星公司网站提供了test2410_r11软件包,其中2410init.s有如下代码:

HandlerXXX

sub    sp,sp,#4   ;减少sp,保存跳转地址

stmfd  sp!,{r0}    ;将工作寄存器压入堆栈

ldr   r0,=HandleXXX ;将HandleXXX地址放入r0

ldr     r0,[r0]   ;将中断程序入口地址放入r0

str   r0,[sp,#4]  ;将中断程序入口地址压入堆栈

ldmfd   sp!,{r0,pc}  ;将工作寄存器和中断程序入口地址弹出到r0和PC

图1异常处理调用

并且在RAM中定义了存有中断程序入口地址表_ISR_STARTADDRESS:

AREA RamData, DATA, READWRITE

        ^   _ISR_STARTADDRESS

HandleReset                 #   4

HandleUndef               #   4

HandleSWI                #   4

HandlePabort           #   4

HandleDabort           #   4

HandleReserved         #   4

HandleIRQ                #   4

HandleFIQ                #   4

通常HandlerXXX位于程序入口地址32MB范围内,HandleXXX是以_ISR_STARTADDRESS为基地址的RAM中地址。该代码主要实现跳转功能,把异常处理程序地址HandleXXX送到PC中。例如产生IRQ中断时,PC会被强制设置为0x18,执行指令:b  HandlerIRQ

在HandlerIRQ程序段内,处理器做一些必要的处理,就会将_ISR_STARTADDRESS表中存放的IRQ入口地址送入PC,然后开始执行相关中断程序。由于_ISR_STARTADDRESS表存放在RAM中,后面的C语言程序可以方便地更改相关中断服务程序的内容。

2.2   异常分支

系统可能存在多个IRQ/FIQ的中断处理程序。为了从向量表入口处的跳转最终能找到正确的中断处理程序,需要设计一套处理机制和方法来实现。可以在ARM的异常向量表之外,增加一张关联中断控制器的向量表,向量表中的内容对应每个具体的中断源,可以协助跳转到不同的中断处理程序。

当响应外设的一个中断请求时,首先触发ARM核的中断,进人中断程序,再通过中断控制器识别中断源,使PC能够自动获得中断处理程序的地址。有的芯片支持特殊的硬件分支功能,依据中断源自动跳转到向量表的相应地址,多数情况下是用软件来处理异常分支。

在S3C2410体系中,中断的调用可以看成是经历了2次“中断向量表”的查询。2410init.s中的以下代码完成功能就是查询中断偏移寄存器INTOFFSET,得到当前中断的中断号,并根据中断号再调用相关的中断服务程序。

IsrIRQ

         sub    sp,sp,#4      

         stmfd         sp!,{r8-r9}      

         ldr     r9,=INTOFFSET

         ldr     r9,[r9]

         ldr     r8,=HandleEINT0

         add    r8,r8,r9,lsl #2

         ldr     r8,[r8]

         str     r8,[sp,#8]

         ldmfd         sp!,{r8-r9,pc}

为了方便C程序使用中断,将IsrIRQ设为IRQ的中断服务程序。

         ldr     r0,=HandleIRQ

         ldr     r1,=IsrIRQ

         str     r1,[r0]

其中HandleEINT0是用户自己开辟的一块存储空间的起始地址,后面按次序存放中断异常处理程序的地址,也可以理解为二级中断向量表。IsrIRQ从中断控制器处获取中断源信息,然后再从二级中断向量表中的对应地址单元得到异常中断处理程序的入口地址,完成异常响应的跳转。二级中断向量表一般位于HandleFIQ的后面,也就是以_ISR_STARTADDRESS+0x20为起始地址,这里定义了S3C2410处理器所有中断源的相关中断处理处理程序入口。这种方法的好处是用户程序在运行过程中能够动态改变异常向量。

2.3   中断函数设计

为了方便高级语言设计中断处理函数,标准的ARM指令编译器提供了一个用来声明中断处理函数的关键字-irq,使用此关键字声明的函数可以被编译器识别为中断处理函数。编译后的代码在处理异常事件前保存现场信息,处理异常事件后对现场信息进行恢复。中断函数设计如下:

static void __irq Eint3Int(void){

    ClearPending(BIT_EINT3);

Uart_Printf("EINT3 interrupt is occurred. ");

    num_int=3;设置标志位

}

定义中断处理程序入口地址:#define pISR_EINT3     (*(unsigned *)(_ISR_STARTADDRESS+0x2c))

在初始化程序,引用代码pISR_EINT3=(U32)Eint3Int,即可定义地址_ISR_STARTADDRESS+0x2c内容是Eint3Int的地址,外部中断3产生请求时即可调用中断处理函数Eint3Int。

3.外中断初始化程序设计

S3C2410X的中断控制寄存器能接收来自56个中断源的请求。内部的外围模块和外部管脚产生的多个中断请求通过中断控制器冲裁后,向ARM920T核发出FIQ或者IRQ中断。ARM内核只有2个外部中断输入信号nIRQ和nFIQ,在具体嵌入式系统中,需要用中断控制器管理多个外部中断源,选择其中一个中断,通过nIRQ或nFIQ向ARM内核发出中断请求,如图2所示。

图2 FIQ/IRQ中断处理过程

ARM920T内核可以识别正常中断请求和快速中断请求两种类型的外部中断,中断的行为模式由中断控制器来设置。S3C2410X的中断控制器包括6类寄存器:中断源状态寄存器、中断模式寄存器、中断屏蔽寄存器、优先级寄存器、中断状态寄存器,以及中断偏移寄存器。

在初始化程序中,需要选择相应管脚的功能,在此定义GPF3为EINT3模式,通过外部中断控制寄存器EXTINT0设定EINT3是下降沿触发方式,通过设置中断源悬挂寄存器SRCPND、中断悬挂寄存器INTPND和中断屏蔽寄存器INTMSK开启EINT3。中断模式寄存器和中断优先级寄存器采用系统默认方式。具体代码实现如下:

void Eint_Init(void){

rGPFCON = (rGPFCON & 0x3f0c)|(1<<7);

rEXTINT0 = (rEXTINT0 & ~(0x7<<12)) | 0x2<<12;   

pISR_EINT3=(U32)Eint3Int;   

 

图3 主程序流程图

rSRCPND = BIT_EINT3;

rINTPND = BIT_EINT3;

rINTMSK=~( BIT_EINT3);

}

如果采用EINT4~EINT23之间的中断源,还需要设置外部中断悬挂寄存器EINTPEND和外部中断掩码寄存器EINTMASK的相关位。

在C语言的Main()程序中调用Eint_Init()函数,即可完成中断处理的初始化操作。操作流程如图3所示。

若外部下降沿信号接到GPF3管脚,就可以调用Eint3Int中断处理函数。

5.结论

本文作者创新点在于采用的异常处理程序设计方式灵活可靠,可以在系统运行期间动态修改中断向量表,利用C语言也可实现中断处理函数的动态配置。在所设计的键盘处理程序中采用该方法,取得了很好地效果,该方法具有很强的通用性。

参考文献

[1] 费浙平.基于ARM 的嵌入式系统程序开发要点(二).单片机与嵌入式系统应用,2003,9:80~83

[2] 王波.ARM的三种中断调试方法的探讨.微计算机信息(嵌入式与SOC),2006,22:130~131

[3]甘泉,杨健,陈永泰.ARM处理器启动代码的分析与设计.2004年全国第五层嵌入式系统学术交流会论文集,2004:151~154

[4]张崙.嵌入式系统硬件设计与调试.北京:机械工业出版社.2005,7:279~294

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭