赞
踩
今天学习《ARM System Developer's Guide: Designing and Optimizing System Software》第9章 异常与中断处理,总结一下:
1. 异常处理
Q1. 异常和中断嘛关系啊?
中断时异常的一种,中断两种:IRQ, FIQ。异常好多种呢?reset,data abort, FIQ,IRQ,prefetch abort, SWI, undefined 。ARM标准向量表中列出了以下异常:
- exception mode offset of vector table
- reset SVC +0x00
- undefined UND +0x04
- SWI SVC +0x08
- prefetch abort ABT +0x0c
- data abort ABT +0x10
- undefined - +0x14
- IRQ/FIQ IRQ/FIQ +0x18/0x1c
通常说的异常主要来自cpu内部,abort,reset等; 中断主要来自外设
Q2. 怎么进入异常?
两种:改cpsr 和 发生相应异常。其中USER mode 和 system mode只能通过该cpsr进入相应mode。上面的表都没有这两种mode。
reset handler:主要配置cpsr寄存器(关中断),因为这时候interrupt handler还没有初始化好;设置SVC mode.
- reset:
- /*
- * set the cpu to SVC32 mode
- */
- mrs r0, cpsr
- bic r0, r0, #0x3f
- orr r0, r0, #0xd3
- msr cpsr, r0
除了简单的reset,data abort, FIQ,IRQ,prefetch abort, SWI, undefined 依次优先级下降外。
data abort 发生在MMU或UMC指示访问了无效的存储器地址,或当前代码没有访问权限。data abort的handler里没有禁用FIQ,在data abort的异常处理程序中,可以发生FIQ,当FIQ完成后,控制权交给data abort handler.
FIQ 中断处理时,禁 FIQ和IRQ,所以所有的外部中断都进不来。
IRQ : 只有当没有FIQ 和data abort 的时候,IRQ才能进来,然后关IRQ中断
prefech abort: 在流水线中,如果某指令的“执行”阶段没有更高优先级的异常出现,保持FIQ不变(注意是不变),禁止IRQ。如果FIQ enable,并且发生了FIQ,可以了在处prefech abort handler的时候得到响应。
2. 中断
1))分配中断: 系统design哪些硬件可产生哪种中断,可以通过硬件或软件实现。
2) IRQ与FIQ异常 会使处理器硬件经过以下一个标准流程(假设中断未被屏蔽)
a. 处理器切换到一个特定的mode,表明产生了中断;
b. 前一个mode的cpsr保存到新mode的spsr
c. pc被保存到新的中断mode的lr
d. 关中断 - 更改cpsr中的IRQ 或者FIQ和IRQ都禁止。中断请求是允许还是禁止,只有在MSR指令已经完成了流水线的“执行”阶段后才确定,理解这一点很重要!在MSR指令完成前,中断仍可能发生或者被屏蔽。
e. 处理器跳转到响应向量表的入口
IRQ mode堆栈必须在中断使能前设置好-通常是系统初始化代码中(reset),思考为什么FIQ不用呢?
r13是堆栈寄存器,要在系统初始化的时候,设置好各个异常的堆栈。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。