
ARM支持16個協處理器,用于各種協處理器操作,最常使用的協處理器是用于控制片上功能的系統協處理器,例如控制ARM720上的高速緩存和存儲器管理單元等,也開發了浮點ARM協處理器,還可以開發專用的協處理器。
【資料圖】
當一個協處理器硬件不能執行屬于它的協處理器指令時,將產生未定義指令異常中斷。利用該異常中斷處理程序可以軟件模擬該硬件操作。
ARM協處理器指令根據其用途主要分為以下三類:
用于ARM處理器初始化協處理器數據操作指令;用于ARM寄存器與協處理器間的數據傳送指令;用于協處理器寄存器和內存單元間的數據傳送指令。協處理器數據操作完全是協處理器內部的操作,它完成協處理器寄存器的狀態改變。如:在符點協處理器中2個寄存器相加,結果放在第3個寄存器。
ARM對可能存在的任何協處理器提供這條指令。如果它被一個協處理器接受,則ARM繼續執行下一條指令,如果它沒有被接受,則將產生一個未定義中止異常中斷。通常與協處理器號CP#一致的協處理器將接受指令。
協處理器執行由Cop1和Cop2域定義的操作,使用CRn和CRm作為源操作數,并將結果放到CRd。其中,Cop1和Cop2為協處理器操作碼,CRn、CRm和CRd均為協處理器的寄存器。指令中不涉及ARM處理器的寄存器和存儲器。
CDP{} , , CRd, CRn, CRm{, }
舉例:
CDP p5,2,C12,C10,C3,4 ;協處理器p5的操作初始化, ; 其中操作碼1為2,操作碼2 ; 為4,目標寄存器為C12,源 ; 操作寄存器為C10和C3
注:這里Cop1、CRn、CRd、Cop2和CRm域的解釋與協處理器有關。
協處理器數據傳送指令從存儲器讀取數據裝入協處理器寄存器,或將協處理器寄存器的數據存入存儲器。因為協處理器可以支持它自己的數據類型,因此,每個寄存器傳送的字數與協處理器有關。ARM產生存儲器地址,但協處理器控制傳送字數。
存儲器地址計算在ARM內進行,使用ARM基址和8位立即數偏移量進行計算,8位立即數左移2位產生字偏移。
數據由CRd提供或者接受,由協處理器來控制存取字數,N位控制從2種可能長度中選擇一種。
前變址格式:
LDC|STC{}{L} ,CRd,[Rn ]{!}
后變址格式:
LDC|STC{}{L} ,CRd,[Rn],
注:L標志表明選擇長數據類型(N=1)。
是#±<8位立即數>
舉例:
LDC p6,C0,[R1] STCEQL p5,C1,[R0],#4
注意事項:
N和CRd域的解釋與協處理器有關。如果地址不是字對齊的,則最后2位將忽略,有些ARM系統有可能產生異常。存取字數由協處理器控制,ARM將連續產生后續地址,直到協處理器指示存取結束為止。在數據存取的過程中,ARM將不響應中斷請求。因此,為了防止存取過長的數據影響系統的中斷響應時間,將最大存取長度限制到16個字。在ARM和協處理器寄存器之間傳送數據有時是有用的。這些協處理寄存器傳送指令使得協處理器中產生的整數能直接傳送到ARM寄存器或者影響ARM條件碼標志位。典型用法是:
浮點FIX操作,它把整數返回到ARM的一個寄存器。
浮點比較,把比較的結果返回到ARM條件碼標志位
從ARM寄存器中取一個整數,并傳送給協處理器,在那里轉換成浮點表示,并裝入協處理器寄存器進行處理。
在一些較復雜的ARM CPU中,常使用系統控制協處理器來控制Cache和MMU功能。這類協處理器一般使用這些指令來訪問和修改片上的控制寄存器。
協處理器執行由Cop1和Cop2域定義的操作,使用CRn和CRm作為源操作數,并將32位整數結果返回到ARM,ARM再把它放到Rd。其中,Cop1和Cop2為協處理器操作碼,CRn、CRm為協處理器的寄存器。
如果在從協處理器讀取數據的指令中將PC定義為目的寄存器Rd,則由協處理器產生32位整數的最高4位將被放在CPSR中的N、Z、C和V標志位。
(1)從協處理器傳送到ARM寄存器:
MRC{} , ,Rd,CRn,CRm{, }
(2)從ARM寄存器傳送到協處理器:
MCR{} , ,Rd,CRn,CRm{, }
舉例:
MCR p14,3,R0,C1,C2 MRCCS p2,4,R3,C3,C4,6
ARM 32位指令編碼并沒有全部都做了定義,還有一些未使用的編碼可以用來將來擴展指令集。并且算術運算指令、控制指令,Load/Store指令、協處理器指令等都有預留空間。
參考文獻:
孟祥蓮.嵌入式系統原理及應用教程(第2版)[M].北京:清華大學出版社,2017.