关于ARM核异常与中断处理机制研究
扫描二维码
随时随地手机看文章
一.ARM处理器异常及其对应的模式
当一个异常发生时,ARM处理器总是切换到ARM状态(即非Thumb状态)。Thumb指令集没有包含进行异常处理时需要的一些指令,因此在异常中断时,还是要使用ARM指令。
每种异常都导致内核进入一种特定的模式。此外,可以通过修改cpsr,进入任何ARM处理器模式。用户和系统模式是仅有的可不通过相应异常进入的2中模式。
当一个异常导致模式的改变时,内核自动的:
把cpsr保存到相应异常模式下的spsr
把pc保存到相应模式下的lr
设置cpsr为相应异常模式
设置pc为相应异常处理程序的入口地址
二.向量表
异常发生时,ARM跳转地址组成的表。
三.异常优先级
复位异常是优先级最高的异常,一旦复位异常产生,总是会发生复位异常。注意:当一条不属于ARM或Thumb指令集的指令到达流水线的执行阶段时,若此时没有其它异常发生,就会产生未定义指令异常。ARM处理器会“询问”协处理器,看它能否将其作为一条协处理器指令来处理。由于协处理器在流水线之后,所以指令确认可以在内核的执行阶段进行。如果这条指令不属于任何一个协处理器,则会产生未定义指令异常。
四.中断
中断延时是指:从外部请求信号发出到取出对应的中断服务程序(ISR)的第一条指令,这期间的间隔时间。
五.中断源及其识别方法
S3C2440A有60个中断源,IRQ有两种中断识别方法:向量中断和非向量中断。FIQ只有非向量中断。在IRQ各个中断源中的某一个中断源的中断请求被响应时,CPU转至0x18处自动加载一条转移指令转至相应中断源的固定中断向量处。IRQ各个中断源的向量地址是固定的,每个占用一个字单元。IRQ各个中断源若采用非向量中断,任意一个中断源发出中断请求,都认为发生了IRQ中断请求,并自动转入IRQ中断服务程序执行。IRQ中断服务程序主要功能是将软件设定的中断向量表中相应的中断源服务程序入口地址送给PC,并转其执行。在非向量中断模式下,一般在IRQ处放置一条转移指令:B IsrIRQ 。其中,IsrIRQ为所有IRQ中断服务程序的总入口地址,也是非向量中断模式的中断源判别及散转程序。
在堆栈设计时,须确定2点:
位置
决定了在存储器映射中,堆栈从何处开始。大多数基于ARM系统设计的堆栈是采用向下递减式的,栈顶位于存储器的高端地址。
堆栈大小
依赖于处理程序的类型-嵌套的还是非嵌套的。一个嵌套中断处理程序需要更多的存储器空间,因为堆栈将随中断嵌套的深度而增加。
第一种方式A,说明了一个传统的堆栈安排,中断的堆栈位于代码段之下。第二种方式B,中断堆栈在用户堆栈之上,位于存储器的顶端。B优于A之处是,B在堆栈溢出时不会破坏向量表,因此系统在确认堆栈溢出后,还有机会纠正自己的错误。每一种处理器模式都要建立一个堆栈,这是在处理器每次复位时完成的。因为系统复位是从管理模式开始的,所以不用再切换到管理模式,而其他模式堆栈的建立要切换到相应模式。用于模式堆栈-通常是最后设置的,因为当处理器处于用户模式时,没有直接修改cpsr的方法。由于系统模式和用户模式共享寄存器,所以可以强制处理器进入系统模式来设置用户模式堆栈。
七.中断处理方法
1)非嵌套中断处理
最简单的中断处理是非嵌套的:只有当控制权回到被中断的任务或过程时,才允许再次相应中断。由于一个非嵌套的中断处理程序在一个时段内只能为一个中断处理程序服务,所以这种形式的中断处理程序不适合需要为多个不同优先级中断服务的复杂嵌入式系统。
2)嵌套中断处理
在处理程序完成当前中断的服务前重新允许中断,可以实现中断嵌套。嵌套的中断处理程序入口代码与简单的非嵌套中断处理程序类似。不同之处在于,在推出时,处理程序要测试被ISR更新过的一个标志。这个标志表明,是否需要做进一步的处理,如果不要求更多的处理,那么这个中断服务例程就完成了,处理程序也可以退出;如果需要进一步处理,处理程序可能要采取若干措施:重新允许中断,并/或执行一次上下文切换。重新允许中断包括把IRQ模式切换到SVC或系统模式。在IRQ模式下,不能简单的允许中断,因为这可能会导致链接寄存器r14_irq遭到破坏,特别是在执行完BL后即发生一次中断。执行上下文切换包括复位(清空)IRQ堆栈,因为当IRQ堆栈中还有数据的时,处理程序不会执行上下文切换。所有保存在IRQ堆栈的寄存器必须转移到任务堆栈,典型地是放在管理模式堆栈上。然后,其余的寄存器也必须被保存到任务堆栈。在那里,他们会被转移到堆栈中一个称为堆栈帧的保留存储块上。
如下恢复现场的指令:
LDMFD R13!,(R0~R3,PC)^
这里,寄存器列表后(其中必须包括PC)的后面的“^”表示这是一条特殊形式的指令。在从存储器装入PC的同时,CPSR也得到恢复。