新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > arm的协处理器有几个?ARM协处理器详解

arm的协处理器有几个?ARM协处理器详解

作者:时间:2018-04-27来源:网络收藏

  这是运行于主机上的调试器向运行于内核上的应用程序传输消息的事件顺序:

本文引用地址:http://www.eepw.com.cn/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 协处理器

评论


相关推荐

技术专区

关闭