EDA365电子论坛网

标题: ARM寄存器分析以及异常处理方法 [打印本页]

作者: zxcvbvbnmn    时间: 2021-4-30 13:59
标题: ARM寄存器分析以及异常处理方法
ARM 有7个基本工作模式
5 B, L1 \, |9 S  u* Z  User : 非特权模式,大部分任务执行在这种模式
# T4 G  d6 x3 ^7 _. t  FIQ : 当一个高优先级(fast) 中断产生时将会进入这种模式5 v! B0 @1 V+ a3 t. `
  IRQ : 当一个低优先级(normal) 中断产生时将会进入这种模式$ y( U1 ?. f& {6 |0 N1 t- A4 a
  Supervisor :当复位或软中断指令执行时将会进入这种模式
6 C3 n3 F3 R. w/ R+ |" E  Abort : 当存取异常时将会进入这种模式4 ?9 p" ]& `2 k" W
  Undef : 当执行未定义指令时会进入这种模式2 N; T+ c0 A0 Y
  System : 使用和User模式相同寄存器集的特权模式
/ t* I& h: V: F% x2 O  注意:除User(用户模式)是Normal(普通模式)外,其他6种都是Privilege(特权模式)。 Privilege中除Sys模式外,其余5种为异常模式。 各种模式的切换,可以是程序员通过代码主动切换(通过写CPSR寄存器);也可以是CPU在某些情况下自动切换。 各种模式下权限和可以访问的寄存器不同。7 C! S% p% Y1 w4 y$ r
  非特权模式:User  G/ V1 }! W# k8 _
  特权模式:+ _* C3 `/ L4 h; I, R* x4 j
  异常模式:FIQ IRQ Svc Abort Udef! s1 c/ x0 E6 b$ I- j
  非异常模式:System  Monitor
, j* X( {. C7 u2 H" g! D4 y' l
' Y- c% U% u  T3 i$ S

1 l9 b$ g/ @0 N! m/ e, i
# E! R; d! Q* _7 @
ARM寄存器分析
9 @# {3 r' b4 j& [0 S% U9 T$ `  ARM共有37个寄存器,都是32位长度 37个寄存器中30个为“通用”型,1个固定用作PC,一个固定用作CPSR,5个固定用作5种异常模式下的SPSR。
$ H* a; w9 H( v1 U5 F* O6 e  r13(sp)用作堆栈可以保存上下文,便于以后跳转回来能继续执行
3 E- Y8 _# T# E! Y$ f' i2 s  r14(lr)用于存储返回地址,当我们返回原模式可以bl lr或者mov pc lr这样就实现了返回
; B9 T3 i( g6 t# N3 g# D  r15(pc):程序指针,PC指向哪里,CPU就会执行哪条指令(所以程序跳转时就是把目标地址代码放到PC中)
3 }3 y5 ~  {$ {) R& Z) M3 }  cpsr:中各个bit位表明了cpu的某些状态信息,这些信息非常重要,和后面学到的汇编指令息息相关(譬如BLE指令中的E就和1 h+ x* }# [4 [! ]
  CPSR中的Z标志位有关) cpsr中的I、F位和开中断、关中断有关 cpsr中的mode位(bit4~bit0共5位)决定了CPU的工作模式,
; ^1 c' ~' i+ M/ |" a  在uboot代码中会使用汇编进行设置。
6 r2 g6 b4 p5 |  spsr:用来保存cpsr
3 j( U! o5 l6 F& z& x9 P, J/ C5 c3 c) V
, Q& M) b8 I( V) x
! M& ]* h& M- Q8 v: J

( H* L. E) J0 i1.条件标志位3 m% Z' `# V, v7 v0 Y) c
  -N: Negative result from ALU
