找回密码
 注册
关于网站域名变更的通知
查看: 301|回复: 4
打印 上一主题 下一主题

ARM异常处理流程

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-11-24 09:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
在学习与开发ARM处理器的过程中,一个不能绕开的话题就是异常处理流程。它在ARM的体系架构中,占据着不可动摇的重要地位。此处就以Coterx-A系列的ARM处理器简单分析一下异常中断处理流程。) K1 T0 `* x  {+ s& T
2 p: {, B# p* P2 Q
说异常处理流程之前,我们先说一下ARM处理器的工作模式和异常源。# ?, x5 |- @, V- f2 r

* D8 d1 C+ q: o! \, E6 E在Coterx-A系列之前的ARM处理器,一共有个基本工作模式:
2 a8 t/ v6 E* P5 {* u3 ?! S+ V1 Y7 j. o. w/ R5 F  D! V
User : 非特权模式,大部分任务执行在这种模式;
9 K: @& V5 m( z$ i' J
3 K  i/ g+ U" _3 m# dFIQ : 当一个高优先级(fast) 中断产生时将会进入这种模式;
( M+ q+ O6 J( {' ]8 v1 ~8 m8 g) A! D# w! y# ?& a  {
IRQ : 当一个低优先级(normal) 中断产生时将会进入这种模式;( o2 h4 [7 }0 H2 ^- c  p

# x) K- X3 v) [Supervisor :当复位或软中断指令执行时将会进入这种模式;' ?9 I. H4 J% j) j" M: ^0 V$ w
. H, W# J! N/ N; k( @+ N* b
Abort : 当存取异常时将会进入这种模式;' J2 ~, h  s6 E/ [8 b; T
: L: s3 s  q3 S2 U' B5 T/ @- H
Undef : 当执行未定义指令时会进入这种模式;
& |& R% X* l* ^4 L; ~5 i0 u( B( O' {, _+ E% w
System : 使用和User模式相同寄存器集的特权模式;
4 h. e2 a/ c. S1 j1 m
# ^- n7 I/ I: u& T- D而Coterx-A系列处理器则多了一种工作模式:
! U% i- q" ?+ ]9 u0 G4 O7 F
9 ^/ J- `9 d  ^4 _8 [  {Monitor : 是为了安全而扩展出的用于执行安全监控代码的模式;$ p8 S+ L1 I5 I1 w% }! \. u3 @
+ g- e, I" A# V* k" i. f6 H
简单介绍完异常源和工作模式后,就分析一下异常处理流程。
+ \6 {3 z7 h8 Q6 Q# }9 U
' B$ {3 a& a/ ?! n, s$ P: M/ x, e我们先想一下现实生活中遇到的类似情况,看看我们是怎么处理的。假如我们现在正在听歌,突然门铃响了,我们怎么办呢?首先把歌暂停一下,也就是保存当前正在播放的状态。然后去开门看看是谁,忙完了,继续回来听歌。总结一下:突然情况发生时,保存当前状态,去处理突发事件,完成后,恢复保存的状态,继续进行。
; G% R% i, [0 K" z* r# q$ I% V7 J* l0 }- R% I
而在ARM内核规定的异常处理流程也采用了类似的流程。5 {2 j6 ^1 p! Q( ^% V- s$ F
- |: b6 n% N4 H. f
当异常产生时, ARM core:
' b6 M- ]7 ^% m4 [0 l, {. @1 N" |4 [4 G/ f5 `
拷贝 CPSR 到 SPSR_; A1 L) l# l4 w( O- F9 L

0 w/ N0 P% R; X7 H7 P设置适当的 CPSR 位:
0 S: I! H( Y, c
2 ^# ]4 E* A' o) P# W9 z4 c) x3 d; e改变处理器状态进入ARM态" q! N7 ?: D! P5 |+ t0 V8 L

% q+ S* R' G7 @2 J; }" f& v改变处理器模式进入相应的异常模式1 ~3 `3 i* I: T1 D: }% l7 k
$ v% t! [7 i: n# {( w
设置中断禁止位禁止相应中断 (如果需要)
+ [+ n8 w" G: J# b7 R8 v  [* p; L0 T- |, }* i
保存返回地址到 LR_
) z9 K4 {3 C4 f5 C, q2 K/ E' c* n  y' q% m& ^/ h% O! G2 d+ _' i3 W
设置 PC 为相应的异常向量
4 B6 q* R  W" c0 `' I
( M; B# a' m; t6 ?$ Q7 Z返回时, 异常处理需要:  u0 i* Z' O' }4 t
8 r, r% w. g! ^2 |5 L/ l8 y
从 SPSR_恢复CPSR
& U# e/ c2 L* v) Q/ M# A  L
3 _5 d/ Q) i$ X& H& \8 e% q5 N从LR_恢复PC
) x5 m* h" {3 R& N+ H) D
( R, ?. v* f* T以上所有的操作都是在ARM态下进行的。大家看看这个流程是否符合我们从实际生活中所总结的流程。" ?' u+ b& d# V% Y9 a
  X' N$ r: B3 n: h
异常发生时,ARM Core自动保存CPSR->SPSR(对应的异常模式下的SPSR寄存器)、保存返回地址->LR(对应的异常模式下的LR寄存器),这些操作都是为了保存现场,以便将来返回。而设置CPSR则是为了处理异常。保存的返回地址则是异常发生前正在执行指令的下一条指令的地址,即此时的(pc-4)。
8 L+ b0 S1 I' T9 R- x$ A( T
; J; ^' G' z% R6 W' d5 s0 o6 l- D处理完成时,我们自己需要恢复CPSR、PC则是为了继续执行异常发生前的指令。; {5 n! {6 v$ H7 x" T2 ~) t
+ [5 u2 h) H" O
而ARM汇编中的跳转指令的执行也才用了同样的流程。大家有兴趣的话,可以自己编写代码调试,观察现象。

$ f6 _$ f/ W5 y4 G/ u

该用户从未签到

2#
发表于 2021-11-24 10:08 | 只看该作者
简单介绍完异常源和工作模式后,就分析一下异常处理流程8 \. V& n9 S- k, b

该用户从未签到

3#
发表于 2021-11-24 10:19 | 只看该作者
突然情况发生时,保存当前状态,去处理突发事件,完成后,恢复保存的状态,继续进行
) j' H( w. g  |+ x  A5 r+ e$ M: y
  • TA的每日心情
    开心
    2023-6-2 15:15
  • 签到天数: 1 天

    [LV.1]初来乍到

    4#
    发表于 2021-11-24 10:38 | 只看该作者
    异常发生时,ARM Core自动保存CPSR->SPSR(对应的异常模式下的SPSR寄存器)、保存返回地址->LR(对应的异常模式下的LR寄存器),这些操作都是为了保存现场,以便将来返回
    4 U3 o1 Q8 }/ ^6 K0 q
  • TA的每日心情
    开心
    2025-7-5 15:59
  • 签到天数: 1125 天

    [LV.10]以坛为家III

    5#
    发表于 2021-11-24 11:17 | 只看该作者
    不错不错,写的很是专业和深度,内容全面丰富,很有指导和实用价值,学习下
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-7-7 09:31 , Processed in 0.125000 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表