新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > arm的協處理器有幾個?ARM協處理器詳解

        arm的協處理器有幾個?ARM協處理器詳解

        作者: 時間:2018-04-27 來源:網絡 收藏

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

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

          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 storedata read

          pollin

          MRC p14,0,r0,c0,c0 ; Read controlregister

          TST r0, #1

          BEQ pollin ; If R bit clear thenloop

          read

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

          STR r3,[r2],#4 ; Store to memoryand

          ; update pointer

          SUBS r1,r1,#1 ; Update counter

          BNE pollin ; Loop if more words toread

          MOV r0, #0x18 ;Angel_SWIreason_ReportException

          LDR r1, =0x20026 ;ADP_Stopped_ApplicationExit

          SVC 0x123456 ;  semihosting(formerly SWI)

          AREA Storage, DATA,READWRITE

          indata

          DCB “Duffmessage#”

          END

            

        arm的協處理器有幾個?ARM協處理器詳解

          CP15系統控制

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

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

          MCR{cond} p15,,,,,

          MRC{cond} 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號,具體功能參考各個系列型號的的CP15 Register 0說明。

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

          以下為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”);

          }


        上一頁 1 2 下一頁

        關鍵詞: ARM 協處理器

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 宁武县| 宜州市| 重庆市| 沁水县| 思茅市| 商丘市| 尼玛县| 塘沽区| 武山县| 阳原县| 静乐县| 庆安县| 呼伦贝尔市| 安仁县| 上栗县| 鄂尔多斯市| 孟村| 临桂县| 嘉善县| 囊谦县| 柘城县| 三都| 泸定县| 赤峰市| 宝鸡市| 临汾市| 南漳县| 武宣县| 彩票| 通河县| 湖州市| 内黄县| 大竹县| 日土县| 台湾省| 潍坊市| 金坛市| 三原县| 临城县| 湟中县| 临潭县|