EDA365电子论坛网
标题:
ARM异常处理流程
[打印本页]
作者:
on1e
时间:
2021-11-24 09:23
标题:
ARM异常处理流程
在学习与开发ARM处理器的过程中,一个不能绕开的话题就是异常处理流程。它在ARM的体系架构中,占据着不可动摇的重要地位。此处就以Coterx-A系列的ARM处理器简单分析一下异常中断处理流程。
: }9 I( X. w0 S3 e
- S; V0 q9 p5 y6 l) ^; m
说异常处理流程之前,我们先说一下ARM处理器的工作模式和异常源。
% s. ?; O- b; D( V
0 |7 J9 ?( a D/ B; H0 ~8 R
在Coterx-A系列之前的ARM处理器,一共有个基本工作模式:
9 g( Y& L, ?+ I- h1 A7 R6 n
( ^9 e# s/ s2 I, Z# M1 V
User : 非特权模式,大部分任务执行在这种模式;
: T: T c% a- f) a6 J# G/ j4 [
7 o3 k0 s* Q2 O8 B1 S2 _ p
FIQ : 当一个高优先级(fast) 中断产生时将会进入这种模式;
8 d6 Z0 p( f8 \* O- ]
4 W0 k* t8 ?( w5 [" c: \
IRQ : 当一个低优先级(normal) 中断产生时将会进入这种模式;
- c1 M1 X9 w) S
/ a$ h: k; L+ \5 l5 ?5 V5 W
Supervisor :当复位或软中断指令执行时将会进入这种模式;
6 }. s9 a7 o: x
7 [2 o$ j" @: m
Abort : 当存取异常时将会进入这种模式;
. F# C* ~) h1 M( a! W7 o$ u& Q7 M
7 i/ G; | m- y0 ?
Undef : 当执行未定义指令时会进入这种模式;
% h6 J, D5 ?) {: e! R4 x8 r: [
! w& f. ^& p2 j( \% D2 o
System : 使用和User模式相同寄存器集的特权模式;
+ o$ }$ M I/ D# X. ]1 p3 Z
- d( R% S4 H8 d z* t8 E( J, W
而Coterx-A系列处理器则多了一种工作模式:
0 t; H$ ?) q& w4 Y6 l
% x! ]2 [/ F/ T' Z! ^* s+ }/ R
Monitor : 是为了安全而扩展出的用于执行安全监控代码的模式;
5 ^! ?' ]/ J) ]
9 e; d; L* P8 s6 M# B X( ]
简单介绍完异常源和工作模式后,就分析一下异常处理流程。
- W0 T* {9 g% l! \' C% _1 B
8 ]" z) Z& q$ ^+ l# I$ ^" c9 T, p
我们先想一下现实生活中遇到的类似情况,看看我们是怎么处理的。假如我们现在正在听歌,突然门铃响了,我们怎么办呢?首先把歌暂停一下,也就是保存当前正在播放的状态。然后去开门看看是谁,忙完了,继续回来听歌。总结一下:突然情况发生时,保存当前状态,去处理突发事件,完成后,恢复保存的状态,继续进行。
0 o% D) c7 H! u( F2 _3 W
( G4 ~ L3 S& w5 q
而在ARM内核规定的异常处理流程也采用了类似的流程。
: n7 b+ ^% \; {: q. h
0 D) f# U) s l5 b7 R
当异常产生时, ARM core:
9 }, |/ T) C2 h; J) A5 b
* v, s/ n; c# l
拷贝 CPSR 到 SPSR_
- u2 x, \. S2 s8 M$ R+ e8 Z9 z
. H7 e) y3 o4 K" P* T
设置适当的 CPSR 位:
& \/ Z9 c# M- V$ T) Y
# `/ i3 \6 a0 H* t5 Q% }
改变处理器状态进入ARM态
* M: w. q! \6 r5 ^/ o
6 z. n7 Z' I* y0 Y3 G! v8 k
改变处理器模式进入相应的异常模式
/ w4 Z% H1 M/ Z# K, u4 i: ~8 D6 O9 S
7 x& U& w! J! n$ R
设置中断禁止位禁止相应中断 (如果需要)
9 `" V4 }' _; r+ Q$ S$ ~
3 n/ U( X! a" a' N: N- ]3 `, u4 f& s
保存返回地址到 LR_
+ U8 E6 [5 J% p) G b0 C# |+ E
8 d1 O3 q% j7 F. I$ Q Q/ h2 W' i- m
设置 PC 为相应的异常向量
) t/ z. D: m5 U' a" E& c0 u, a
# `" f5 n8 F" @& ^
返回时, 异常处理需要:
. H9 i/ M' I2 x$ h5 c- Z
! M% D2 m4 o2 ]( G9 T" ^ r4 P
从 SPSR_恢复CPSR
; s0 |' I4 K& s/ q) _4 C
: z$ e' v; i6 b0 y
从LR_恢复PC
0 b5 n$ e. h: O. e7 Y
$ j+ u' @8 u0 ?) R0 f
以上所有的操作都是在ARM态下进行的。大家看看这个流程是否符合我们从实际生活中所总结的流程。
: o# i0 }$ y8 |; r+ }# _
! K8 _: d- a: f
异常发生时,ARM Core自动保存CPSR->SPSR(对应的异常模式下的SPSR寄存器)、保存返回地址->LR(对应的异常模式下的LR寄存器),这些操作都是为了保存现场,以便将来返回。而设置CPSR则是为了处理异常。保存的返回地址则是异常发生前正在执行指令的下一条指令的地址,即此时的(pc-4)。
3 j+ _7 M% z' K8 i
7 _9 m( m. Y9 _* {& v
处理完成时,我们自己需要恢复CPSR、PC则是为了继续执行异常发生前的指令。
. q/ ?$ h6 _6 B/ E
9 [1 T! E' E- f4 Y8 V4 g8 S9 `
而ARM汇编中的跳转指令的执行也才用了同样的流程。大家有兴趣的话,可以自己编写代码调试,观察现象。
! N' r" h6 R& l* r
作者:
Cyberbot7
时间:
2021-11-24 10:08
简单介绍完异常源和工作模式后,就分析一下异常处理流程
1 z0 y* h: z8 ?0 F
作者:
ESCAPE
时间:
2021-11-24 10:19
突然情况发生时,保存当前状态,去处理突发事件,完成后,恢复保存的状态,继续进行
7 u+ ~/ z6 j& ?& R1 G
作者:
Blah
时间:
2021-11-24 10:38
异常发生时,ARM Core自动保存CPSR->SPSR(对应的异常模式下的SPSR寄存器)、保存返回地址->LR(对应的异常模式下的LR寄存器),这些操作都是为了保存现场,以便将来返回
8 @2 _- Y( V/ ?. o
作者:
瞪郜望源_21
时间:
2021-11-24 11:17
不错不错,写的很是专业和深度,内容全面丰富,很有指导和实用价值,学习下
欢迎光临 EDA365电子论坛网 (https://www.eda365.com/)
Powered by Discuz! X3.2