什麼是協處理器:oop
SoC內部另外一處理核心,協助CPU實現某些功能,被主CPU調用執行必定任務。spa
ARM設計上支持16個協處理器,可是通常SoC只實現其中的CP15(cp就是cooperation processor)。操作系統
協處理器和MMU、cache、TLB等處理有關,功能上和操做系統的虛擬地址映射、cache管理有關。設計
協處理器cp15操做指令:mcr & mrc指針
mrc用於讀取cp15中的寄存器ip
mcr用於寫入cp15中的寄存器內存
多寄存器訪問指令:io
ldr/str每週期只能訪問4字節的內存,若是須要批量讀取,寫入內存時太慢,解決方案是stm/ldmpsr
ldm (load register mutiple)sso
stm(store register mutiple)
好比:
stmia sp,{r0-r12}
將r0存入sp指向的內存處(假設爲0x30001000);而後地址+4(指向0x30001004),將r1存入該地址;而後地址再+4(指向0x30001008),將r2存入該地址......直到r12內容放入(0x30001030),指令完成。
一個訪存週期同時完成13個寄存器的讀寫。
主要還有這個ia這個後綴
ia(increase after)先傳輸,再地址+4
ib(increase before)先地址+4,再傳輸
da(decrease after)先傳輸,再地址-4
db(decrease before)先地址-4,再傳輸
fd(full decrease)滿遞減堆棧
ed(empty decrease)空遞減堆棧
fa(……)滿遞增堆棧
ea(……)空遞增堆棧
四種棧:
空棧:棧指針指向空位,每次存入時能夠直接存入而後棧指針移動一格;而取出時須要先移動一格才能取出。
滿棧:棧指針指向棧中最後一格數據,每次存入時須要先移動棧指針一格再存入,取出時能夠直接取出,而後在移動棧指針。
增棧:棧指針移動時像地址增長的方向移動的棧。
減棧:棧指針移動時向地址減少的方向移動的棧。
!的做用
ldmia r0,{r2-r3}
ldmia r0! ,{r2-r3}
感嘆號的做用就是r0的值在ldm過程當中發生的增長或者減小最後寫回到r0去,也就是說ldm時會改變r0的值。
^的做用
ldmfd sp!,{r0-r6,pc}
ldmfd sp!,{r0-r6,pc}^
^的做用:在目標寄存器中有pc時,會同時將spsr寫入到cpsr。通常用於從異常模式返回。