<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 嵌入式ARM CPU協(xié)處理器講解

          嵌入式ARM CPU協(xié)處理器講解

          作者: 時(shí)間:2016-11-10 來(lái)源:網(wǎng)絡(luò) 收藏
          三星公司ARM11 CPU采用ARM核版本ARM1176JZF-S, 基于ARM V6體系架構(gòu),ARM11包括CP14和CP15協(xié)處理器,關(guān)于ARM11的協(xié)處理CP14和CP15的詳細(xì)介紹請(qǐng)參看文檔《ARM1176JZF-S Technical Reference Manual》,ARM官方網(wǎng)http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0301h/index.html可以在線閱讀《ARM1176JZF-S Technical Reference Manual》。這里我們簡(jiǎn)單介紹一下基于ARM926EJ-S/ARM920T 協(xié)處理器 CP14,CP15, ARM11的協(xié)處理器CP14,CP15與此類似。


          ARM926EJ-S/ARM920T 協(xié)處理器 CP14, CP15詳解

          ARM 微處理器可支持多達(dá) 16 個(gè)協(xié)處理器,用于各種協(xié)處理操作,在程序執(zhí)行的過(guò)程中,每個(gè)協(xié)處理器只執(zhí)行針對(duì)自身的協(xié)處理指令,忽略 ARM 處理器和其他協(xié)處理器的指令。ARM 的協(xié)處理器指令主要用于 ARM 處理器初始化 ARM 協(xié)處理器的數(shù)據(jù)處理操作,以及在ARM 處理器的寄存器和協(xié)處理器的寄存器之間傳送數(shù)據(jù),和在 ARM 協(xié)處理器的寄存器和存儲(chǔ)器之間傳送數(shù)據(jù)。 ARM 協(xié)處理器指令包括以下 5 條:

          本文引用地址:http://www.ex-cimer.com/article/201611/317554.htm

          — CDP 協(xié)處理器數(shù)操作指令

          — LDC 協(xié)處理器數(shù)據(jù)加載指令

          — STC 協(xié)處理器數(shù)據(jù)存儲(chǔ)指令

          — MCR ARM 處理器寄存器到協(xié)處理器寄存器的數(shù)據(jù)傳送指令

          — MRC 協(xié)處理器寄存器到ARM 處理器寄存器的數(shù)據(jù)傳送指令

          1、CDP 指令

          CDP 指令的格式為:

          CDP 協(xié)處理器編碼,協(xié)處理器操作碼1,目的寄存器,源寄存器1,源寄存器2,協(xié)處理 器操作碼2。 CDP 指令用于ARM 處理器通知ARM 協(xié)處理器執(zhí)行特定的操作,若協(xié)處理器不能成功完成特定的操作,則產(chǎn)生未定義指令異常。其中協(xié)處理器操作碼1 和協(xié)處理器操作碼2 為協(xié)處理器將要執(zhí)行的操作,目的寄存器和源寄存器均為協(xié)處理器的寄存器,指令不涉及ARM 處理器的寄存器和存儲(chǔ)器。

          指令示例:

          CDP P3 , 2 , C12 , C10 , C3 , 4 ;該指令完成協(xié)處理器 P3 的初始化

          2、LDC 指令

          LDC 指令的格式為:

          LDC 協(xié)處理器編碼,目的寄存器,[源寄存器]

          LDC 指令用于將源寄存器所指向的存儲(chǔ)器中的字?jǐn)?shù)據(jù)傳送到目的寄存器中,若協(xié)處理器不能成功完成傳送操作,則產(chǎn)生未定義指令異常。其中,選項(xiàng)表示指令為長(zhǎng)讀取操作,如用于雙精度數(shù)據(jù)的傳輸。

          指令示例:

          LDC P3 , C4 , [R0] ;將 ARM 處理器的寄存器 R0 所指向的存儲(chǔ)器中的字?jǐn)?shù)據(jù)傳送到協(xié)處理器 P3 的寄存器 C4 中。

          3、STC 指令

          STC 指令的格式為:

          STC 協(xié)處理器編碼,源寄存器,[目的寄存器]

          STC 指令用于將源寄存器中的字?jǐn)?shù)據(jù)傳送到目的寄存器所指向的存儲(chǔ)器中,若協(xié)處理器不能成功完成傳送操作,則產(chǎn)生未定義指令異常。其中,選項(xiàng)表示指令為長(zhǎng)讀取操作,如用于雙精度數(shù)據(jù)的傳輸。

          指令示例:

          STC P3 , C4 , [R0] ;將協(xié)處理器 P3 的寄存器 C4 中的字?jǐn)?shù)據(jù)傳送到 ARM 處理器的寄存器R0 所指向的存儲(chǔ)器中。

          4、MCR 指令

          MCR 指令的格式為:

          MCR 協(xié)處理器編碼,協(xié)處理器操作碼1,源寄存器,目的寄存器1,目的寄存器2,協(xié)處理器操作碼2。

          MCR 指令用于將ARM 處理器寄存器中的數(shù)據(jù)傳送到協(xié)處理器寄存器中,若協(xié)處理器不能成功完成操作,則產(chǎn)生未定義指令異常。其中協(xié)處理器操作碼1 和協(xié)處理器操作碼2 為協(xié)處理器將要執(zhí)行的操作,源寄存器為ARM 處理器的寄存器,目的寄存器1 和目的寄存器2 均為協(xié)處理器的寄存器。

          指令示例:

          MCR P3,3,R0,C4,C5,6;該指令將 ARM 處理器寄存器 R0 中的數(shù)據(jù)傳送到協(xié)處理器 P3 的寄存器 C4 和 C5 中。

          5、MRC 指令

          MRC 指令的格式為:

          MRC 協(xié)處理器編碼,協(xié)處理器操作碼1,目的寄存器,源寄存器1,源寄存器2,協(xié)處理器操作碼2。

          MRC 指令用于將協(xié)處理器寄存器中的數(shù)據(jù)傳送到ARM 處理器寄存器中,若協(xié)處理器不能成功完成操作,則產(chǎn)生未定義指令異常。其中協(xié)處理器操作碼1 和協(xié)處理器操作碼2 為協(xié)處理器將要執(zhí)行的操作,目的寄存器為ARM 處理器的寄存器,源寄存器1 和源寄存器2 均為協(xié)處理器的寄存器。

          指令示例:

          MRC P3,3,R0,C4,C5,6;該指令將協(xié)處理器 P3 的寄存器中的數(shù)據(jù)傳送到 ARM 處理器寄存器中.

          The ARM920T 有兩個(gè)具體協(xié)處理器

          CP14調(diào)試通信通道協(xié)處理器

          調(diào)試通信通道協(xié)處理器DCC(the Debug Communications Channel)提供了兩個(gè)32bits寄存器用于傳送數(shù)據(jù),還提供了6bits通信數(shù)據(jù)控制寄存器控制寄存器中的兩個(gè)位提供目標(biāo)和主機(jī)調(diào)試器之間的同步握手。

          通信數(shù)據(jù)控制寄存器

          以下指令在 Rd 中返回控制寄存器的值:

          MRC p14, 0, Rd, c0, c0

          此控制寄存器中的兩個(gè)位提供目標(biāo)和主機(jī)調(diào)試器之間的同步握手:

          位 1(W 位) 從目標(biāo)的角度表示通信數(shù)據(jù)寫入寄存器是否空閑:

          W = 0 目標(biāo)應(yīng)用程序可以寫入新數(shù)據(jù)。

          W = 1 主機(jī)調(diào)試器可以從寫入寄存器中掃描出新數(shù)據(jù)。

          位 0(R 位) 從目標(biāo)的角度表示通信數(shù)據(jù)讀取寄存器中是否有新數(shù)據(jù):

          R = 1 有新數(shù)據(jù),目標(biāo)應(yīng)用程序可以讀取。

          R = 0 主機(jī)調(diào)試器可以將新數(shù)據(jù)掃描到讀取寄存器中。

          注意

          調(diào)試器不能利用協(xié)處理器 14 直接訪問(wèn)調(diào)試通信通道,因?yàn)檫@對(duì)調(diào)試器無(wú)意義。 但調(diào)試器可使用掃描鏈讀寫 DCC 寄存器。 DCC 數(shù)據(jù)和控制寄存器可映射到 EmbeddedICE 邏輯單元中的地址。 若要查看 EmbeddedICE 邏輯寄存器,請(qǐng)參閱您的調(diào)試器和調(diào)試目標(biāo)的相關(guān)文檔。

          通信數(shù)據(jù)讀取寄存器

          用于接收來(lái)自調(diào)試器的數(shù)據(jù)的 32 位寬寄存器。 以下指令在 Rd 中返

          回讀取寄存器的值:

          MRC p14, 0, Rd, c1, c0

          通信數(shù)據(jù)寫入寄存器

          用于向調(diào)試器發(fā)送數(shù)據(jù)的 32 位寬寄存器。 以下指令將 Rn 中的值寫

          到寫入寄存器中:

          MCR p14, 0, Rn, c1, c0

          注意

          有關(guān)訪問(wèn) ARM10 和 ARM11 內(nèi)核 DCC 寄存器的信息,請(qǐng)參閱相應(yīng)的技術(shù)參考手冊(cè)。 ARM9 之后的各處理器中,所用指令、狀態(tài)位位置以及對(duì)狀態(tài)位的解釋都有所不同。

          目標(biāo)到調(diào)試器的通信

          這是運(yùn)行于 ARM 內(nèi)核上的應(yīng)用程序與運(yùn)行于主機(jī)上的調(diào)試器之間的通信事件

          順序:

          1. 目標(biāo)應(yīng)用程序檢查 DCC 寫入寄存器是否空閑可用。 為此,目標(biāo)應(yīng)用程序使

          用 MRC 指令讀取調(diào)試通信通道控制寄存器,以檢查 W 位是否已清除。

          2. 如果 W 位已清除,則通信數(shù)據(jù)寫入寄存器已清空,應(yīng)用程序?qū)f(xié)處理器 14

          使用 MCR 指令將字寫入通信數(shù)據(jù)寫入寄存器。 寫入寄存器操作會(huì)自動(dòng)設(shè)置

          W 位。如果 W 位已設(shè)置,則表明調(diào)試器尚未清空通信數(shù)據(jù)寫入寄存器。此

          時(shí),如果應(yīng)用程序需要發(fā)送另一個(gè)字,它必須輪詢 W 位,直到它已清除。

          3. 調(diào)試器通過(guò)掃描鏈 2 輪詢通信數(shù)據(jù)控制寄存器。 如果調(diào)試器發(fā)現(xiàn) W 位已設(shè)

          置,則它可以讀 DCC 數(shù)據(jù)寄存器,以讀取應(yīng)用程序發(fā)送的信息。 讀取數(shù)據(jù)

          的進(jìn)程會(huì)自動(dòng)清除通信數(shù)據(jù)控制寄存器中的 W 位。

          以下代碼顯示了這一過(guò)程

          AREA OutChannel, CODE, READONLY

          ENTRY

          MOV r1,#3 ; Number of words to send

          ADR r2, outdata ; Address of data to send

          pollout

          MRC p14,0,r0,c0,c0 ; Read control register

          TST r0, #2

          BNE pollout ; if W set, register still full

          write

          LDR r3,[r2],#4 ; Read word from outdata

          ; into r3 and update the pointer

          MCR p14,0,r3,c1,c0 ; Write word from r3

          SUBS r1,r1,#1 ; Update counter

          BNE pollout ; Loop if more words to be written

          MOV r0, #0x18 ; Angel_SWIreason_ReportException

          LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit

          SVC 0x123456 ; ARM semihosting (formerly SWI)

          outdata

          DCB "Hello there!"

          END

          調(diào)試器到目標(biāo)的通信

          這是運(yùn)行于主機(jī)上的調(diào)試器向運(yùn)行于內(nèi)核上的應(yīng)用程序傳輸消息的事件順序:

          1. 調(diào)試器輪詢通信數(shù)據(jù)控制寄存器的 R 位。 如果 R 位已清除,則通信數(shù)據(jù)讀

          取寄存器已清空,可將數(shù)據(jù)寫入此寄存器,以供目標(biāo)應(yīng)用程序讀取。

          2. 調(diào)試器通過(guò)掃描鏈 2 將數(shù)據(jù)掃描到通信數(shù)據(jù)讀取寄存器中。 此操作會(huì)自動(dòng)

          設(shè)置通信數(shù)據(jù)控制寄存器中的 R 位。

          3. 目標(biāo)應(yīng)用程序輪詢通信數(shù)據(jù)控制寄存器中的 R 位。 如果該位已經(jīng)設(shè)置,則

          通信數(shù)據(jù)讀取寄存器中已經(jīng)有數(shù)據(jù),應(yīng)用程序可使用 MRC 指令從協(xié)處理器

          14 讀取該數(shù)據(jù)。 同時(shí),讀取指令還會(huì)清除 R 位。

          以下顯示的目標(biāo)應(yīng)用程序代碼演示了這一過(guò)程

          AREA InChannel, CODE, READONLY

          ENTRY

          MOV r1,#3 ; Number of words to read

          LDR r2, =indata ; Address to store data read

          pollin

          MRC p14,0,r0,c0,c0 ; Read control register

          TST r0, #1

          BEQ pollin ; If R bit clear then loop

          read

          MRC p14,0,r3,c1,c0 ; read word into r3

          STR r3,[r2],#4 ; Store to memory and

          ; update pointer

          SUBS r1,r1,#1 ; Update counter

          BNE pollin ; Loop if more words to read

          MOV r0, #0x18 ; Angel_SWIreason_ReportException

          LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit

          SVC 0x123456 ; ARM semihosting (formerly SWI)

          AREA Storage, DATA, READWRITE

          indata

          DCB "Duffmessage#"

          END

          CP15系統(tǒng)控制協(xié)處理器

          CP15 —系統(tǒng)控制協(xié)處理器 (the system control coprocessor)他通過(guò)協(xié)處理器指令MCR和MRC提供具體的寄存器來(lái)配置和控制caches、MMU、保護(hù)系統(tǒng)、配置時(shí)鐘模式(在bootloader時(shí)鐘初始化用到)

          CP15的寄存器只能被MRC和MCR(Move to Coprocessor from ARM Register )指令訪問(wèn)

          MCR p15,,,,,

          MRC p15,,,,,

          其中L位用來(lái)區(qū)分MCR(L=1)和MRC(L=0)操作. CP15包括15個(gè)具體的寄存器如下:

          -R0:ID號(hào)寄存器

          -R0:緩存類型寄存器

          -R1:控制寄存器

          -R2:轉(zhuǎn)換表基址寄存器(Translation Table Base --TTB)

          -R3:域訪問(wèn)控制寄存器(Domain access control )

          -R4:保留

          -R5:異常狀態(tài)寄存器(fault status -FSR)

          -R6:異常地址寄存器(fault address -FAR)

          -R7:緩存操作寄存器

          -R8:TLB操作寄存器

          -R9:緩存鎖定寄存器

          -R10:TLB 鎖定寄存器

          -R11-12&14:保留

          -R13:處理器ID

          -R15:測(cè)試配置寄存器 2-24

          要注意有2個(gè)R0,根據(jù)MCR操作數(shù)的不同傳送不同的值,這也一個(gè)只讀寄存器

          -R0:ID號(hào)寄存器 這是一個(gè)只讀寄存器,返回一個(gè)32位的設(shè)備ID號(hào),具體功能參考ARM各個(gè)系列型號(hào)的的CP15 Register 0說(shuō)明.

          MRC p15, 0, , c0, c0, {0, 3-7} ;returns ID

          以下為ID Code詳細(xì)描敘(ARM926EJ-S); ARM920T Part Number為0x920,Architecture (ARMv4T) 為0x2具體可參照ARM各型號(hào).

          -R0:緩存類型寄存器(CACHE TYPE REGISTER),包含了caches的信息。讀這個(gè)寄存器的方式是通過(guò)設(shè)置協(xié)處理操作碼為1.

          MRC p15, 0, , c0, c0, 1; returns cache details

          以下為CP15的一些應(yīng)用示例

          U32 ARM_CP15_DeviceIDRead(void)

          {

          U32 id;

          __asm { MRC P15, 0, id, c0, c0; }

          return id;

          }

          void ARM_CP15_SetPageTableBase(P_U32 TableAddress)

          {

          __asm { MCR P15, 0, TableAddress, c2, c0, 0; }

          }

          void ARM_CP15_SetDomainAccessControl(U32 flags)

          {

          __asm { MCR P15, 0, flags, c3, c0, 0; }

          }

          void ARM_CP15_ICacheFlush()

          {

          unsigned long dummy;

          __asm { MCR p15, 0, dummy, c7, c5, 0; }

          }

          void ARM_CP15_DCacheFlush()

          {

          unsigned long dummy;

          __asm { MCR p15, 0, dummy, c7, c6, 0; }

          }

          void ARM_CP15_CacheFlush()

          {

          unsigned long dummy;

          __asm { MCR p15, 0, dummy, c7, c7, 0; }

          }

          void ARM_CP15_TLBFlush(void)

          {

          unsigned long dummy;

          __asm { MCR P15, 0, dummy, c8, c7, 0; }

          }

          void ARM_CP15_ControlRegisterWrite(U32 flags)

          {

          __asm { MCR P15, 0, flags, c1, c0; }

          }

          void ARM_CP15_ControlRegisterOR(U32 flag)

          {

          __asm {

          mrc p15,0,r0,c1,c0,0

          mov r2,flag

          orr r0,r2,r0

          mcr p15,0,r0,c1,c0,0

          }

          }

          void ARM_CP15_ControlRegisterAND(U32 flag)

          {

          __asm {

          mrc p15,0,r0,c1,c0,0

          mov r2,flag

          and r0,r2,r0

          mcr p15,0,r0,c1,c0,0

          }

          }

          void ARM_MMU_Init(P_U32 TableAddress)

          {

          ARM_CP15_TLBFlush();

          ARM_CP15_CacheFlush();

          ARM_CP15_SetDomainAccessControl(0xFFFFFFFF);

          ARM_CP15_SetPageTableBase(TableAddress);

          }

          void Enable_MMU (void)

          {

          __asm {

          mrc p15,0,r0,c1,c0,0

          mov r2, #0x00000001

          orr r0,r2,r0

          mcr p15,0,r0,c1,c0,0

          }

          printf("MMU enabledn");

          }

          void Disable_MMU (void)

          {

          __asm {

          mrc p15,0,r0,c1,c0,0

          mov r2, #0xFFFFFFFE

          and r0,r2,r0

          mcr p15,0,r0,c1,c0,0

          }

          printf("MMU disabledn");

          }



          關(guān)鍵詞: ARMCPU協(xié)處理

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();