这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 嵌入式开发» MCU» ARM异常处理小结【武汉华嵌】

共1条 1/1 1 跳转至

ARM异常处理小结【武汉华嵌】

菜鸟
2013-08-15 10:07:45 打赏
异常就是正在执行的指令,由于各种软件或硬件故障被打断,比如,在读数据或指令时,访问存储器失败、产生了一个外部硬件中断等。当这些情况发生时,在 ARM 系统里,由异常和中断处理程序做出相应的处理,当处理完成后,要返回到被中止的指令,使被中止的指令能够继续正常执行下去。因此,确定异常和中断处理程序的返回地址是一个非常重要的问题。 下面是中断异常入口、返回指令、返回地址的一个表, ARM R14_x 是发生中断时保存到 R14 的返回地址, pc 指的是发生了中断的那条指令的地址。


异常或入口 返回指令 ARM R14_x BL MOV PC,R14 PC+4 SWI MOVS PC,R14_svc PC+4 未定义的指令 MOVS PC,R14_und PC+4 预取指中止 SUBS PC,R14_abt,#4 PC+4 快中断 SUBS PC,R14_fiq,#4 PC+4 中断 SUBS PC,R14_irq,#4 PC+4 数据中止 SUBS PC,R14_abt,#8 PC+8


中断处理 当外部中断 IRQ FIQ(Fast Interrpt Request, 快速中断请求 ) 发生时, ARM 核完成一部分工作。当然,这些工作是任何异常发生时都必须要做的,所以 ARM 处理器就会自动带我们完成。 其它重要的工作,必须由程序员来完成。 ARM 处理器处理的事包括从用户模式切换到 IRQ 模式、状态寄存器值的变化及跳转。比如说,处理器自动跳转到从 0x0 地址开始的异常中断向量表的 0x18 处,在向量表的 0x18 处,最简单的指令为 ”B HandlerIRQ” 那程序员所要关心的就是实现具体的异常处理程序 (HandlerIRQ) 。当用 ARM 汇编语言实现 HandlerIRQ 函数的时候,如何确定 HandlerIRQ 函数正确地返回地址,使被中止的指令能够继续正常执行下去。 比较常用的中断处理程序结构如下: HandlerIRQ ;中断响应,从向量表直接跳来 SUB R14,R14,#4 ;计算返回地址 STMFD R13,{R0-R3,R14} ;保护现场,一般只需要保护 {R0-R3,LR} BL irqHandler ;跳到具体的异常处理函数 LDMFD R13,{R0-R3,PC}^ ;恢复现场 有程序可以看出,通过 ”SUB R14,R14,#4” 计算中断函数的返回地址。那有人一定会问,为什么计算返回地址的时候要减去 4 呢? 地址 指令 0x100 MOV R0,#0x00 0x104 MOV R0,#0x00 0x108 MOV R1,#0x01 0x10C MOV R2,#0x02 看上个代码片段,比如在执行地址为 0x104 MOV 指令时,突然来了一个 IRQ 中断,这个中断打断了 MOV 指令的执行,这个时候就要去跳转到异常处理函数,之后还要返回 0x104 地址重新执行 MOV 指令。当中断发生时, LR 里面保存了用户模式下 PC 的值,那么当执行地址为 0x104 MOV 指令时, PC 的值应该是 0x10C ,前面介绍过,当发生跳转时,处理器会对 LR 进行一个自动的更新动作: LR=LR-0x4 ,这样 LR 里面的地址是 0x10C-0x04=0x108 。但是 0x108 并不是我们要的地址,因为中断发生在地址为 0x104 MOV 指令执行的时候,所以中断处理完后应该返回这个地址。 这就是在计算返回地址的时候 LR 减去 4 的原因。对于 FIQ 中断和预取指中止异常,计算返回地址方法和 IRQ 相同。



关键词: 武汉 华嵌 异常 处理

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]