西科大嵌入式作业答案
本资源主要讲解了 ARM9 架构的嵌入式系统中断机制的实现细节。下面将对其中的知识点进行详细的解释。
IRQ 异常
IRQ 异常是一个由 nIRQ 输入端的低电平所产生的正常中断。当一个 IRQ 异常中断发生时,内核切换到中断模式,表明产生了中断。内核自动地做如下处理:
* 将异常处理程序的返回地址保存到异常模式下的 R14(R14_irq 或者LR)中。
* 修改 CPSR,将 I 位置 1,禁止新的 IRQ 中断产生,但是不限制 FIQ 中断的发生(F 位保持原有状态)。清零 T 标志位,CPU 进入 ARM 状态。
* 修改模式位,设置为 IRQ 模式,此时用户模式下的 R13 和 R14 将不可操作,而 IRQ 模式下的 R13 和 R14 变为可操作,即R13_irq 保存 IRQ 中断模式的堆栈指针,R14_irq 保存了“IRQ 中断返回地址+4”。
* 设置 IRQ 模式下的 PC 为 IRQ 异常处理程序的中断入口向量地址,在 IRQ 模式下,该向量地址为 0x0000 0018。
Thumb 状态下的寄存器映射
在 Thumb 状态下,SP 映射到 ARM 状态 R13,LR 映射到 ARM 状态 R14,PC 映射到 ARM 状态 R15(PC)。
中断模式下的寄存器
在 IRQ 模式下,R13_irq 保存 IRQ 中断模式的堆栈指针,R14_irq 保存了“IRQ 中断返回地址+4”。
中断服务程序
中断服务程序是指当IRQ 异常中断发生时,内核将跳转到该程序以处理中断。中断服务程序应当首先通过压入 IRQ 堆栈来预先保留 ISR 将会使用的 R0~R12 的值,然后对异常进行处理。
嵌套 IRQ 中断
如果用户需要嵌套 IRQ 中断,那么必须在中断服务程序中重新使能 IRQ 中断,并将 R14 压入堆栈 R13 之中以预先保留返回地址。