Arm的三级流水线

流水线使用3个阶段,因此指令分3个阶段执行。


  • 取指从存储器装载一条指令
  • 译码识别将要被执行的指令
  • 执行处理指令并将结果写会寄存器


    ARM的R15(PC)总是指向取指的地方(取指的地方为高地址)。
    当ARM处在ARM指令的时候,每条指令得长度为4,PC = 当前执行+8,当然如果处在THUMB指令中,每条指令长度为2,PC = 当前执行+4.



    ARM正在执行第1条指令的同时对第2条指令进行译码,并将第3条指令从存储器中取出,所以,ARM7流水线只有在取第4条指令时,第1条指令才算完成执行。无论处理器处于何种状态,程序计数器R15(PC)总是指向“正在取指”的指令,即下图中的第三条指令。而不是指向“正在执行”的指令或者正在“译码”的指令。人们一般会习惯性的将正在执行的指令作为参考点,即当前第1条指令。所以,PC总是指向第3条指令,或者说PC总是指向当前正在执行的指令地址再加2条指令的地址。
    Arm的三级流水线_第1张图片

    对于正常流程的程序:

    LR寄存器,常用于在调用子程序分支时存储返回地址,调用完成后用于返回到调用之前的地方继续执行下面的代码(LR地址等于当前子程序分支的下一条指令的地址)。

    对于发生中断的程序

    不同模式如下:(A=当前执行程序的地址)
    (1)SWI和未定义中断
    此时PC指针的地址还没有更新,所以LR的内容为PC-4。

    指令地址:

A  =  PC-8

A+4  = PC-4 --> LR

A+8  = PC --> PC

当发生中断的时候,直接返回A(PC-8)的下一条指令(PC-4)就可以了,所以在执行的时候,直接把LR给PC就行了。说白了,就是在发生这两种异常的时候,PC指针没有更新,仍然等于A+8,还是原来的数值,在返回的时候,直接在LR处执行就可以了。

  返回指令:MOV  PC,LR

(2)FIQ和IRQ中断

在这两种中断中,中断总是在执行完一条指令后开始执行,但这时候PC发生了更新,也就是说PC数值一定不是A+8 了,变成了A+12了,那么相应的LR也变成了A+8(PC-4)。

,如果返回,那么在LR(A+8)处开始执行,这样就跳过了A+4这个地址,少执行了一个指令。所以发生这两种中断的时候,应该返回LR -4。

 中断前:
A = PC -8
A+4 = PC -4 --> LR
A+8 = PC --> PC
中断后:
A = PC-12     ;此处中断
A+4 = PC-8       ;跳过未执行
A+8 = PC-4  --> LR
A+12 = PC         ;已更新

说明白点,比如CPU在执行执行D的时候发生中断,在没有执行完 D指令前是不会处理中断的 ,执行完之后,PC已经更新,然后将PC-4的数值给LR,这个有系统决定,软件无法修改。即A+8。在中断 返回时, 应该执行没有执行的下一条指令,即A+4,所以在返回的时候,将LR-4,所以返回的时候PC= LR-4.返回指令为:SUB PC,LR,#4

(3)指令中止模式中断

此种模式的中断发生时,PC不会更新,但是会在发生中断的地方重新执行,因为 CPU执行指令的时候被打断,这个指令可能就没执行完或者还没执行,一定要重新执行该指令才行 。
指令模式:

A =  PC-8     ;此处发生指令中止中断

A+4 = PC-4     ;LR

A+8 = PC      

所以,发生中断时,PC未更新,即PC = A+8,此时LR = PC-4,即A+4,因为要从被中断指令处重新执行,即从A处重新执行,所以返回LR-4,返回指令:SUB PC, LR, #4

(4)数据访问中止模式中断

此种中断模式,是在数据访问的时候发生中止,所以要像指令中止一样,从此处重新执行,但是不同的是,此时的PC已经更新,不是A+8了,而是变成A+12了,与上面情况类似,LR的数值为 PC-4,即A+8,所以要返回被中断的指令处执行,必须返回LR-8,返回指令为:

SUB PC, LR, #8.

http://blog.csdn.net/zhenganzhong_csdn/article/details/50491830
http://blog.sina.com.cn/s/blog_932ba3b90101mlh8.html

你可能感兴趣的:(嵌入式,arm)