




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 计算机体系结构中,异常或者中断是处理系统中突发事件的一种机制,几乎所有的处理器都提供这种机制。异常主要是从处理器被动接受的角度出发的一种描述,指意外操作引起的异常。而中断则带有向处理器主动申请的意味。但这两种情况具有一定的共性,都是请求处理器打断正常的程序执行流程,进入特定程序的一种机制。若无特别说明,对“异常”和“中断”都不作严格的区分。本文结合经过实际验证的代码对ARM9中断处理流程进行分析,并设计出基于S3C2410芯片的外部中断处理程序。 1.异常中断响应和返回 系统运行时,异常可能会随时发生。当一个异常出现以后,ARM微处理器会执行以下几步操作: 1) 将下一条指令的地址存入相应连
2、接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行。 2) 将CPSR复制到相应的SPSR中。 3) 根据异常类型,强制设置CPSR的运行模式位。 4) 强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处。 这些工作是由ARM 内核完成的,不需要用户程序参与。异常处理完毕之后,ARM微处理器会执行以下几步操作从异常返回: 1) 将连接寄存器LR的值减去相应的偏移量后送到PC中。 2) 将SPSR复制回CPSR中。 3) 若在进入异常处理时设置了中断禁止位,要在此清除。 这些工作必须由用户在中断处理函数中实现。为保证在ARM处理器发生异常时不至于处于未知状
3、态,在应用程序的设计中,首先要进行异常处理。采用的方式是在异常向量表中的特定位置放置一条跳转指令,跳转到异常处理程序。当ARM处理器发生异常时,程序计数器PC会被强制设置为对应的异常向量,从而跳转到异常处理程序。当异常处理完成以后,返回到主程序继续执行。可以认为应用程序总是从复位异常处理程序开始执行的,因此复位异常处理程序不需要返回。 2.异常处理程序设计 2.1 异常响应流程 由于向量表的限制,只能有一条指令B完成32MB范围内的跳转,并不能保证所有的异常处理函数都位于32MB范围内。为了扩展跳转范围,需要二次跳转才能把异常处理函数的地址传送给PC。异常处理调用关系如图1所示。 三星公司网站
4、提供了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, RE
5、ADWRITE _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
6、在HandlerIRQ程序段内,处理器做一些必要的处理,就会将_ISR_STARTADDRESS表中存放的IRQ入口地址送入PC,然后开始执行相关中断程序。由于_ISR_STARTADDRESS表存放在RAM中,后面的C语言程序可以方便地更改相关中断服务程序的内容。 2.2 异常分支 系统可能存在多个 IRQ/FIQ的中断处理程序。为了从向量表入口处的跳转最终能找到正确的中断处理程序,需要设计一套处理机制和方法来实现。可以在ARM的异常向量表之外,增加一张关联中断控制器的向量表,向量表中的内容对应每个具体的中断源,可以协助跳转到不同的中断处理程序。 当响应外设的一个中断请求时,首先触发ARM核
7、的中断,进人中断程序,再通过中断控制器识别中断源,使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
8、,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_START
9、ADDRESS0x20为起始地址,这里定义了S3C2410处理器所有中断源的相关中断处理处理程序入口。这种方法的好处是用户程序在运行过程中能够动态改变异常向量。 2.3 中断函数设计 为了方便高级语言设计中断处理函数,标准的ARM指令编译器提供了一个用来声明中断处理函数的关键字-irq,使用此关键字声明的函数可以被编译器识别为中断处理函数。编译后的代码在处理异常事件前保存现场信息,处理异常事件后对现场信息进行恢复。中断函数设计如下:static void _irq Eint3Int(void) ClearPending(BIT_EINT3);Uart_Printf("EINT3 in
10、terrupt is occurred.n"); num_int=3;设置标志位 定义中断处理程序入口地址:#define pISR_EINT3 (*(unsigned *)(_ISR_STARTADDRESS+0x2c) 在初始化程序,引用代码pISR_EINT3=(U32)Eint3Int,即可定义地址_ISR_STARTADDRESS+0x2c内容是Eint3Int的地址,外部中断3产生请求时即可调用中断处理函数Eint3Int。 3.外中断初始化程序设计 S3C2410X 的中断控制寄存器能接收来自56个中断源的请求。内部的外围模块和外部管脚产生的多个中断请求通过中断控制器冲
11、裁后,向ARM920T核发出FIQ或者 IRQ中断。ARM内核只有2个外部中断输入信号nIRQ和nFIQ,在具体嵌入式系统中,需要用中断控制器管理多个外部中断源,选择其中一个中断,通过 nIRQ或nFIQ向ARM内核发出中断请求,如图2所示。 图2 FIQIRQ中断处理过程 ARM920T内核可以识别正常中断请求和快速中断请求两种类型的外部中断,中断的行为模式由中断控制器来设置。S3C2410X的中断控制器包括6类寄存器:中断源状态寄存器、中断模式寄存器、中断屏蔽寄存器、优先级寄存器、中断状态寄存器,以及中断偏移寄存器。 在初始化程序中,需要选择相应管脚的功能,在此定义GPF3为EINT3模式
12、,通过外部中断控制寄存器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; rSRCPND = BIT_EINT3; rINTPND = BIT_EINT3; rIN
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030年中国铁路物流行业十三五规划与投资战略研究报告
- 2025-2030年中国车灯模具行业市场前景规模及发展趋势分析报告
- 2025-2030年中国莲藕粉行业运行态势及发展趋势分析报告
- 2025-2030年中国花露水市场风险评估规划分析报告
- 2025-2030年中国胡麻油市场竞争状况及发展趋势分析报告
- 2025-2030年中国聚碳酸酯板(阳光板)行业发展趋势规划研究报告
- 2025-2030年中国缝制机械市场运行现状及发展趋势分析报告
- 2025-2030年中国纸制品市场运行现状及发展前景预测报告
- 2025-2030年中国电玩行业运行状况及发展前景分析报告
- 2025-2030年中国电容笔行业发展状况及营销战略研究报告
- DB23T 2656-2020桦树液采集技术规程
- 2023年苏州职业大学单招职业适应性测试题库及答案解析
- 中国故事英文版哪吒英文二篇
- 2023年中智集团及下属单位招聘笔试题库及答案解析
- GB/T 8888-2003重有色金属加工产品的包装、标志、运输和贮存
- GB/T 32685-2016工业用精对苯二甲酸(PTA)
- GB/T 21872-2008铸造自硬呋喃树脂用磺酸固化剂
- 酒店业主代表岗位职责标准(8篇)
- 上海市中小学生语文学业质量绿色指标测试
- 新学期幼儿园保育员培训
- GA/T 501-2020银行保管箱
评论
0/150
提交评论