$ F& i* t$ R" @$ M, y  -Z: Zero result from ALU
2 q, C5 ^$ V( X  }  -C: ALU operation Carried out (进位/借位)
7 R9 T1 z8 l( a5 l2 m  -V: ALU operation overflowed (溢出)3 [. d% i" Y1 S  }; n. e- h& p
  * N=1时,说明运算的结果为负数,N=0时,说明运算的结果为正数或零。
8 a6 s& r% g4 x6 v# F( J$ n0 A  * Z=1时,说明运算的结果为0,Z=0时,说明运算的结果为非0。4 S, c7 u" o/ i3 B6 C+ X
  * C:
' J9 ^. {- r9 I5 k+ C  Y+ `& \  - 加法运算(包括CMP):当运算结果产生了进位时(无符号数溢出),C=1,否则为0。" ^5 B* _4 R# ]  x$ p0 P; t
  - 减法运算(包括CMP):当运算结果产生了借位时(无符号数溢出),C=0,否则C=1。4 F+ l) K% s+ W3 `
  - 对于包含移位操作的非加减指令操作时,C为移除值的一位。
9 ]' O1 C$ s& s' l+ A; ]  - 对于其它的非加减指令,C的值通常不变。7 w8 M5 D# }. e( ^' b, x( h
  * V:
6 V9 x  F  B# H5 F  T  - 对于加减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出
9 e( K# T6 @# n5 q# D  - 对于其它的非加减法指令,V的值通常不变。4 y5 f. w8 M8 r5 g, n
  2.Q位:
0 G, }4 l! X( c4 ~; c  x& T  * 在ARM V5及以上的版本的E系列处理器中,Q标识位指示增强的DSP运算指令是否发生了溢出,在其它版本的处理器中,Q未定义。
8 ~% z! \( r# K$ ^  3.J位:
: p3 H. j- x0 V/ b$ R) d* v/ t  * 仅ARM 5TE/J 架构支持4 ~* O* x0 k" T& a$ t
  * J=1时,处理器处于Jazelle状态. E0 _+ c) d/ T2 H7 c7 _
  跳转过程6 i1 v2 h$ }  m1 C, K, y
  异常向量表
; g* d' H/ S+ \( w  所有的CPU都有异常向量表,这是CPU设计时就设定好的,是硬件决定的。 当异常发生时,CPU会自动动作(PC跳转到异常向量处处理异常,有时伴有一些辅助动作) 异常向量表是硬件向软件提供的处理异常的支持。" T; \: T/ W/ l6 P0 \
  ***异常产生时
, M9 c' L: g7 z0 w: s* L' F  做好保护现场的工作:0 N( E& }  e8 U6 }" v; U5 ^
  (1)把cpsr保存到spsr中,设置适当的cpsr(改变处理器的ARM状态、改变处理器进入相应的异常模式、(视情况)改变中断禁止位禁止相应中断)9 y! i1 F7 l2 e' b5 e" U" B$ K# ~
  (2)保存返回地址到lr
: S( v5 q5 B6 ^: v  (3)设置pc为相应的异常向量
- `/ c6 v8 C: T9 S8 u6 Z  实现跳转。
0 R, j" v: q5 c* ^$ ~  ***异常返回时) }/ |( R$ A! Y$ l& C
  做好恢复现场工作:3 w) s1 K8 p1 w
  (1)从spsr恢复cpsr& [4 [: h- P5 a
  (2)从lr恢复pc
/ x3 ]/ c3 Z# I  注意:这些操作必须在ARM状态执行2 V, M9 \& t* U
  TIPS:$ |1 y3 S( H3 S, h$ Y: i  j; U+ ]
  (1)异常向量表中除了FIQ中断都是4个字节,所以只够存放一段异常处理程序的代码的首地址- o; d# m4 N; H7 J
  (2)FIQ中断为快速中断,其中一个特殊的地方就体现在他的异常向量表(Vector Table)地址在一个,所以它可以存放不止4个字节,这样的话FIQ中断可以不用只存放地址,而是把整个异常处理程序放进去,这样就少跳转了,加快了中断相应速度。# R, q  h; m5 i
. ?8 Q$ ~) c  e+ M

作者: 1597689180@qq.c    时间: 2021-4-30 14:14
学习了!不错!
作者: shapeofyou888    时间: 2021-4-30 15:05
FIQ中断为快速中断




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2