|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
ARM 有7个基本工作模式6 t8 e, p+ Y3 U! V# `7 X# q
User : 非特权模式,大部分任务执行在这种模式
) E1 u c x& m- B/ ~# _2 r FIQ : 当一个高优先级(fast) 中断产生时将会进入这种模式- F8 Q5 G% C- l5 R' K5 X9 C, q- \
IRQ : 当一个低优先级(normal) 中断产生时将会进入这种模式
7 |! Y! o. c7 H$ a Supervisor :当复位或软中断指令执行时将会进入这种模式6 C, C* K% \0 Y* n. ?
Abort : 当存取异常时将会进入这种模式/ \; r9 t! Z! q8 ]# v" [
Undef : 当执行未定义指令时会进入这种模式
0 y$ W/ T5 ^: E- L- \ System : 使用和User模式相同寄存器集的特权模式: I+ p3 A' q- F/ U9 ?) F, i/ N' m0 x
注意:除User(用户模式)是Normal(普通模式)外,其他6种都是Privilege(特权模式)。 Privilege中除Sys模式外,其余5种为异常模式。 各种模式的切换,可以是程序员通过代码主动切换(通过写CPSR寄存器);也可以是CPU在某些情况下自动切换。 各种模式下权限和可以访问的寄存器不同。! @( u! R. J. k5 E3 V2 i- C* x R
非特权模式:User/ _$ Q7 d4 B c1 r. a/ N
特权模式:
: h+ M, ~9 ]- z" a, }% l 异常模式:FIQ IRQ Svc Abort Udef
+ ]0 F+ S+ H) L; z 非异常模式:System Monitor. p1 ?; d( }" h+ V) e
; R/ s% o: j. k- V. {& `; o4 ?
* |/ e2 Q: }" h: b0 `+ X# {2 m; q$ F' G! w- @
ARM寄存器分析
' ?. r& Z$ C" p$ |+ {- m$ l ARM共有37个寄存器,都是32位长度 37个寄存器中30个为“通用”型,1个固定用作PC,一个固定用作CPSR,5个固定用作5种异常模式下的SPSR。# z1 o4 Z4 I9 \* R; L. l
r13(sp)用作堆栈可以保存上下文,便于以后跳转回来能继续执行$ P# O0 D! ?3 z2 F/ Q5 x3 b
r14(lr)用于存储返回地址,当我们返回原模式可以bl lr或者mov pc lr这样就实现了返回
/ w3 Z1 r# g) y" B r15(pc):程序指针,PC指向哪里,CPU就会执行哪条指令(所以程序跳转时就是把目标地址代码放到PC中)
" ~1 \4 q, z- o* O cpsr:中各个bit位表明了cpu的某些状态信息,这些信息非常重要,和后面学到的汇编指令息息相关(譬如BLE指令中的E就和
, E0 l# U2 [$ } T0 D5 Y4 f0 C- S CPSR中的Z标志位有关) cpsr中的I、F位和开中断、关中断有关 cpsr中的mode位(bit4~bit0共5位)决定了CPU的工作模式,& L* R5 V& g8 O
在uboot代码中会使用汇编进行设置。. }! S3 T1 C, @4 e4 k
spsr:用来保存cpsr0 o2 G. H4 Q$ [$ i2 u; z$ r
" |3 x3 y' }/ o# x4 S
4 ?: P2 e, q9 M6 l
* e4 O# u& O/ C1 x, d% z1 D' R* E5 B) y( J, ]1 {
1.条件标志位
$ E: _8 V1 ~2 n( Q$ n& r -N: Negative result from ALU0 o) [- l: d+ n6 F) O2 D
-Z: Zero result from ALU* k) N, w. Q0 C7 ?* O& ~' O l9 p2 M+ v
-C: ALU operation Carried out (进位/借位)/ {$ ~4 \" U1 Q/ u0 I) _& C
-V: ALU operation oveRFlowed (溢出)6 Y8 F: [/ q( W+ ~& d9 y
* N=1时,说明运算的结果为负数,N=0时,说明运算的结果为正数或零。3 t1 p" m, x# l! ?4 K: O2 S8 [, Y
* Z=1时,说明运算的结果为0,Z=0时,说明运算的结果为非0。
; w+ K N1 Z& _: n! c * C:1 _! \4 a6 Z0 _* m0 ]: A# C5 R
- 加法运算(包括CMP):当运算结果产生了进位时(无符号数溢出),C=1,否则为0。: R( R: m5 b% a% s; y
- 减法运算(包括CMP):当运算结果产生了借位时(无符号数溢出),C=0,否则C=1。
0 n0 U) ?$ k3 L+ {+ b% F0 u - 对于包含移位操作的非加减指令操作时,C为移除值的一位。0 `( t+ X* h+ S* U4 j
- 对于其它的非加减指令,C的值通常不变。( R1 H6 y4 i+ ?& z9 C. N
* V:# [# R. A# `% U0 z3 i6 w6 o% c- W
- 对于加减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出 L+ b' _5 b" M; z
- 对于其它的非加减法指令,V的值通常不变。
7 K5 E c1 f) m) O& U8 B' y 2.Q位:# t( h6 e7 t9 I% J' t5 a' _
* 在ARM V5及以上的版本的E系列处理器中,Q标识位指示增强的DSP运算指令是否发生了溢出,在其它版本的处理器中,Q未定义。0 z1 l# p' ~6 ^
3.J位:
, _% c* ]7 q* G* C# b * 仅ARM 5TE/J 架构支持2 x' {: T$ }5 m! l! X
* J=1时,处理器处于Jazelle状态* N! P" p* h- r" Y8 A) w$ [% v, E C
跳转过程
0 c6 @5 M4 ?! u 异常向量表
: A! A2 v, b8 T$ x( C6 J 所有的CPU都有异常向量表,这是CPU设计时就设定好的,是硬件决定的。 当异常发生时,CPU会自动动作(PC跳转到异常向量处处理异常,有时伴有一些辅助动作) 异常向量表是硬件向软件提供的处理异常的支持。
% P3 `5 a6 m1 v3 _! z' H" D ***异常产生时
. \6 Z$ [+ `5 {7 L1 x 做好保护现场的工作:
4 g% E# r* K7 d. y o Z8 h7 c (1)把cpsr保存到spsr中,设置适当的cpsr(改变处理器的ARM状态、改变处理器进入相应的异常模式、(视情况)改变中断禁止位禁止相应中断)
]& J' }2 M: g (2)保存返回地址到lr) I. y5 b4 ?6 [+ c7 y) K% m
(3)设置pc为相应的异常向量
9 i% M' N# Z0 W9 C3 E( w" p 实现跳转。
& E6 q& t6 `$ |# g% T ***异常返回时
3 Q' d) R8 H! M* e3 @# s5 @8 j, S* N 做好恢复现场工作:+ L( F4 w; N2 v- i, [* X
(1)从spsr恢复cpsr9 p% h5 O% Q0 p. q2 u4 q" D
(2)从lr恢复pc W# H8 r; A4 w S& ]& u* Z" t
注意:这些操作必须在ARM状态执行
% O j, Y; g& k: p- ~' [) v TIPS:
& W" c% U( R; n8 i R1 H (1)异常向量表中除了FIQ中断都是4个字节,所以只够存放一段异常处理程序的代码的首地址, h u, N0 J3 u8 H9 Q
(2)FIQ中断为快速中断,其中一个特殊的地方就体现在他的异常向量表(Vector Table)地址在一个,所以它可以存放不止4个字节,这样的话FIQ中断可以不用只存放地址,而是把整个异常处理程序放进去,这样就少跳转了,加快了中断相应速度。
/ L2 S h4 u; K. K% ^: J K9 B
1 d. u$ E' D( ^3 k ` |
|