|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在学习与开发ARM处理器的过程中,一个不能绕开的话题就是异常处理流程。它在ARM的体系架构中,占据着不可动摇的重要地位。此处就以Coterx-A系列的ARM处理器简单分析一下异常中断处理流程。
9 l2 \( e' p2 T0 ~
. U/ j/ Y; g6 k, W( y( V说异常处理流程之前,我们先说一下ARM处理器的工作模式和异常源。
! r$ l4 G/ C: q
3 q& V1 m7 |' f0 @+ m6 S在Coterx-A系列之前的ARM处理器,一共有个基本工作模式:! d5 z2 o: M8 `* G! J( u
& k% W, I# @1 ~0 o7 h. AUser : 非特权模式,大部分任务执行在这种模式;
( i4 q" `8 {- X$ I; @8 ]; w6 O* Q6 g3 r9 K. v0 O
FIQ : 当一个高优先级(fast) 中断产生时将会进入这种模式;& z* _% }# y3 x5 R5 f) k% D0 Z
: R/ G% Y/ O- F
IRQ : 当一个低优先级(normal) 中断产生时将会进入这种模式;
4 n. y: H: y2 N3 o% b# @; M: f9 Z6 u/ a4 T" e1 ]
Supervisor :当复位或软中断指令执行时将会进入这种模式;
- ]3 X- U* k, z" j; @: N6 W: t
0 G( D% Z' o" O5 t5 M3 PAbort : 当存取异常时将会进入这种模式;& y4 d3 C$ ?5 o7 A
* t# ?( L" i% _/ cUndef : 当执行未定义指令时会进入这种模式;. i: D1 g9 p2 ] e
! q" u K# C4 K5 Q7 v
System : 使用和User模式相同寄存器集的特权模式;
3 E) i) g$ b% N. m# S
, [) _2 R2 V- d0 Z& [0 ?9 [2 y而Coterx-A系列处理器则多了一种工作模式:8 T9 ?& k1 R, n3 d: q2 U
* z/ q7 X# Y& {# L' nMonitor : 是为了安全而扩展出的用于执行安全监控代码的模式;3 w, p% ^+ r. N0 M+ y. ^) o; s
& J9 B* Q6 d! Z5 y: o2 r0 j
简单介绍完异常源和工作模式后,就分析一下异常处理流程。' Q+ ?7 v- D" f; g, d# C
2 T2 r8 d8 N& k
我们先想一下现实生活中遇到的类似情况,看看我们是怎么处理的。假如我们现在正在听歌,突然门铃响了,我们怎么办呢?首先把歌暂停一下,也就是保存当前正在播放的状态。然后去开门看看是谁,忙完了,继续回来听歌。总结一下:突然情况发生时,保存当前状态,去处理突发事件,完成后,恢复保存的状态,继续进行。+ T+ U( [* a5 w B8 [
7 H7 Y& v. l) @% `而在ARM内核规定的异常处理流程也采用了类似的流程。
) t- W7 p( w, n% j8 W1 B
0 U/ z: _0 P, j当异常产生时, ARM core:
1 S2 v( r0 O9 S6 |# b: q
5 E6 C. x+ A. q1 k! p2 H拷贝 CPSR 到 SPSR_
' }- Q6 H* |; c. M r
2 L' ^* \5 }( Q6 X4 n3 @设置适当的 CPSR 位:
: D5 g+ z) n( ]9 l/ R
) I4 _* O" a9 T! j改变处理器状态进入ARM态) n. ?% P+ L! O3 c x
% J) N* e9 x) @& L3 I, S" I; s( @
改变处理器模式进入相应的异常模式
# I4 x" V2 F9 H( h( f9 K7 i' B `. D$ }, k
设置中断禁止位禁止相应中断 (如果需要); g- x. m/ n, c
" P) X, g: x k% G" r保存返回地址到 LR_
_ }6 Q( q' q6 N
. X+ X* C# e4 y4 f5 J设置 PC 为相应的异常向量9 Y$ K |4 n* d4 T7 h+ \
3 s8 t3 A5 t9 i8 y+ E
返回时, 异常处理需要:
% |! ]! f; L$ H. `
+ ~1 X; r0 b, u# I从 SPSR_恢复CPSR. P9 ]& _- ^- E; t
" ?% u- z: P: q5 F* F1 l. p+ q从LR_恢复PC" L; R+ }. d. _& P
; u- i( H6 h9 b, Q- z! R$ A+ K# R以上所有的操作都是在ARM态下进行的。大家看看这个流程是否符合我们从实际生活中所总结的流程。
8 C2 R' C# d1 Z& [" @+ [
- S7 M2 \% ?$ n9 r异常发生时,ARM Core自动保存CPSR->SPSR(对应的异常模式下的SPSR寄存器)、保存返回地址->LR(对应的异常模式下的LR寄存器),这些操作都是为了保存现场,以便将来返回。而设置CPSR则是为了处理异常。保存的返回地址则是异常发生前正在执行指令的下一条指令的地址,即此时的(pc-4)。1 C2 m$ Y( G$ O: R, T
8 p% A- I: t. w) V处理完成时,我们自己需要恢复CPSR、PC则是为了继续执行异常发生前的指令。
' a) B" V" i7 }! j$ H5 J, O
7 y. a4 y' l- \" @3 y而ARM汇编中的跳转指令的执行也才用了同样的流程。大家有兴趣的话,可以自己编写代码调试,观察现象。
" n5 K* A5 p' F0 U |
|