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 L
User : 非特权模式,大部分任务执行在这种模式;
9 }% L: ^3 y) M' B* O) D2 n8 y
5 }( ^2 |8 A* g- D* m& }3 ~: f
FIQ : 当一个高优先级(fast) 中断产生时将会进入这种模式;
; j4 n+ g4 X7 E; e4 X
2 R% t% b, T" X$ s
IRQ : 当一个低优先级(normal) 中断产生时将会进入这种模式;
, Q7 n2 `! `% B0 F5 c/ \; K
6 H* U' h+ q# \$ ~( I
Supervisor :当复位或软中断指令执行时将会进入这种模式;
( 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 n
System : 使用和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+ m
Monitor : 是为了安全而扩展出的用于执行安全监控代码的模式;
; 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