|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
9 o0 j* ]# |% N" u* v1 K n7 }ARM处理器使用流水线来增加处理器指令流的速度,这样可使几个操作同时进行,并使处理与存储器系统之间的操作更加流畅,连续,能提供0.9MIPS/MHZ的指令执行速度。
% x9 b" h& M9 h& C PC代表程序计数器,流水线使用三个阶段,因此指令分为三个阶段执行:1.取指(从存储器装载一条指令);2.译码(识别将要被执行的指令);3.执行(处理指令并将结果写回寄存器)。而R15(PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或正在“译码”的指令。一般来说,人们习惯性约定将“正在执行的指令作为参考点”,称之为当前第一条指令,因此PC总是指向第三条指令。当ARM状态时,每条指令为4字节长,所以PC始终指向该指令地址加8字节的地址,即:PC值=当前程序执行位置+8;- E! y' R' N1 }6 p* o
ARM指令是三级流水线,取指,译指,执行时同时执行的,现在PC指向的是正在取指的地址,那么cpu正在译指的指令地址是PC-4(假设在ARM状态下,一个指令占4个字节),cpu正在执行的指令地址是PC-8,也就是说PC所指向的地址和现在所执行的指令地址相差8。
0 W3 P& V7 J/ K! h) }5 U* [ 当突然发生中断的时候,保存的是PC的地址
1 \% E4 M7 S; P& A 这样你就知道了,如果返回的时候返回PC,那么中间就有一个指令没有执行,所以用SUB pc lr-irq #4。1 Q1 |) J( c0 {
$ R; [' g8 |8 ` R9 T; r' o( h' f 但是在ADS中PC确实是指向即将执行的指令处,这个是软件处理后的结果,主要是为了用户调试程序方便." \1 Z+ I- J, J( T& l# M/ l
需要注意的是,当前使用指令STM/STR保存R15时候,保存的可能是当前指令地址值+8字节,也可能保存的是当前的指令地址+12字节.到底是哪种,取决于芯片的具体的设计方式。无论如何,在同一芯片中,要么采用当前的指令地址+8,要么采用当前的指令地址+12。因此对于用户来讲,尽量避免使用STM/STR指令来保存R15的值。但是可以在开始的时候用一段程序对芯片的offset进行测试!
% ]' H! \: Z! Q/ w" t- F, A7 _6 O! D9 S" Z6 ]- }. [
代码如下:, ~* E% M3 Y* ^6 v* \) h
SUB R1, PC, #4 ;获得下面的存放下面存放STR指令的地址
' q6 T% V4 N4 k: J9 o3 Y* {STR PC,[R0]
& h4 g5 F' k! y; v1 w" }! nLDR R0,[RO]2 J4 e5 B+ ~6 k$ H9 q5 |6 z* `, n
SUB R0, R0, R1' ?6 E; M( E1 F* b" X
`6 \2 T. B7 j5 ~6 D3 q& fARM7中断与PC、LR的问题:
# u/ b+ }5 N# f1,假设当前是PC,PC-4,PC-8(三级流水)
+ ~1 e; P3 L# D! U2,发生IRQ异常,执行保护操作,LR中保存由于FIQ或IRQ占先而没有被执行的指令的地址(即有些资料上把这个地址写成PC或者当前地址,很费解甚至误解)的下一条地址9 b$ e5 o( X7 e: C0 x; `
3,清空流水线5 i( C- \9 i# g( x
4,进入中断服务程序) n& S( J0 V9 a: g+ X& p6 n
5,待流水线填满,执行操作才被重新挂起(解释了ARM7为什么是0.9MIPS)
5 O, _/ G0 U/ F& z+ `6,中断返回前,对LR处理,LR=LR-4,指向之前被清空的已译码但没被执行的指令的地址
5 }7 ?! I( q2 z% \% @ O7,清空流水线,返回
7 U- n7 `; _7 u4 K% i5 c, [8,重新对丢弃的前一次已译码指令取指
$ |# E8 G/ d" W9 ]1 E6 F5 J$ S" }9,待流水线满,开始继续执行 |
|