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

ARM异常处理流程

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
在学习与开发ARM处理器的过程中,一个不能绕开的话题就是异常处理流程。它在ARM的体系架构中,占据着不可动摇的重要地位。此处就以Coterx-A系列的ARM处理器简单分析一下异常中断处理流程。
$ Q: y/ N1 {, d0 q
0 q7 @$ R( d# o) G说异常处理流程之前,我们先说一下ARM处理器的工作模式和异常源。
$ F7 s- w6 @" t$ ^  ^
4 M# A' y# }( a( k4 M在Coterx-A系列之前的ARM处理器,一共有个基本工作模式:0 a, g% V" d+ H/ p
1 t- n5 p9 H) k0 w7 R0 T# q
User : 非特权模式,大部分任务执行在这种模式;
8 e- k; I( ]/ W9 V* H1 b- f# @: R: {2 }* M/ r6 H) f
FIQ : 当一个高优先级(fast) 中断产生时将会进入这种模式;; }4 R* J9 o4 p& [5 B/ S! H
: C7 w3 f2 l- T- S9 |: g$ P3 Z
IRQ : 当一个低优先级(normal) 中断产生时将会进入这种模式;
) v2 }8 {- J0 V3 q3 o- h" F. ]$ H3 v. I* P
Supervisor :当复位或软中断指令执行时将会进入这种模式;; d  `7 R3 e8 M. u$ q
) g& O5 g& A7 x4 ~
Abort : 当存取异常时将会进入这种模式;
2 }( e5 P/ a& e2 G8 m4 Z: H
4 ^+ t9 W: m* i8 d* h1 uUndef : 当执行未定义指令时会进入这种模式;
2 x0 l+ P9 f# T, M. I) j9 U7 R- s5 `& ~6 ]% x2 Q) i: Q# y, W$ |
System : 使用和User模式相同寄存器集的特权模式;! ?0 \+ T' y. _8 B5 K% x$ T* v0 g
" a8 p$ [  b( j/ A. B
而Coterx-A系列处理器则多了一种工作模式:
- Y- @5 N, I  X( a! ]8 l$ w  p* t4 u6 T+ |8 m3 H  X
Monitor : 是为了安全而扩展出的用于执行安全监控代码的模式;1 i8 v2 v! y" |( v( Z. D" ?
" {7 B( V7 t; ^4 G" T" H
简单介绍完异常源和工作模式后,就分析一下异常处理流程。3 \& a: {$ X! i9 o. }1 d
6 m) b, Z  k4 c% A
我们先想一下现实生活中遇到的类似情况,看看我们是怎么处理的。假如我们现在正在听歌,突然门铃响了,我们怎么办呢?首先把歌暂停一下,也就是保存当前正在播放的状态。然后去开门看看是谁,忙完了,继续回来听歌。总结一下:突然情况发生时,保存当前状态,去处理突发事件,完成后,恢复保存的状态,继续进行。) F4 Q9 e. O5 |% d0 s1 q
; S$ m! `9 ~. _" O9 y
而在ARM内核规定的异常处理流程也采用了类似的流程。
" r2 ]0 a5 N) C0 Z
" U7 ]; G( @5 _. T当异常产生时, ARM core:
7 W- A' T* B- v; f
9 I. k: a4 t, C+ r  _拷贝 CPSR 到 SPSR_
: g' p2 j" B4 l) ]
! ]8 D% r# {2 [& c9 V! D设置适当的 CPSR 位:: O  }6 i7 z9 ]5 |& v8 X0 ]$ ^+ v

- i$ b# s- x# P+ t/ `* A改变处理器状态进入ARM态
( ^6 Y6 V. w0 y/ z( g6 W+ Y  u! W8 ^3 r: v; i; a2 w' k
改变处理器模式进入相应的异常模式$ M! N& U- n6 h0 Q" J& W5 X; t. i' P8 }
6 O* u  t2 b5 h
设置中断禁止位禁止相应中断 (如果需要)0 t% {! f- M& s2 s9 j; x

% V3 M; M! o  P7 n1 l: g! \保存返回地址到 LR_
" z3 C2 L" u( M) }6 s3 {- N5 R& _6 V$ t
设置 PC 为相应的异常向量
: t$ c3 y9 v, Q3 Q. ]& v1 w  `( y; @& `6 N& K' l( V
返回时, 异常处理需要:$ I  ~* Z0 D- G' L7 [
' c2 d# q  j6 j, U  b$ S$ x# {( L
从 SPSR_恢复CPSR( a- i5 Z" P' K

! o6 l5 r1 Y# [6 D从LR_恢复PC
" L$ Q6 z/ `/ d- z$ D; c- i2 ?+ v
7 y5 B4 ^0 `, t4 `! I以上所有的操作都是在ARM态下进行的。大家看看这个流程是否符合我们从实际生活中所总结的流程。
$ v% \2 l& M' k7 F; y" m% ?+ h3 H2 e7 E
异常发生时,ARM Core自动保存CPSR->SPSR(对应的异常模式下的SPSR寄存器)、保存返回地址->LR(对应的异常模式下的LR寄存器),这些操作都是为了保存现场,以便将来返回。而设置CPSR则是为了处理异常。保存的返回地址则是异常发生前正在执行指令的下一条指令的地址,即此时的(pc-4)。
$ ]) L1 M6 m1 C5 Z: O$ t& `! r! l! F: a5 J% g2 Y! m
处理完成时,我们自己需要恢复CPSR、PC则是为了继续执行异常发生前的指令。4 @: V5 F& P& C4 G

2 l  L7 ]) ^% ?% L而ARM汇编中的跳转指令的执行也才用了同样的流程。大家有兴趣的话,可以自己编写代码调试,观察现象。
! E3 n( N8 {' }  x

该用户从未签到

2#
发表于 2021-11-24 10:08 | 只看该作者
简单介绍完异常源和工作模式后,就分析一下异常处理流程
- Z7 v9 _5 Q9 L$ ]- k

该用户从未签到

3#
发表于 2021-11-24 10:19 | 只看该作者
突然情况发生时,保存当前状态,去处理突发事件,完成后,恢复保存的状态,继续进行/ r3 @: L7 X, I% W
  • TA的每日心情
    开心
    2023-6-2 15:15
  • 签到天数: 1 天

    [LV.1]初来乍到

    4#
    发表于 2021-11-24 10:38 | 只看该作者
    异常发生时,ARM Core自动保存CPSR->SPSR(对应的异常模式下的SPSR寄存器)、保存返回地址->LR(对应的异常模式下的LR寄存器),这些操作都是为了保存现场,以便将来返回
    . A# y3 v. C) x0 P
  • TA的每日心情
    开心
    2025-6-17 15:10
  • 签到天数: 1108 天

    [LV.10]以坛为家III

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-6-18 05:05 , Processed in 0.062500 second(s), 23 queries , Gzip On.

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

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

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