淺談ARM協處理器命令MCR-MRC
ARM協處理器cp15,有16個暫存器,詳細看《ARM體系結構與程式設計》
這裡我大概說一下MRC與MCR這兩個協處理器操作,參考《s3c2440》元件手冊P140頁
格式:
<MCR|MRC>{cond} p#,<expression1>,Rd,cn,cm{,<expression2>}
MCR:Move CPU register to coprocessor register
MRC:Move from coprocessor register to CPU register
cond: 就是可選的執行條件
p#:就是指定哪個協處理器,ARM920T好像有兩個一個15一個14
expression1:為協處理器將要執行的操作的操作碼,對於CP15來說,永遠為ob00,即0,如果不是,結果不同預知
Rd:CPU暫存器
cn:目標暫存器的協處理器暫存器
cm:為附加的目標暫存器或者源運算元暫存器,用於區分同一個編號的不同物理暫存器,如果不需要,就將它設定為C0,否則結果不可預知
expression2:附加資訊,用於區別同一編號的不同物理暫存器,如果省略或者為0,就表示不附加,如果不是,後果不可預知
看幾個例子就明白:
MRC p2,5,r3,c5,c6
協處理器p2把c5和c6經過5操作的結果賦給r3
MCR p6,0,r4,c5,c6
協處理器p6把r4執行0操作後將結果存放進c6
MRC p3,9,r3,c5,c6,2
協處理器p3把c5和c6經過9操作(型別2)的結果賦給r3
一個重要的應用是設定cpu匯流排模式:
/* 設定CPU工作於非同步模式 */
mrc p15,0,r0,c1,c0,0
orr r0,r0,#0xc0000000 //R1_nF:OR:R1_iA
mcr p15,0,r0,c1,c0,0