新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 嵌入式ARM CPU協處理器講解

        嵌入式ARM CPU協處理器講解

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


        ARM926EJ-S/ARM920T 協處理器 CP14, CP15詳解

        ARM 微處理器可支持多達 16 個協處理器,用于各種協處理操作,在程序執行的過程中,每個協處理器只執行針對自身的協處理指令,忽略 ARM 處理器和其他協處理器的指令。ARM 的協處理器指令主要用于 ARM 處理器初始化 ARM 協處理器的數據處理操作,以及在ARM 處理器的寄存器和協處理器的寄存器之間傳送數據,和在 ARM 協處理器的寄存器和存儲器之間傳送數據。 ARM 協處理器指令包括以下 5 條:

        本文引用地址:http://www.104case.com/article/201611/317554.htm

        — CDP 協處理器數操作指令

        — LDC 協處理器數據加載指令

        — STC 協處理器數據存儲指令

        — MCR ARM 處理器寄存器到協處理器寄存器的數據傳送指令

        — MRC 協處理器寄存器到ARM 處理器寄存器的數據傳送指令

        1、CDP 指令

        CDP 指令的格式為:

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

        指令示例:

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

        2、LDC 指令

        LDC 指令的格式為:

        LDC 協處理器編碼,目的寄存器,[源寄存器]

        LDC 指令用于將源寄存器所指向的存儲器中的字數據傳送到目的寄存器中,若協處理器不能成功完成傳送操作,則產生未定義指令異常。其中,選項表示指令為長讀取操作,如用于雙精度數據的傳輸。

        指令示例:

        LDC P3 , C4 , [R0] ;將 ARM 處理器的寄存器 R0 所指向的存儲器中的字數據傳送到協處理器 P3 的寄存器 C4 中。

        3、STC 指令

        STC 指令的格式為:

        STC 協處理器編碼,源寄存器,[目的寄存器]

        STC 指令用于將源寄存器中的字數據傳送到目的寄存器所指向的存儲器中,若協處理器不能成功完成傳送操作,則產生未定義指令異常。其中,選項表示指令為長讀取操作,如用于雙精度數據的傳輸。

        指令示例:

        STC P3 , C4 , [R0] ;將協處理器 P3 的寄存器 C4 中的字數據傳送到 ARM 處理器的寄存器R0 所指向的存儲器中。

        4、MCR 指令

        MCR 指令的格式為:

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

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

        指令示例:

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

        5、MRC 指令

        MRC 指令的格式為:

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

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

        指令示例:

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

        The ARM920T 有兩個具體協處理器

        CP14調試通信通道協處理器

        調試通信通道協處理器DCC(the Debug Communications Channel)提供了兩個32bits寄存器用于傳送數據,還提供了6bits通信數據控制寄存器控制寄存器中的兩個位提供目標和主機調試器之間的同步握手。

        通信數據控制寄存器

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

        MRC p14, 0, Rd, c0, c0

        此控制寄存器中的兩個位提供目標和主機調試器之間的同步握手:

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

        W = 0 目標應用程序可以寫入新數據。

        W = 1 主機調試器可以從寫入寄存器中掃描出新數據。

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

        R = 1 有新數據,目標應用程序可以讀取。

        R = 0 主機調試器可以將新數據掃描到讀取寄存器中。

        注意

        調試器不能利用協處理器 14 直接訪問調試通信通道,因為這對調試器無意義。 但調試器可使用掃描鏈讀寫 DCC 寄存器。 DCC 數據和控制寄存器可映射到 EmbeddedICE 邏輯單元中的地址。 若要查看 EmbeddedICE 邏輯寄存器,請參閱您的調試器和調試目標的相關文檔。

        通信數據讀取寄存器

        用于接收來自調試器的數據的 32 位寬寄存器。 以下指令在 Rd 中返

        回讀取寄存器的值:

        MRC p14, 0, Rd, c1, c0

        通信數據寫入寄存器

        用于向調試器發送數據的 32 位寬寄存器。 以下指令將 Rn 中的值寫

        到寫入寄存器中:

        MCR p14, 0, Rn, c1, c0

        注意

        有關訪問 ARM10 和 ARM11 內核 DCC 寄存器的信息,請參閱相應的技術參考手冊。 ARM9 之后的各處理器中,所用指令、狀態位位置以及對狀態位的解釋都有所不同。

        目標到調試器的通信

        這是運行于 ARM 內核上的應用程序與運行于主機上的調試器之間的通信事件

        順序:

        1. 目標應用程序檢查 DCC 寫入寄存器是否空閑可用。 為此,目標應用程序使

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

        2. 如果 W 位已清除,則通信數據寫入寄存器已清空,應用程序對協處理器 14

        使用 MCR 指令將字寫入通信數據寫入寄存器。 寫入寄存器操作會自動設置

        W 位。如果 W 位已設置,則表明調試器尚未清空通信數據寫入寄存器。此

        時,如果應用程序需要發送另一個字,它必須輪詢 W 位,直到它已清除。

        3. 調試器通過掃描鏈 2 輪詢通信數據控制寄存器。 如果調試器發現 W 位已設

        置,則它可以讀 DCC 數據寄存器,以讀取應用程序發送的信息。 讀取數據

        的進程會自動清除通信數據控制寄存器中的 W 位。

        以下代碼顯示了這一過程

        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

        調試器到目標的通信

        這是運行于主機上的調試器向運行于內核上的應用程序傳輸消息的事件順序:

        1. 調試器輪詢通信數據控制寄存器的 R 位。 如果 R 位已清除,則通信數據讀

        取寄存器已清空,可將數據寫入此寄存器,以供目標應用程序讀取。

        2. 調試器通過掃描鏈 2 將數據掃描到通信數據讀取寄存器中。 此操作會自動

        設置通信數據控制寄存器中的 R 位。

        3. 目標應用程序輪詢通信數據控制寄存器中的 R 位。 如果該位已經設置,則

        通信數據讀取寄存器中已經有數據,應用程序可使用 MRC 指令從協處理器

        14 讀取該數據。 同時,讀取指令還會清除 R 位。

        以下顯示的目標應用程序代碼演示了這一過程

        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系統控制協處理器

        CP15 —系統控制協處理器 (the system control coprocessor)他通過協處理器指令MCR和MRC提供具體的寄存器來配置和控制caches、MMU、保護系統、配置時鐘模式(在bootloader時鐘初始化用到)

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

        MCR p15,,,,,

        MRC p15,,,,,

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

        -R0:ID號寄存器

        -R0:緩存類型寄存器

        -R1:控制寄存器

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

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

        -R4:保留

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

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

        -R7:緩存操作寄存器

        -R8:TLB操作寄存器

        -R9:緩存鎖定寄存器

        -R10:TLB 鎖定寄存器

        -R11-12&14:保留

        -R13:處理器ID

        -R15:測試配置寄存器 2-24

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

        -R0:ID號寄存器 這是一個只讀寄存器,返回一個32位的設備ID號,具體功能參考ARM各個系列型號的的CP15 Register 0說明.

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

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

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

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

        以下為CP15的一些應用示例

        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");

        }



        關鍵詞: ARMCPU協處理

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 威信县| 沙河市| 汾阳市| 密山市| 祥云县| 玉屏| 方山县| 渭源县| 泾川县| 自贡市| 莱州市| 周宁县| 新河县| 清涧县| 泰和县| 如皋市| 新平| 绥阳县| 扎赉特旗| 南岸区| 犍为县| 安国市| 云梦县| 台湾省| 周口市| 灵石县| 湘乡市| 德格县| 五峰| 前郭尔| 博客| 辽阳市| 莱芜市| 光泽县| 南乐县| 平邑县| 太谷县| 德令哈市| 宜黄县| 包头市| 榕江县|