|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
& t0 y0 N& K# }
ARM处理器使用流水线来增加处理器指令流的速度,这样可使几个操作同时进行,并使处理与存储器系统之间的操作更加流畅,连续,能提供0.9MIPS/MHZ的指令执行速度。$ [& S' s0 L; m0 r) [
PC代表程序计数器,流水线使用三个阶段,因此指令分为三个阶段执行:1.取指(从存储器装载一条指令);2.译码(识别将要被执行的指令);3.执行(处理指令并将结果写回寄存器)。而R15(PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或正在“译码”的指令。一般来说,人们习惯性约定将“正在执行的指令作为参考点”,称之为当前第一条指令,因此PC总是指向第三条指令。当ARM状态时,每条指令为4字节长,所以PC始终指向该指令地址加8字节的地址,即:PC值=当前程序执行位置+8;
4 J9 [& d# i6 x' V/ f' |! O ARM指令是三级流水线,取指,译指,执行时同时执行的,现在PC指向的是正在取指的地址,那么cpu正在译指的指令地址是PC-4(假设在ARM状态下,一个指令占4个字节),cpu正在执行的指令地址是PC-8,也就是说PC所指向的地址和现在所执行的指令地址相差8。- K) x2 a: h2 \: h& E1 n7 Z
当突然发生中断的时候,保存的是PC的地址; U1 [6 @+ o% j4 {; z" ?
这样你就知道了,如果返回的时候返回PC,那么中间就有一个指令没有执行,所以用SUB pc lr-irq #4。
5 I( }) R7 q- F) d9 F) f* h+ n% u2 _* A+ \. k E; \$ v4 L) ^
但是在ADS中PC确实是指向即将执行的指令处,这个是软件处理后的结果,主要是为了用户调试程序方便.+ d7 d$ ]) q) E: }
需要注意的是,当前使用指令STM/STR保存R15时候,保存的可能是当前指令地址值+8字节,也可能保存的是当前的指令地址+12字节.到底是哪种,取决于芯片的具体的设计方式。无论如何,在同一芯片中,要么采用当前的指令地址+8,要么采用当前的指令地址+12。因此对于用户来讲,尽量避免使用STM/STR指令来保存R15的值。但是可以在开始的时候用一段程序对芯片的offset进行测试!
9 {* g0 T9 M3 B0 z6 m5 z
0 K3 {1 E3 E' n9 w0 M0 t& u代码如下:
: x" J3 e+ t1 r- C+ \# d% A, E* MSUB R1, PC, #4 ;获得下面的存放下面存放STR指令的地址8 }: F: u( Y7 }& o
STR PC,[R0]0 D7 @9 b7 P. ^/ H3 [( F" E i- m" u
LDR R0,[RO]9 K/ H0 n1 k3 _+ { I
SUB R0, R0, R1
* b' J% Z# L& q. S+ [3 f7 V7 I* o- ~* J A
ARM7中断与PC、LR的问题:8 v9 p1 |; ]& s# f
1,假设当前是PC,PC-4,PC-8(三级流水)# V# a$ k9 f' K( I/ D; E9 g
2,发生IRQ异常,执行保护操作,LR中保存由于FIQ或IRQ占先而没有被执行的指令的地址(即有些资料上把这个地址写成PC或者当前地址,很费解甚至误解)的下一条地址5 k4 N$ H+ k$ k4 ]# j; z5 _
3,清空流水线5 k' h% t2 F% D8 u% p0 u2 z6 ~" d" K
4,进入中断服务程序
) X4 v, h4 |. A. L5 V$ C* ~' P5,待流水线填满,执行操作才被重新挂起(解释了ARM7为什么是0.9MIPS)/ |' @ ]/ v! [) p, V/ m4 R
6,中断返回前,对LR处理,LR=LR-4,指向之前被清空的已译码但没被执行的指令的地址5 Z+ s7 s! B! w& u( I3 @; m/ s
7,清空流水线,返回 o6 K/ i6 R3 R; r* l" Q# Q( t+ }1 D
8,重新对丢弃的前一次已译码指令取指2 d& k0 f5 T/ i8 \
9,待流水线满,开始继续执行 |
|