看到彙編中很多關於程式返回與中斷返回時處理位址都很特別,仔細想想原來是流水線作用的效果。所以,決定總結學習下arm流水線。
arm7處理器採用3級流水線來增加處理器指令流的速度,能提供0.9mips/mhz的指令處理速度。
ps:mips(million instruction per second)表示每秒多少百萬條指令。比如0.9mips,表示每秒九十萬條指令。
mips/mhz表示cpu在每mhz的執行速度下可以執行多少個mips,如0.9mips/mhz則表示如果cpu執行在1mhz的頻率下,每秒可執行90萬條指令。
如果cpu在20mhz的頻率下,每秒可執行1800萬條指令。mips/mhz可以很好的反映cpu的速度。
3級流水線如上圖所示(pc為程式計數器),流水線使用3個階段,因此指令分3個階段執行。
⑴ 取指從儲存器裝載一條指令
⑵ 解碼識別將要被執行的指令
⑶ 執行處理指令並將結果寫會暫存器
以前學過的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位元組
處理器處於thumb狀態時,每條指令為2位元組,所以pc值為正在執行的指令位址加4位元組,即是:
pc值 = 當前程式執行位置 + 4位元組
下面乙個例子就很好的說明了這個問題。
[plain]view plain
copy
print?
0x4000 addpc,pc,#4 ;正在被執行的指令,將位址值pc+4寫入pc
0x4004 ...;正在被解碼的指令
0x4008 ...;正在被取指的指令,pc=0x4008
0x400c ...;pc+4=0x400c
另外補充說明就是根據以上描述,流水線只有被指令填滿時才能發揮最大效能,即每時鐘週期完成一條指令的執行(僅單週期指令)。
如果程式發生跳轉,流水線會被清空,這將需要幾個時鐘才能使流水線被再次填滿。因此,盡量地少使用跳轉指令可以提高程式的執行效率。
以上就是對arm73級流水線的乙個總的認識,參考來自學習arm時的教材——《arm嵌入式系統基礎教程(第二版)》。
ARM體系結構(二) 流水線
一 流水線的概念與原理 處理器按照一系列步驟來執行每一條指令,典型的步驟如下 從儲存器讀取指令 fetch 解碼 以鑑別它屬於哪一種指令 dec 從指令中提取指令的運算元 這些運算元往往存在於暫存器中 reg 如將運算元進行組合以得到結果或儲存器位址 alu 如果需要,則訪問儲存器以儲存資料 mem...
ARM體系結構與程式設計 3
arm儲存系統 arm中用於儲存管理的系統控制協處理器cp15 包含16個32位暫存器,其編號為0到15。實際上對於某些編號的暫存器可能對應有多個物理暫存器。訪問cp15暫存器的指令 mrc mcr。cp15中的暫存器c0和c1 c0中存放arm相關的一些標示符 c1是乙個控制暫存器,用於禁止 使能...
ARM3級流水線的PC值關係
在解釋pc值關係之前先了解一些概念。程式計數器是用於存放下一條指令所在單元的地方。當執行一條指令時,首先需要根據pc中存放的指令位址,將指令由記憶體取到指令暫存器中,此過程稱為 取指令 與此同時,pc中的位址自動加1,或者由轉移指標給出下一條指令的位址。對於32位處理器,一條指令佔據4位元組。流水線...