|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
ARM 有7个基本工作模式
8 T! u% q+ e* w& E User : 非特权模式,大部分任务执行在这种模式% ]/ H. u; r3 D+ ^8 |3 ]3 P
FIQ : 当一个高优先级(fast) 中断产生时将会进入这种模式/ H2 q* k6 ^$ ?$ S! d8 A! A6 o* F* I: f) F
IRQ : 当一个低优先级(normal) 中断产生时将会进入这种模式
) w" _ K" O% Y- b) u5 H: L3 |) b Supervisor :当复位或软中断指令执行时将会进入这种模式
& T* W: Y8 ?3 j( S4 `- F( H5 h" X Abort : 当存取异常时将会进入这种模式 z1 p+ ^: i6 P9 L/ n. a) |9 [! X7 `/ z
Undef : 当执行未定义指令时会进入这种模式
6 l( H/ o% G" O6 p! j" Z System : 使用和User模式相同寄存器集的特权模式
0 F) e7 {" I; ~4 ]. x" r* U 注意:除User(用户模式)是Normal(普通模式)外,其他6种都是Privilege(特权模式)。 Privilege中除Sys模式外,其余5种为异常模式。 各种模式的切换,可以是程序员通过代码主动切换(通过写CPSR寄存器);也可以是CPU在某些情况下自动切换。 各种模式下权限和可以访问的寄存器不同。
( D& ^! j; k) n1 w1 t 非特权模式:User+ ^6 j& n+ Y0 c* S! {% [
特权模式:% Z( ]3 o7 I5 K" O$ V9 D# `
异常模式:FIQ IRQ Svc Abort Udef
; P c0 }+ e. S0 y+ n2 k 非异常模式:System Monitor; ^- f& i7 D$ t# I& X1 m
, |& E( c1 O0 l0 T
# c7 S- E( a4 M6 O
+ L3 x; L7 g% i' ZARM寄存器分析
$ ]6 C2 ^: G- O% G" Y3 d ARM共有37个寄存器,都是32位长度 37个寄存器中30个为“通用”型,1个固定用作PC,一个固定用作CPSR,5个固定用作5种异常模式下的SPSR。
: [. [+ E& R4 Y4 |8 T1 ~& p r13(sp)用作堆栈可以保存上下文,便于以后跳转回来能继续执行
/ h9 H* M0 Y% }0 Q7 F" | r14(lr)用于存储返回地址,当我们返回原模式可以bl lr或者mov pc lr这样就实现了返回
. X- D' `* M7 i r15(pc):程序指针,PC指向哪里,CPU就会执行哪条指令(所以程序跳转时就是把目标地址代码放到PC中)
) C- a$ p& a) S cpsr:中各个bit位表明了cpu的某些状态信息,这些信息非常重要,和后面学到的汇编指令息息相关(譬如BLE指令中的E就和
- ^' H" R# m, C I/ O CPSR中的Z标志位有关) cpsr中的I、F位和开中断、关中断有关 cpsr中的mode位(bit4~bit0共5位)决定了CPU的工作模式,
' s+ r# s, y2 t& Z+ J; q8 q2 r 在uboot代码中会使用汇编进行设置。8 Q( Z* ^5 _: `( i; ^7 F! L0 J
spsr:用来保存cpsr
$ Y/ _/ l& [- M2 @5 g
/ [" S$ E8 N; v0 J L9 d% m) D# l) I& E
3 c1 F* f. y: r U# R- s& @, z; ~! a
/ R: w5 U0 o2 [5 {$ m1.条件标志位8 P) j% u& {- R+ d9 G+ o: N
-N: Negative result from ALU
9 |/ W: U; F7 d5 s- B -Z: Zero result from ALU: u2 L2 u! D: O; Y* }3 [9 j
-C: ALU operation Carried out (进位/借位)7 |5 M) p0 T8 |
-V: ALU operation oveRFlowed (溢出)3 }; V! H9 R/ D& v. ^
* N=1时,说明运算的结果为负数,N=0时,说明运算的结果为正数或零。" I% B0 L9 l' A& I9 D" @8 u
* Z=1时,说明运算的结果为0,Z=0时,说明运算的结果为非0。2 Y: a1 n" l* p
* C:7 M2 g2 z: ?$ s, ?
- 加法运算(包括CMP):当运算结果产生了进位时(无符号数溢出),C=1,否则为0。5 W* n" T& a" C7 M, M
- 减法运算(包括CMP):当运算结果产生了借位时(无符号数溢出),C=0,否则C=1。, e; X' L2 ], b& D" G
- 对于包含移位操作的非加减指令操作时,C为移除值的一位。
% _# b4 y0 Y! u0 Z( Y; g( p1 M - 对于其它的非加减指令,C的值通常不变。
; H( e* R7 z( o8 p& y; T% m0 L * V:
; ?' C5 @+ p: c# K3 r) M4 g6 W - 对于加减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出
, Z% O% q2 u; J# T8 ^ - 对于其它的非加减法指令,V的值通常不变。
e! p3 A9 `' {; K, ? 2.Q位:7 |9 W4 Z3 a" k: D: P
* 在ARM V5及以上的版本的E系列处理器中,Q标识位指示增强的DSP运算指令是否发生了溢出,在其它版本的处理器中,Q未定义。
( g, ~4 f/ r2 l5 t( R+ @0 y 3.J位:
9 G# F1 S9 x$ G& W8 s/ C) r! `: c$ B * 仅ARM 5TE/J 架构支持, I k9 U7 m! }, p1 w; R, V
* J=1时,处理器处于Jazelle状态
, m7 |( Y5 m. r' }: @1 c" E! V 跳转过程
2 t0 B7 H& K {& d- j 异常向量表
8 w# }5 F& X) h: T$ W 所有的CPU都有异常向量表,这是CPU设计时就设定好的,是硬件决定的。 当异常发生时,CPU会自动动作(PC跳转到异常向量处处理异常,有时伴有一些辅助动作) 异常向量表是硬件向软件提供的处理异常的支持。
9 f/ D1 F0 U6 D/ S; |2 ]; z: q ***异常产生时% J4 A( h1 u) j8 S& W5 i9 e1 {8 Z' M
做好保护现场的工作:: _' N' l$ ?* Z" X. O/ i
(1)把cpsr保存到spsr中,设置适当的cpsr(改变处理器的ARM状态、改变处理器进入相应的异常模式、(视情况)改变中断禁止位禁止相应中断)
" m8 ~' [1 ]0 R$ L (2)保存返回地址到lr
% E# T5 v' E% x+ i (3)设置pc为相应的异常向量
2 b {/ v$ c5 l$ }; E: N$ m1 J) q 实现跳转。
5 w4 K' Y' j7 H/ z1 b ***异常返回时
: G0 j5 a$ {9 p5 Z0 ~( l3 I 做好恢复现场工作:
$ U! R. u2 x- G3 u1 z9 q (1)从spsr恢复cpsr
7 Q$ R1 j0 H- F, F" ]( h9 P (2)从lr恢复pc
0 M3 m6 p; w) n# b3 R! s 注意:这些操作必须在ARM状态执行: y4 E+ D0 W) T+ n: m6 U+ Z
TIPS:
7 ?4 h' I2 I( l' b (1)异常向量表中除了FIQ中断都是4个字节,所以只够存放一段异常处理程序的代码的首地址6 `) I7 @& N! u0 g
(2)FIQ中断为快速中断,其中一个特殊的地方就体现在他的异常向量表(Vector Table)地址在一个,所以它可以存放不止4个字节,这样的话FIQ中断可以不用只存放地址,而是把整个异常处理程序放进去,这样就少跳转了,加快了中断相应速度。# I. |! @/ L3 f0 A4 W
4 M( u" y8 [; _4 r2 M |
|