從MOV PC,PC;(或者ADDPC,PC,#4 )看ARM的三級流水線過程

3級流水線如上圖所示(PC爲程序計數器),流水線使用3個階段,所以指令分3個階段執行。

  • ⑴ 取指從存儲器裝載一條指令code

  • ⑵ 譯碼識別將要被執行的指令效率

  • ⑶ 執行處理指令並將結果寫會寄存器程序

之前學過的51單片機,由於比較簡單,因此它的處理器只能完成一條指令的讀取和執行後,纔會執行下一條指令。這樣,PC始終指向的正在「執行」的指令。而對於ARM7來講由於是3級流水線,因此把指令的處理分爲了上面所述的3個階段。因此處理時實際是這樣的:ARM正在執行第1條指令的同時對第2條指令進行譯碼,並將第3條指令從存儲器中取出。因此,ARM7流水線只有在取第4條指令時,第1條指令纔算完成執行。

下圖生動形象的說明了3級流水線的處理機制

  • 下面一句話很關鍵:不管處理器處於何種狀態,程序計數器R15(PC)老是指向「正在取指」的指令,而不是指向「正在執行」的指令或者正在「譯碼」的指令。人們通常會習慣性的將正在執行的指令做爲參考點,即當前第1條指令。因此,PC老是指向第3條指令,或者說PC老是指向當前正在執行的指令地址再加2條指令的地址。

處理器處於ARM狀態時,每條指令爲4個字節,因此PC值爲正在執行的指令地址加8字節,便是:

  • PC值 = 當前程序執行位置 + 8字節view

  • 處理器處於Thumb狀態時,每條指令爲2字節,因此PC值爲正在執行的指令地址加4字節,便是:vi

  • PC值 = 當前程序執行位置 + 4字節copy

下面一個例子就很好的說明了這個問題。

[plain] view plaincopyprint?
0x4000 ADDPC,PC,#4 ;正在被執行的指令,將地址值PC+4寫入PC 
0x4004 ...;正在被譯碼的指令 
0x4008 ...;正在被取指的指令,PC=0x4008 
0x400C ...;PC+4=0x400C

另外補充說明就是根據以上描述,流水線只有被指令填滿時才能發揮最大效能,即每時鐘週期完成一條指令的執行(僅單週期指令)。若是程序發生跳轉,流水線會被清空,這將須要幾個時鐘才能使流水線被再次填滿。所以,儘可能地少使用跳轉指令能夠提升程序的執行效率這樣你就知道了,若是返回的時候返回PC,那麼中間就有一個指令沒有執行,因此用SUB pclr-irq #4。co

相關文章
相關標籤/搜索