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

ARM异常处理流程

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
在学习与开发ARM处理器的过程中,一个不能绕开的话题就是异常处理流程。它在ARM的体系架构中,占据着不可动摇的重要地位。此处就以Coterx-A系列的ARM处理器简单分析一下异常中断处理流程。
- f4 y) \. Z4 G$ p# v( p5 R
- l0 J. R/ V" `5 T( a说异常处理流程之前,我们先说一下ARM处理器的工作模式和异常源。. F/ Z. t: u6 W. T) c) W7 x
$ x8 G$ T% }( F! [4 g0 X. [
在Coterx-A系列之前的ARM处理器,一共有个基本工作模式:3 t) E( x  k3 q+ X

4 J! {: G; V4 T! c9 nUser : 非特权模式,大部分任务执行在这种模式;( y) f$ Y: G  ]3 p) R( t. J% _: e

4 h! f* I8 b2 x1 iFIQ : 当一个高优先级(fast) 中断产生时将会进入这种模式;  L- _" J# K" {

3 j* z% e' w9 v2 t) i4 C# Y# oIRQ : 当一个低优先级(normal) 中断产生时将会进入这种模式;
8 T; i/ {2 R5 h' a" Z) n
5 \) p5 C8 [. E) _! \Supervisor :当复位或软中断指令执行时将会进入这种模式;4 L, |  C: `, t( ]9 d

9 p3 Y' W  ^6 U8 q8 ~9 |8 rAbort : 当存取异常时将会进入这种模式;
/ F1 ?0 S8 Y( `0 q% _: D2 [( R3 f9 K4 c8 m2 q" F
Undef : 当执行未定义指令时会进入这种模式;6 w" ~3 m" N' n' l& L" m4 _- p% r

! H2 r& A) X: BSystem : 使用和User模式相同寄存器集的特权模式;
* {0 Q, V& O  M4 {. ]( e% N2 o
- f* P+ H) e6 n& x: H8 h* G而Coterx-A系列处理器则多了一种工作模式:
4 S7 s% w2 f$ s7 C" z7 ?6 f* q. K
Monitor : 是为了安全而扩展出的用于执行安全监控代码的模式;
: P) `! t" `) C( u
3 Y+ K; V# A6 _, P简单介绍完异常源和工作模式后,就分析一下异常处理流程。4 K0 E% H/ q3 X

( q, q9 e9 E, l, k/ N我们先想一下现实生活中遇到的类似情况,看看我们是怎么处理的。假如我们现在正在听歌,突然门铃响了,我们怎么办呢?首先把歌暂停一下,也就是保存当前正在播放的状态。然后去开门看看是谁,忙完了,继续回来听歌。总结一下:突然情况发生时,保存当前状态,去处理突发事件,完成后,恢复保存的状态,继续进行。
" \) U+ C  x! V' \6 G1 X4 f
# Q, m% t. Q! c; P7 k+ W而在ARM内核规定的异常处理流程也采用了类似的流程。  i& R  p2 i7 a7 u# s+ s& k
4 B' b5 L5 L' p) c% f7 r
当异常产生时, ARM core:
7 T2 \. C- r8 t8 N/ Y
  ?: j3 b/ b* f% V% Q! _, i0 x# u拷贝 CPSR 到 SPSR_( q5 k" ]3 Z2 V  Q# A4 n+ E

! c0 X, {# W! `: Q+ t设置适当的 CPSR 位:
% e, }2 t6 o" v! [; E" d+ _$ x* s6 B7 B/ f
改变处理器状态进入ARM态' h. B- A. Y$ ~* c  [' I4 U9 F& [4 L  [

& k0 o8 U  v8 i) n/ s改变处理器模式进入相应的异常模式0 u! J3 {: r: z# C
% v. ?! \  L+ p: Z4 c" L1 ]7 U* s# X
设置中断禁止位禁止相应中断 (如果需要)
1 C3 H4 \/ Q+ J4 r
+ C0 Z7 [- i- [% D; l# H保存返回地址到 LR_
+ B: |7 c, q" [5 T; q8 i# m) a( B: N; o
设置 PC 为相应的异常向量
  d4 i0 L& q. E, z2 S6 y
$ s" t8 r" s+ C4 L) v7 u返回时, 异常处理需要:
! N' T% x/ G, H1 ]( U  A6 v1 k% k' s8 @! n4 z& R' K+ {5 [8 O
从 SPSR_恢复CPSR
6 s  O$ U9 A: d2 k. Z/ ]2 n6 |% y  F. a- F* M3 C
从LR_恢复PC
& m/ z0 w: r8 _9 n9 x* C3 {$ g' i1 F
以上所有的操作都是在ARM态下进行的。大家看看这个流程是否符合我们从实际生活中所总结的流程。
( o( ?0 i; H5 x9 R; d  Q$ j4 |) }7 y4 S' _' R- F
异常发生时,ARM Core自动保存CPSR->SPSR(对应的异常模式下的SPSR寄存器)、保存返回地址->LR(对应的异常模式下的LR寄存器),这些操作都是为了保存现场,以便将来返回。而设置CPSR则是为了处理异常。保存的返回地址则是异常发生前正在执行指令的下一条指令的地址,即此时的(pc-4)。- `1 ~' @7 r1 ]+ a0 G9 P
0 g# D, }. P* x) A! [
处理完成时,我们自己需要恢复CPSR、PC则是为了继续执行异常发生前的指令。
& o! n$ O# g0 T+ U5 p; M0 e& h+ y
而ARM汇编中的跳转指令的执行也才用了同样的流程。大家有兴趣的话,可以自己编写代码调试,观察现象。

$ @0 Z% p. `- n$ C7 @

该用户从未签到

2#
发表于 2021-11-24 10:08 | 只看该作者
简单介绍完异常源和工作模式后,就分析一下异常处理流程
9 Q, \0 M0 ^+ d8 R" N3 ~

该用户从未签到

3#
发表于 2021-11-24 10:19 | 只看该作者
突然情况发生时,保存当前状态,去处理突发事件,完成后,恢复保存的状态,继续进行' I# Y% P2 A) C% z- j; ?7 S- ]/ m
  • TA的每日心情
    开心
    2023-6-2 15:15
  • 签到天数: 1 天

    [LV.1]初来乍到

    4#
    发表于 2021-11-24 10:38 | 只看该作者
    异常发生时,ARM Core自动保存CPSR->SPSR(对应的异常模式下的SPSR寄存器)、保存返回地址->LR(对应的异常模式下的LR寄存器),这些操作都是为了保存现场,以便将来返回7 d; w& \6 W( l" d. N& U! _8 O. Z
  • TA的每日心情
    开心
    2025-7-18 15:39
  • 签到天数: 1131 天

    [LV.10]以坛为家III

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-7-20 04:55 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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