天天看點

淺析ARM協處理器CP15寄存器有關指令:MCR\MRC背景:

背景:

  在uboot中,start.s中涉及到了 CP15 的有關操作。查閱有關資料,進行學習。

淺析ARM協處理器CP15寄存器有關指令:MCR\MRC背景:
    mrc p15, 0, r0, c1, c0, 0
    bic r0, r0, #0x00002000 @ clear bits 13 (--V-)
    bic r0, r0, #0x00000007 @ clear bits 2:0 (-CAM)
    orr r0, r0, #0x00000002 @ set bit 1 (--A-) Align
    orr r0, r0, #0x00000800 @ set bit 11 (Z---) BTB
    mcr p15, 0, r0, c1, c0, 0      
淺析ARM協處理器CP15寄存器有關指令:MCR\MRC背景:

在基于ARM的嵌入式系統中,存儲系統通常是通過系統控制協處理器CP15完成的。很多進階的寄存器并不能夠直接通路。

CP15可以包含16個32位的寄存器,其編号為0-15。

實際上對于某些編号的寄存器可能對應有多個實體寄存器。在指令中指定特定的标志位來區分這些實體寄存器。

有些類似于ARM寄存器中,處于不同的處理器模式時,ARM某些寄存器可能不同。

在這裡不對CP15各組寄存器做詳細的分析,僅提供查閱的手段。

MCR/MRC 用于系統存儲管理的協處理器CP15,指令格式:

  MCR {cond}     coproc,opcode1,Rd,CRn,CRm,opcode2
  MRC {cond}     coproc,opcode1,Rd,CRn,CRm,opcode2      

 *這2條指令僅适用于32位寄存器,因為64位寄存器僅由{CRm,opcode1}辨別。

<coproc>         指令操作的協處理器名,标準名為pn,n,為0~15 

<opcode1>      協處理器的特定操作碼,對于CP15寄存器來說,opcode1永遠為0,不為0時,操作結果不可預知

 <Rd>    作為元寄存器的ARM寄存器。其值被讀寫到得協處理器寄存器中。

        <Rd>不能為PC, 當其為PC時。指令操作結果不可預知。

<CRn>             存放第1個操作數的協處理器寄存器。

<CRm>            存放第2個操作數的協處理器寄存器。    (用來區分同一個編号的不同實體寄存器,當不需要提供附加資訊時,指定為C0)

<opcode2>      可選的協處理器特定操作碼。                (用來區分同一個編号的不同實體寄存器,當不需要提供附加資訊時,指定為0)

在明白了指令格式以後,我們記住了查閱有關的文檔:《DDI0406C arm_architecture_reference_manual.pdf》。

淺析ARM協處理器CP15寄存器有關指令:MCR\MRC背景:
淺析ARM協處理器CP15寄存器有關指令:MCR\MRC背景:

 找到了對應的寄存器,STCLR

淺析ARM協處理器CP15寄存器有關指令:MCR\MRC背景:

結合文章開頭中間那幾行語句,發現這段代碼是對于STCLR不同的位進行置位/清零。

 是以,整段代碼做了這樣的事情:

1. 讀取 SCTLR 的值到 R0

2. 修改 對應的位

3. 寫回 SCTLR

 * 注意: 在操作CP15 有關寄存器時,可能要求權限等級在PL1

文章完。

這個時代不會阻止你自己閃耀,但你也覆寫不了任何人的光輝。而學習的本質是一個不斷抄襲、模仿、練習、了解再創新的過程。即使知道無法超越的同主題博文,本人還會繼續堅持學習,不斷探索;總結是本能,分享是愛好。

希望本人的部落格對于大家有幫助,想聽鼓勵,更想聽批評。由于人固有能力的永久局限性,文中可能存在描述不正确,歡迎指正、補充!

若在頁首無特别聲明,本篇文章由 Schips 經過整理後釋出。

部落格位址:https://www.cnblogs.com/schips/

繼續閱讀