EDA365电子论坛网

标题: ARM异常处理流程 [打印本页]

作者: on1e    时间: 2021-11-24 09:23
标题: ARM异常处理流程
在学习与开发ARM处理器的过程中,一个不能绕开的话题就是异常处理流程。它在ARM的体系架构中,占据着不可动摇的重要地位。此处就以Coterx-A系列的ARM处理器简单分析一下异常中断处理流程。: g$ m+ k9 F0 D7 y5 n! z/ J$ X) m
& O! F; v4 w# a0 h- I' s& B! M
说异常处理流程之前,我们先说一下ARM处理器的工作模式和异常源。
4 k: l$ Y; x5 b  W4 {" ?
, [2 F7 K+ L& P- B在Coterx-A系列之前的ARM处理器,一共有个基本工作模式:
& i4 x1 `) |9 g& T% [
5 r; L9 E; ^; U  F$ \% ^8 LUser : 非特权模式,大部分任务执行在这种模式;9 }% L: ^3 y) M' B* O) D2 n8 y

5 }( ^2 |8 A* g- D* m& }3 ~: fFIQ : 当一个高优先级(fast) 中断产生时将会进入这种模式;; j4 n+ g4 X7 E; e4 X

2 R% t% b, T" X$ sIRQ : 当一个低优先级(normal) 中断产生时将会进入这种模式;, Q7 n2 `! `% B0 F5 c/ \; K

6 H* U' h+ q# \$ ~( ISupervisor :当复位或软中断指令执行时将会进入这种模式;( S' `& c+ w8 _1 K5 S' P& o/ r5 M0 O9 X7 M
8 `  f2 l! d4 l
Abort : 当存取异常时将会进入这种模式;. Z* g, O7 t2 l- C/ j1 W- l
2 H: e* d; h% b6 u8 }
Undef : 当执行未定义指令时会进入这种模式;
: A5 d4 a# k$ x* s; s4 |7 L: D0 I' y
* [8 |/ ]4 H2 nSystem : 使用和User模式相同寄存器集的特权模式;
5 A% l/ R7 y& [. o, J! w" O% F# W  J1 [
而Coterx-A系列处理器则多了一种工作模式:0 S# c. w* r/ T+ V

% B$ n" n! ^! H" u4 J. W+ mMonitor : 是为了安全而扩展出的用于执行安全监控代码的模式;; v* C1 ?3 [5 J$ T. `- X
& H" K; ^4 x) }7 }/ v& w* }0 x4 q
简单介绍完异常源和工作模式后,就分析一下异常处理流程。/ u9 i* b- P! l' S; W6 D& |6 D1 X
% Y3 G5 B! h! ]: _0 O
我们先想一下现实生活中遇到的类似情况,看看我们是怎么处理的。假如我们现在正在听歌,突然门铃响了,我们怎么办呢?首先把歌暂停一下,也就是保存当前正在播放的状态。然后去开门看看是谁,忙完了,继续回来听歌。总结一下:突然情况发生时,保存当前状态,去处理突发事件,完成后,恢复保存的状态,继续进行。
. D. w7 q- r6 {* O" g; E' M" n" I1 t" l* v5 s
而在ARM内核规定的异常处理流程也采用了类似的流程。; W- X. u. J) A+ p) V7 i4 B

/ W. |" A+ ]- z/ ~当异常产生时, ARM core:$ p; j* T7 {% Z0 X

7 z' E$ ^6 L- n! j# `拷贝 CPSR 到 SPSR_
3 G  k% T, v( C$ ~& h4 M- T. e1 j; f  P5 s
设置适当的 CPSR 位:: t* [  x1 V+ B: C) m: c
, `) t" b) Q6 V% M6 V: _& k, p
改变处理器状态进入ARM态
. j/ L% V5 ^3 W6 V2 ?" S2 z. z: X3 |2 Y1 ?  U$ [- O8 B
改变处理器模式进入相应的异常模式  a. o2 i, @$ q# D( T8 Q/ \
5 G+ `6 L6 A& ~7 z0 d
设置中断禁止位禁止相应中断 (如果需要)
3 K/ Z7 ~$ @! c
+ }( x& k2 ]5 V; Q& X8 O保存返回地址到 LR_- {& e2 x3 L) p8 l2 d( j9 q' M% c

; t$ v* N5 z" Y* Y设置 PC 为相应的异常向量* W& b7 L2 C1 \; G1 D/ z$ Z4 ]
- R1 l: M. |9 c; d4 w7 }
返回时, 异常处理需要:
/ k( k* w: l2 J0 k$ Z+ o
0 Y8 f) ?; k* y( C" H从 SPSR_恢复CPSR
3 h, N# h2 n- N4 a
4 I5 _, e% P' K2 f" I* R5 i从LR_恢复PC# |: g* p: v! b4 m4 N* [4 x
2 r  n% }- d4 O" w2 H  W
以上所有的操作都是在ARM态下进行的。大家看看这个流程是否符合我们从实际生活中所总结的流程。. e4 c6 w# \: j& F! o: I2 a' e
/ q0 |+ o8 a- l6 v, o9 K
异常发生时,ARM Core自动保存CPSR->SPSR(对应的异常模式下的SPSR寄存器)、保存返回地址->LR(对应的异常模式下的LR寄存器),这些操作都是为了保存现场,以便将来返回。而设置CPSR则是为了处理异常。保存的返回地址则是异常发生前正在执行指令的下一条指令的地址,即此时的(pc-4)。
. N- g- O! K; {$ v) {
6 `3 y: u% I% \: K0 p& N处理完成时,我们自己需要恢复CPSR、PC则是为了继续执行异常发生前的指令。
+ m1 V2 t+ M+ U$ g: H) k( T. q) @# d6 z  b9 V4 ?
而ARM汇编中的跳转指令的执行也才用了同样的流程。大家有兴趣的话,可以自己编写代码调试,观察现象。
) d$ D0 ^8 a9 ^9 m' u8 v4 ~' Z9 x" \

作者: Cyberbot7    时间: 2021-11-24 10:08
简单介绍完异常源和工作模式后,就分析一下异常处理流程
- Q6 f8 z8 }: A) N; |& S7 f
作者: ESCAPE    时间: 2021-11-24 10:19
突然情况发生时,保存当前状态,去处理突发事件,完成后,恢复保存的状态,继续进行( w) d& ]1 G  x1 m

作者: Blah    时间: 2021-11-24 10:38
异常发生时,ARM Core自动保存CPSR->SPSR(对应的异常模式下的SPSR寄存器)、保存返回地址->LR(对应的异常模式下的LR寄存器),这些操作都是为了保存现场,以便将来返回
( M4 J3 \+ B8 s6 C- I2 ~
作者: 瞪郜望源_21    时间: 2021-11-24 11:17
不错不错,写的很是专业和深度,内容全面丰富,很有指导和实用价值,学习下




欢迎光临 EDA365电子论坛网 (https://www.eda365.com/) Powered by Discuz! X3.2