常见的五大ARM存储器之一:协处理器CP15

arm存储系统有非常灵活的体系结构,可以适应不同的嵌入式应用系统的需要。arm存储器系统可以使用简单的平板式地址映射机制(就像一些简单的单片机一样,地址空间的分配方式是固定的,系统中各部分都使用物理地址),也可以使用其他技术提供功能更为强大的存储系统。比如:
· 系统可能提供多种类型的存储器件,如flash、rom、sram等;
· caches技术;
· 写缓存技术(write buffers);
· 虚拟内存和i/o地址映射技术。
大多数的系统通过下面的方法之一实现对复杂存储系统的管理。
· 使能cache,缩小处理器和存储系统速度差别,从而提高系统的整体性能。
· 使用内存映射技术实现虚拟空间到物理空间的映射。这种映射机制对嵌入式系统非常重要。通常嵌入式系统程序存放在rom/flash中,这样系统断电后程序能够得到保存。但是通常rom/flash与sdram相比,速度慢很多,而且基于arm的嵌入式系统中通常把异常中断向量表放在ram中。利用内存映射机制可以满足这种需要。在系统加电时,将rom/flash映射为地址0,这样可以进行一些初始化处理;当这些初始化处理完成后将sdram映射为地址0,并把系统程序加载到sdram中运行,这样很好地满足嵌入式系统的需要。
· 引入存储保护机制,增强系统的安全性。
· 引入一些机制保证将i/o操作映射成内存操作后,各种i/o操作能够得到正确的结果。在简单存储系统中,不存在这样问题。而当系统引入了cache和write buffer后,就需要一些特别的措施。
在arm系统中,要实现对存储系统的管理通常是使用协处理器cp15,它通常也被称为系统控制协处理器(system control coprocessor)。
arm的存储器系统是由多级构成的,每级都有特定的容量和速度。
图1显示了存储器的层次结构。
① 寄存器。处理器寄存器组可看作是存储器层次的顶层。这些寄存器被集成在处理器内核中,在系统中提供最快的存储器访问。典型的arm处理器有多个32位寄存器,其访问时间为ns量级。
图1 存储器的层次结构
② 紧耦合存储器tcm。为弥补cache访问的不确定性增加的存储器。tcm是一种快速sdram,它紧挨内核,并且保证取指和数据操作的时钟周期数,这一点对一些要求确定行为的实时算法是很重要的。tcm位于存储器地址映射中,可作为快速存储器来访问。
③ 片上cache存储器的容量在8kb~32kb之间,访问时间大约为10ns。
④ 高性能的arm结构中,可能存在第二级片外cache,容量为几百kb,访问时间为几十ns。
⑤ dram。主存储器可能是几mb到几十mb的动态存储器,访问时间大约为100ns。
⑥ 后援存储器,通常是硬盘,可能从几百mb到几个gb,访问时间为几十ms。
注意tcm和sram在技术上相同,但在结构排列上不同;tcm在片上,而sram在板上。
协处理器cp15
arm处理器支持16个协处理器。在程序执行过程中,每个协处理器忽略属于arm处理器和其他协处理器的指令。当一个协处理器硬件不能执行属于它的协处理器指令时,将产生一个未定义指令异常中断,在该异常中断处理程序中,可以通过软件模拟该硬件操作。比如,如果系统不包含向量浮点运算器,则可以选择浮点运算软件模拟包来支持向量浮点运算。
cp15,即通常所说的系统控制协处理器(system control coprocesssor)。它负责完成大部分的存储系统管理。除了cp15外,在具体的各种存储管理机制中可能还会用到其他的一些技术,如在mmu中除cp15外,还使用了页表技术等。
在一些没有标准存储管理的系统中,cp15是不存在的。在这种情况下,针对协处理器cp15的操作指令将被视为未定义指令,指令的执行结果不可预知。
cp15包含16个32位寄存器,其编号为0~15。实际上对于某些编号的寄存器可能对应多个物理寄存器,在指令中指定特定的标志位来区分这些物理寄存器。这种机制有些类似于arm中的寄存器,当处于不同的处理器模式时,某些相同编号的寄存器对应于不同的物理寄存器。
cp15中的寄存器可能是只读的,也可能是只写的,还有一些是可读可写的。在对协处理器寄存器进行操作时,需要注意以下几个问题。
· 寄存器的访问类型(只读/只写/可读可写)。
· 不同的访问引发的不同功能。
· 相同编号的寄存器是否对应不同的物理寄存器。
· 寄存器的具体作用。
cp15寄存器访问指令
通常对协处理器cp15的访问使用以下两种指令。
mcr:将arm寄存器的值写入cp15寄存器中;
mrc:将cp15寄存器的值写入arm寄存器中。
注意通过协处理器访问指令cdp、ldc和stc指令对协处理器cp15进行访问将产生不可预知的结果。
其中,cdp为协处理器数据操作指令,这个指令初始化一些与协处理器相关的操作;
ldc为一个或多个字的协处理器数据读取指令,此指令从存储器读取数据到指定的协处理器中;
stc为一个或多个32位字的协处理器数据写入指令,此指令初始化一个协处理器的写操作,从给定的协处理器把数据传送到存储器中。
指令mcr和mrc指令访问cp15寄存器使用通用语法。
语法格式为:
mcr{《cond》} p15,《opcode1=0》,《rd》,《crn》,《crm》{,《opcode2》}
mrc{《cond》} p15,《opcode1=0》,《rd》,《crn》,《crm》{,《opcode2》}
其中:
《cond》为指令的执行条件。当《cond》条件域为空时,指令无条件执行;
《opcode1》在标准的mrc指令中,为协处理器的《opcode1》,即操作数1。对于cp15来说,此操作数恒为0,即0b000。当针对cp15的mrc指令中《opcode1》不为0时,指令的操作结果不可预知;
《rd》为arm寄存器,在arm和协处理器交换数据时使用。在mrc指令中作为目的寄存器,在mcr中作为源寄存器。
注意r15不能作为arm寄存器出现在mrc或mcr指令中,如果r15作为《rd》出现在这里,那么指令的执行结果不可预知。
《crn》是cp15协处理器指令中用到的主要寄存器。在mrc指令中为源寄存器,在mcr中为目的寄存器。cp15协处理器的寄存器c0、c1、…、c15均可出现在这里。
《crm》是附加的协处理器寄存器,用于区分同一个编号的不同物理寄存器和访问类型。当指令中不需要提供附加信息时,将《crm》指定为c0,否则指令的操作结果不可预知。
《opcode2》提供附加信息,用于区分同一个编号的不同物理寄存器,当指令中没有指定附加信息时,省略《opcode2》或者将其指定为0,否则指令的操作结果不可预知。
mcr和mrc指令只能操作在特权模式下,如果处理器运行在用户模式,指令的执行结果不可预知。
注意在用户模式下,如果要访问系统控制协处理器,通常的做法是由操作系统提供swi软中断调用来完成系统模式的切换。由于不同型号的arm处理器对此管理差别很大,所以建议用户在应用时将swi作为一个独立的模块来管理并向上提供通用接口,以屏蔽不同型号处理器之间的差异。
例1给出了一个典型的利用swi进行模式切换的例子。
【例1】
典型的在swi中进行模式切换的例子。利用此例,调用swi 0来完成系统模式切换。
eht_swi
ldr sp,=eht_exception_stack ;更新swi堆栈指针
add sp,sp,#exception_size ;得到栈顶指针
stmdb sp!,{r0-r2,lr} ;保存程序中用到的寄存器
mrs r0,spsr ;得到spsr
stmdb sp!,{r0} ;保持spsr
ldr r0,[lr,#-4] ;计算swi指令地址
bic r0,r0,#0xff000000 ;提取中断向量号
cmp r0,#max_swi ;检测中断向量范围
ldrls pc,[pc,r0,lsl #2] ;如果在范围内,跳转到软中断向量表
b eht_swi_exit ;为定义的swi指令出口
eht_jump_table
dcd eht_su_switch
dcd eht_disable_interrupts
;*********************************************************************************
;用户可在此添加更多的自定义软中断,在此swi0作为系统保留的软中断,调用例程eht_su_switch,来进行模式切换
;*********************************************************************************
eht_su_switch
mmu_disable ;转换前禁用mmu
ldmia sp!,{r0} ;从堆栈中取出spsr
bic r0,r0,#mode_mask ;清除模式位
orr r0,r0,#sys_mode ;设置程序状态字的supper模式位
stmdb sp!,{r0} ;从新将spsr放入堆栈
b eht_swi_exit
eht_disable_interrupts
ldmia sp!,{r0} ;从堆栈中读出spsr
orr r0,r0,#lockout ;禁止中断
stmdb sp!,{r0} ;存储spsr到中断
; b eht_swi_exit
eht_swi_exit
ldmia sp!,{r0} ;从堆栈中读出spsr
msr spsr_cf,r0 ;将spsr放入spsr_cf
ldmia sp!,{r0-r2,pc}^ ;寄存器出栈并返回
end
1.2 cp15中的寄存器
表1给出了cp15主要寄存器的功能和作用。
表1 cp15寄存器
寄存器编号基 本 作 用特 殊 用 途
0id编号(只读)id和cache类型
1控制位各种控制位
2存储器保护和控制mmu:地址转换表基地址
pu:cache属性设置
3内存保护和控制mmu:域访问控制
pu:写缓存控制
4内存保护和控制保留
5内存保护和控制mmu:错误状态
pu:访问权限控制
6内存保护和控制mmu:错误状态
pu:保护区域控制
7cache和写缓存cache和写缓存控制
8内存保护和控制mmu:tlb控制
pu:保留
9cache和写缓存cache锁定
续表
寄存器编号基 本 作 用特 殊 用 途
10内存保护和控制mmu:tlb锁定
pu:保留
11保留保留
12保留保留
13进程id进程id
14保留保留
15芯片生产厂商定义芯片生产厂商定义
1.3 寄存器c0
寄存器c0包含的是arm本身或芯片生产厂商的一些标识信息。当使用mrc指令读c0寄存器时,根据第二个操作码opcode2的不同,读出的标识符也是不同的。操作码与标识符的对应关系如表2所示。寄存器c0是只读寄存器,当用mcr指令对其进行写操作时,指令的执行结果不可预知。
表2 操作码和标识符的对应关系
操作码opcode2对应的标识符寄存器
0b000主标识符寄存器
0b001cache类型寄存器
其他保留
在操作码opcode2的取值中,主标识符(opcode2=0)是强制定义的,其他标识符由芯片的生产厂商定义。如果操作码opcode2指定的值未定义,指令将返回主标识符。其他标识符的值应与主标识符的值不同,可以由软件编程来实现,同时读取主标识符和其他标识符,并将两者的值进行比较。如果两个标识符值相同,说明未定义该标识符;如果两个标识符值不同,说明定义了该标识符,并且得到该标识符的值。
(1)主标识符寄存器
当协处理器指令对cp15进行操作,并且操作码opcode=2时,处理器的主标识符将被读出。从主标识符中,可以确定arm体系结构的版本型号。同时也可以参考由芯片生产厂商定义的其他标识符,来获得更详细的信息。
在主标识信息中,bit[15:12]区分了不同的处理器版本:
· 如果bit[15:12]为0x0,说明处理器是arm7之前的处理器;
· 如果bit[15:12]为0x7,说明处理器为arm7处理器;
· 如果bit[15:12]为其他值,说明处理器为arm7之后的处理器。
对于arm7之后的处理器,其标识符的编码格式如图2所示。
其中各部分的编码含义说明如下。
bit[3:0]:包含生产厂商定义的处理器版本型号。
bit[15:4]:生产厂商定义的产品主编号,可能的取值为0x0~0x7。
bit[19:16]:arm体系的版本号,可能的取值如表3(其他值由arm公司保留将来使用)所示。
图2 arm7之后处理器标识符编码
表3 bit[19:16]与arm版本号
可能的取值版 本 号
0x1arm体系版本4
0x2arm体系版本4t
0x3arm体系版本5
0x4arm体系版本5t
0x5arm体系版本5te
bit[23:20]:生产厂商定义的产品子编号。当产品主编号相同时,使用子编号区分不同的产品子类,如产品中不同的cache的大小。
bit[31:24]:生产厂商的编号现已定义的如表4所示。其他的值arm公司保留将来使用。
表4 bit[31:24]值与arm生产厂商
可能的取值arm芯片生产厂商
0x41(a)arm公司
0x44(d)digital equipment
0x69(i)intel公司
对于arm7系统的处理器,其主标识符的编码如图3所示。
图3 arm7处理器标识符编码
其中各部分的含义说明如下。
bit[3:0]:包含生产厂商定义的处理器版本型号。
bit[15:4]:生产厂商定义的产品主编号,其最高4位的值为0x7。
bit[22:16]:生产商定义的产品子编号。当产品的主编号相同时,使用子编号区分不同的产品子类,如产品中不同的产品子类、不同产品中高速缓存的大小。
bit[23]:arm7处理器支持下面两种arm体系的版本号。0x0代表arm体系版本3;0x1代表arm体系版本4t。
bit[31:24]:生产厂商的编号已定义的如表5所示,其他的值arm公司保留将来使用。
表5 bit[31:24]值与arm生产厂商
可能的取值arm芯片生产厂商
0x41(a)arm公司
0x44(d)digital equipment
0x69(i)intel公司
对于arm7系统的处理器,其主标识符的编码如图4所示。
图4 arm7之前处理器标识符编码
其中各部分的含义说明如下。
bit[3:0]:包含生产厂商定义的处理器版本型号。
bit[31:4]:处理器标识符及其含义如表6所示。
表6 arm之后处理器标识符与含义
处理器标识符含 义
0x4156030arm3(体系版本2)
0x4156060arm600(arm体系版本3)
0x4156061arm610(arm体系版本3)
0x4156062arm620(arm体系版本3)
(2)cache类型标识符寄存器
如前所述,对于指令mrc来说,当协处理器寄存器为r0,而第二操作数opcode2为0b001时,指令读取值为cache类型,即可以用下面的指令将处理器的cache类型标识符寄存器的内容读取到寄存器r0中。
mrc p15,0,r0,c0,c0,1
cache类型标识符定义了关于cache的信息,具体内容如下所述。
· 系统中的数据cache和指令cache是分开的还是统一的。
· cache的容量、块大小以及相联特性。
· cache类型是直(write-through)写还是回写(write-back)。
· 对于回写(write-back)类型的cache如何有效清除cache内容。
· cache是否支持内容锁定。
cache类型标识符寄存器各控制字段的含义编码格式如图5所示。
图5 cache属性寄存器标识符编码格式
其中各控制字段的含义说明如下。
属性字段(ctype):指定没有在s位、数据cache相关属性位、指令cache相关属性类中指定的属性,其具体编码参见表7。
表7 cache类型标识符寄存器属性字段含义
编 码cache类型cache内容清除方法cache内容锁定方法
0b0000直写不需要内容清除不支持
0b0001回写数据块读取不支持
0b0010回写由寄存器定义不支持
0b0110回写由寄存器定义支持格式a,见后
0b0111回写由寄存器定义支持格式b,见后
s位:定义系统中的数据cache和指令cache是分开的还是统一的。如果s=0,说明指令cache和数据cache是统一的,如果s=1,则说明数据cache和指令cache是分离的。
数据cache相关属性:定义了数据cache容量、行大小和相联(associativity)特性(如果s≠0)。
指令cache相关属性:定义了指令cache容量、行大小和相联(associativity)特性(如果s≠0)。
数据cache相关属性和指令cache相关属性分别占用控制字段[23:12]和[11:0],它们的结构相同,图6以指令cache为例,显示了编码结构。
图6 指令cache编码结构
其中,各部分的含义说明如下。
bit[11:9]:保留用于将来使用。
bit[8:6]:定义cache的容量,其编码格式及含义如表8所示。
表8 类型标识符寄存器控制字段bit[8:6]含义
编 码m=0时的含义m=1时的含义
0b0000.5kb0.75kb
0b0011kb1.5kb
0b0102kb3kb
0b0114kb6kb
续表
编 码m=0时的含义m=1时的含义
0b1008kb12kb
0b10116kb24kb
0b11032kb48kb
0b11164kb96kb
bit[1:0]:定义cache的块大小,其编码格式及含义如表9所示。
表9 类型标识符寄存器控制字段bit[1:0]含义
编 码cache块大小
0b002个字(8字节)
0b014个字(16字节)
0b108个字(32字节)
0b1116个字(64字节)
bit[5:3]:定义了cache的相联属性,其编码格式及含义如表10所示。
表10 类型标识符寄存器控制字段bit[5:3]含义
编 码m=0时的含义m=1时的含义
0b0001路相联
(直接映射)没有cache
0b0012路相联3路相联
0b0104路相联6路相联
0b0118路相联12路相联
0b10016路相联24路相联
0b10132路相联48路相联
0b11064路相联96路相联
0b111128路相联192路相联
1.4 寄存器c1
cp15中的寄存器c1包括以下控制功能:
· 禁止/使能mmu以及其他与存储系统有关的功能;
· 配置存储系统以及arm处理器中相关的工作。
注意在寄存器c1中包含了一些没有使用的位,这些位在将来可能被扩展其他功能时使用。因此为了编写代码在将来更高版本的arm处理器中仍可以使用,在修改寄存器c1中的位时应该使用“读取-修改特定位-写入”的操作序列。
当对寄存器c1进行读操作时,指令中crm和opcode2的值将被处理器忽略,所以要人工将其置位为0。
例2用mrc/mcr指令将协处理器寄存器c1的值进行读取和写入。
【例2】
mrc p15,0,r0,c1,0,0 ;将寄存器c1的值读取到arm寄存器r0中
mcr p15,0,r0,c1,0,0 ;将arm寄存器r0的值写入寄存器c1
图7显示了寄存器c1的编码格式。
图7 寄存器c1编码格式
寄存器c1各控制字段的含义如表11所示。
表11 寄存器c1中各控制位字段的含义
c1中的控制位含 义
m(bit[0])禁止/使能mmu或者mpu
0:禁止mmu或者mpu
1:使能mmu或者mpu
如果系统中没有mmu或者mpu,读取时该位返回0,写入时忽略
a(bit[1])对于可以选择是否支持内存访问时地址对齐检查的系统,本位禁止/使能地址对齐检查功能
0:禁止地址对齐检查功能
1:使能地址对齐检查功能
对寄存器进行写操作时,忽略该位
c(bit[2])当数据cache和指令cache分开时,本控制位禁止/使能数据cache。
当数据cache和指令cache统一时,该控制位禁止/使能整个cache
0:禁止cache
1:使能cache
如果系统中不含cache,读取时该位返回0,写入时忽略
当系统中cache不能禁止时,读取返回1,写入时忽略
w(bit[3])禁止/使能写缓存
0:禁止写缓存
1:使能写缓存
如果系统中不含写缓存,读取时该位返回0,写入时忽略
当系统中的写缓存不能禁止时,读取时该位返回0,写入时忽略
p(bit[4])对于向前兼容26位arm处理器,本控制位控制prgc32控制信号
0:异常中断处理程序进入32位地址模式
1:异常中断处理程序进入26位地址模式
如果系统不支持向前兼容26位地址,读取该位时返回1,写入时被忽略
d(bit[5])对于向前兼容26位arm处理器,本控制位控制data32控制信号
0:禁止26位地址异常检查
1:使能26位地址异常检测
如果系统不支持向前兼容26位地址,读取该位时返回1,写入时被忽略
续表
c1中的控制位含 义
l(bit[6])对于armv3及以前版本,本控制位可以控制处理器的中止模式
0:选择早期中止模式
1:选择后期中止模式
对于以后的处理器读取该位时返回1,写入时忽略
b(bit[7])对于存储系统同时支持大/小端(big-endian/little-endian)的arm处理器,该控制位配置系统使用哪种内存模式
0:使用小端(little-endian)
0:使用大端(big-endian)
对于只支持小端(little-endian)的系统,读取时该位返回0,写入时忽略
对于只支持大端(big-endian)的系统,读取时该位返回1,写入时忽略
s(bit[8])支持mmu的存储系统中,本控制位用作系统保护
r(bit[9])支持mmu的存储系统中,本控制位用作rom保护
f(bit[10])本控制位由生产厂商定义
z(bit[11])对于支持跳转预测的arm系统,本控制位禁止/使能跳转预测功能
0:禁止跳转预测功能
1:使能跳转预测功能
对于不支持跳转预测的arm系统,读取时该位返回0,写入时忽略
i(bit[12])当数据cache和指令cache是分开的,本控制位禁止/使能指令cache
0:禁止指令cache
1:使能指令cache
如果系统中使用统一的指令cache和数据cache或者系统中不含cache,读取该位时返回0,写入时忽略该位
当系统中的指令cache不能禁止时,读取该位返回1,写入时忽略该位
v(bit[13])支持高端异常向量表的系统中,本控制位控制向量表的位置
0:选择0x00000000~0x0000001c
1:选择0xffff0000~0xffff001c
对于不支持高端中断向量表的系统,读取时返回0,写入时忽略
rr(bit[14])如果系统中cache的淘汰算法可以选择的话,本控制位选择淘汰算法
0:选择常规的淘汰算法,如随机淘汰算法
1:选择预测性的淘汰算法,如轮转(round-robin)淘汰算法
如果系统中淘汰算法不可选择,写入该位时被忽略,读取该位时,根据其淘汰算法是否可以比较简单地预测最坏情况返回1或者0
l4(bit[15])arm版本5及以上的版本中,本控制位可以提供兼容以前的arm版本的功能
0:保持当前arm版本的正常功能
1:对于一些根据跳转地址的bit[0]进行状态切换的指令,忽略bit[0],不进行状态切换,保持和以前arm版本兼容
此控制位可以影响以下指令:ldm、ldr和pop
对于arm版本5以前的处理器,该位没有使用,应作为unp/sbzp
对于arm版本5以后的处理器,如果不支持向前兼容的属性,读取时该位返回0,写入时忽略
bit(bit[31:16])这些位保留将来使用,应为unp/sbzp

拙进通信发布RFID技术新产品:智能校徽
移动端游戏体验的发展趋势
双通道DC/DC转换器LT3582/-5/-12的功能特点及应用范围
谷歌推出第2代企业版VR眼镜
可穿戴健康技术能否准确定位疾病发作
常见的五大ARM存储器之一:协处理器CP15
华硕ROG光刃GL12CX高清图集
2038年问题始末
PCB叠层设计遵循的规则
录播产品通用线性稳压器MP20051简述
纯化学刻蚀、纯物理刻蚀及反应式离子刻蚀介绍
芯片产业是怎样迎来新的发展的
浙江省新基建应用场景创新大赛决赛落幕
2020年先进能源材料与器件国际大会部分报告嘉宾名单以及会议议题
好的地暖不仅看得到,还经得起撕
物联网通信协议的种类与其区别
深圳星航将安立无线连接测试仪集成到其测试系统产品上
影响语音芯片采样率主要因素有哪些?
用于监控应用的坚固任务显示器
慧视SpeedDP本地化服务器部署助企事业单位有效化解风险!