|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
* ]2 \ L; m' `! _3 [2 c
一、简介+ U ]% n5 \" ?
(1)ARM Cortex系列处理器有40个32位的寄存器,其中包括33个通用寄存器和7个状态寄存器,40个中有18个可编程访问的寄存器: A5 } b; s6 S
(2)寄存器被安排成部分重叠的组,在不同的工作模式和处理器状态下,程序员可以访问的寄存器也不同8 A4 M+ k1 h E; N) @
(3)分组的寄存器在处理处理器异常和特权操作时可得到快速的上下文切换
+ l; O" b0 }% i1 x' f! O/ M& W3 v, j3 r5 T% \
二、8种处理器工作模式下实际访问的寄存器7 G+ ^* _2 n0 v Q8 q7 p
7 x6 Z; q& y m- R+ O( T7 A
- f6 u, c/ q' M r7 y4 F( User用户模式 )
/ E4 M1 n3 b+ }3 @8 a% I( X) U0 C7 H; T
& q6 R7 r: k5 H4 t2 B9 {
( System系统模式 )- v" R" Z8 J5 f. e$ A: [; p
5 q: k4 s& c( l G- B9 B
! E& I% @' m' K
( Supervisor管理模式 )( Q2 Y$ V8 q u, \1 ~
$ g4 u6 E5 ?; h9 C w( z
- @, @8 q8 ?* @ q. s
( Abort数据访问终止模式 )
6 P/ _" E' q! U2 i+ }1 k3 ~4 @
. |% Q/ t, T- t7 I; a% |9 F
8 K7 r/ U- J4 O" N+ d' B1 J( Undefined未定义指令中止模式 )2 Q% ~ `) v" z9 i* @
6 Q( F N2 k0 W$ G% ^' t; B
) a& s( ^3 u |8 k0 I( ~. U) J
( IRQ外部中断模式 )
7 e/ C5 F8 V9 x% b0 n% f
A: C4 a* p6 s- ]9 S# p( _! Y
1 z9 Y) b& ]8 T% h
( FIQ快速中断模式 )
3 u# k$ ]- T' C7 Z/ `5 Q9 [" j
) j* b: m/ {7 d+ s" v% n+ C
; u1 [$ \3 D0 i$ S( A$ c) s" o
( Secure Monitor安全监控模式 )% _5 m; c# H) m! r5 K8 y5 v, C: |* `
4 R! J! I+ s1 |& I) O
三、通用寄存器(用于保存数据或地址值): t6 T1 }/ |: j Y
通用寄存器(R0-R15)可以分为三类:未分组寄存器R0-R7,分组寄存器R8-R14,程序计数器PC(R15) U& O' l0 W$ l! Z& }
" d; n* W/ u) m4 p(1)未分组寄存器R0-R71 \2 u# m* H6 }5 F' f
1.对于每一个未分组寄存器来说在所有处理器模式下指的都是一个物理寄存器。
1 l7 X$ i0 G$ g, B r" w+ ]2.在异常中断造成的处理器模式切换时,由于不同的处理器模式下指的都是同一物理寄存器,可能造成未分组寄存器中数据破坏。
! T: g: z) Z3 ?6 }9 ]4 M3.任何可采用通用寄存器的应用场合都可以使用未分组寄存器。
! j o( H9 {& h0 i6 Q5 I
w7 |* A' C2 J4 J: q1 L, l7 s(2)分组寄存器R8-R14
5 J6 s! ^" e' i( W( a分组寄存器是指同一个寄存器名。在ARM微处理器内部存在多个独立的物理寄存器,每一个物理寄存器分别与不同的处理器模式相对应。% l9 N) U v5 V9 f3 I- ]. B( Y
1.R8-R12有两个分组的寄存器。一个用于FIQ模式,另一个用于其他7种工作模式。这样在发送FIQ中断时,可以加快FIQ的处理速度。
/ _" u( _2 f* Y# E3 c C2.R13-R14分别有7个分组的物理寄存器。一个用于用户和系统模式。另一个用于其他六个分别用于六种异常模式。; L/ q" k" |& i0 i
$ x; x8 I6 g/ w. r
(3)程序计数器PC(R15)
! g9 `: H3 ], b由于ARM体系结构采用了流水线机制(以三级流水线为例),对于ARM指令集来说,PC指向当前指令的下两条指令的地址,即PC的值为当前指令的地址值加8个字节。
% [0 {* ^" `% n9 T! Y i, F; W
: u" s% ^/ H7 t: U: x. f0 R补:(1)R13(SP) 堆栈指针寄存器
2 O9 S: m" I9 p4 u' {1.在ARM指令集当中,没有以特殊方式使用R13的指令或其它功能,只是习惯上都用做堆栈指针寄存器。
/ F; z! x9 b5 \* q; {2.但是在Thumb指令集中,有一些指令强制性地将R13作为堆栈指针寄存器,如堆栈操作指令。
) P6 u1 n- X% ~% g g1 B: o8 Z异常处理程序负责初始化自己的R13,让其指向该异常模式专用的栈地址。' J Y2 U h) p7 X. w b( }
( Y! B7 @( n$ Q+ W/ P(2)R14(LR)连接寄存器, p4 w) v1 S6 G
- R14寄存器的两种特殊功能0 D5 {% b7 p6 d. H
1.在每种工作模式下,模式自身的R14版本用于存放当前子程序的返回地址。在子程序返回时,把R14的值复制到PC。+ K' Y/ t6 C8 B
2.当异常中断发生时,R14被设置成该异常模式的返回地址。对于有些模式,R14的值可能与返回地址有一个常数的偏移量(如数据异常)。
7 w* s9 N: @/ F# m! B' t. g' d4 N- A4 |. O
- R14寄存器与子程序调用操作流程# D! B7 g5 C$ | f( M
1.程序A执行过程中调用程序B;
2 Q& B, I/ p* q3 V2.程序跳转至标号Lable,执行程序B。同时硬件将“BL Lable”指令的下一条指令所在地址存入R14;
3 M9 m, `+ O( ?5 x2 i2 C3.程序B执行最后,将R14寄存器的内容放入PC,返回程序A; a( c q; c- K R
( }3 Q3 ?" ?4 F, _+ Q' L/ @- R14寄存器与异常处理3 j3 J- V* y) w y; i6 g. B
1.异常发生时,程序要跳转至异常服务程序,对返回地址的处理与子程序调用类似,都是由硬件完成的。区别在于有些异常有一个小常量的偏移
, g7 N9 w4 w/ B! }$ p注:当发生异常嵌套时,这些异常之间可能会发生冲突。" U& [8 m& b$ J: s7 B& r/ u
例如:如果用户在用户模式下执行程序时发生了IRQ中断,用户模式寄存器不会被破坏。但是如果允许在IRQ模式下的中断处理程序重新使能IRQ中断,并且发生了嵌套的IRQ中断时,外部中断处理程序保存在R14_irq中的任何值都将被嵌套中断的返回地址所覆盖。
- n' F2 e, t- R# |2.异常处理流程:
+ V$ u0 K) H# X: `$ I) E3 v
5 A0 y+ e0 M. c O/ J+ V7 g
8 s1 t n+ {, L- {( h2 @
' n7 G2 C# _6 ]
( e" S0 }: l1 u o) I
) e& b7 b( o0 x \/ m- f
! ^/ e+ F' R# e) U" Z2 h# q5 p" \0 n5 E; r! q; N2 _
解决办法:确保R14的对应版本在发生中断嵌套时不再保存任何有意义的值(将R14入栈),或者切换到其它处理器模式下。
" Q. ?6 V4 o& m5 f0 B& S
. p1 ?( \2 e- m" l* |/ i" Y(3)寄存器R15为程序计数器PC3 w0 u l) h* Z" I3 c2 P: p0 g, J/ }
它指向正在取指的地址。可以认为它是一个通用寄存器,但是对于它的使用有许多与指令相关的限制或特殊情况。如果R15使用的方式超出了这些限制,那么结果将是不可预测的。
7 `7 s, }7 Y9 J$ i, V) ]1 N0 m# Z% S1.读R15的限制0 ^. ~! k4 E4 \/ \; r: ^
正常操作时,从R15读取的值是处理器正在取指的地址,即当前正在执行指令的地址加上8个字节(两条ARM指令的长度)。由于ARM指令总是以字为单位,所以R15寄存器的最低两位总是为0。
/ e1 R; X8 E r2 Z2.写R15的限制
+ g* H2 c2 D; g" Q0 c# c# Y正常操作时,写入R15 的值被当作一个指令地址,程序从这个地址处继续执行(相当于执行一次无条件跳转)。3 L% G. Q6 S( F4 C9 j
由于ARM指令以字为边界,因此写入R15的值最低两位通常为0b00。具体的规则取决于内核结构的版本:1 @ n) I$ D+ @+ F
在ARM结构V3版及以下版本中,写入R15的值的最低两位被忽略,因此跳转地址由指令的实际目标地址(写入R15的值)和0xFFFFFFFC相与得到;
+ I ?: y; ^5 ~1 z/ g3 ] I在ARM结构V4版及以上版本中,写入R15的值的最低两位为0,如果不是,结果将不可预测。3 Q( L# e& R$ O! E
8 P, ?. e" I4 p; j/ `
) a' L! h R7 ^1 N
四、程序状态寄存器
5 p" V+ Y+ C# y3 u7 t: m$ C包含1个当前程序状态寄存器(CPSR)和6个备份的程序状态寄存器(SPSR)6 r$ t* s# l7 n# {; P2 e. D* f( j
每种异常都有自己的SPSR,在因为异常事件而进入异常时它保存CPSR的当前值,异常退出时可通过它恢复CPSR。, u- m0 @) H# v) ?" c' u$ J
8 b- ?9 ~; p( F3 ?3 H* L9 c% P0 H: k) V7 t4 y/ `4 p
|
|