首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ARM存储器之:协处理器CP15(2)

ARM存储器之:协处理器CP15(2)

指令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作为一个独立的模块来管理并向上提供通用接口,以屏蔽不同型号处理器之间的差异。
                       

        例15.1给出了一个典型的利用SWI进行模式切换的例子。

        【例15.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

        15.1.2  CP15中的寄存器        表15.1给出了CP15主要寄存器的功能和作用。
        表15.1 CP15寄存器
                                                                                                                                                               
                                                                        寄存器编号
                       
                                                                        基 本 作 用
                       
                                                                        特 殊 用 途
                       
                                                                        0
                       
                                                                        ID编号(只读)
                       
                                                                        ID和Cache类型
                       
                                                                        1
                       
                                                                        控制位
                       
                                                                        各种控制位
                       
                                                                        2
                       
                                                                        存储器保护和控制
                       
                                                                        MMU:地址转换表基地址
                                                                        PU:Cache属性设置
                       
                                                                        3
                       
                                                                        内存保护和控制
                       
                                                                        MMU:域访问控制
                                                                        PU:写缓存控制
                       
                                                                        4
                       
                                                                        内存保护和控制
                       
                                                                        保留
                       
                                                                        5
                       
                                                                        内存保护和控制
                       
                                                                        MMU:错误状态
                                                                        PU:访问权限控制
                       
                                                                        6
                       
                                                                        内存保护和控制
                       
                                                                        MMU:错误状态
                                                                        PU:保护区域控制
                       
                                                                        7
                       
                                                                        Cache和写缓存
                       
                                                                        Cache和写缓存控制
                       
                                                                        8
                       
                                                                        内存保护和控制
                       
                                                                        MMU:TLB控制
                                                                        PU:保留
                       
                                                                        9
                       
                                                                        Cache和写缓存
                       
                                                                        Cache锁定
                       
        续表
                                                                                               
                                                                        寄存器编号
                       
                                                                        基 本 作 用
                       
                                                                        特 殊 用 途
                       
                                                                        10
                       
                                                                        内存保护和控制
                       
                                                                        MMU:TLB锁定
                                                                        PU:保留
                       
                                                                        11
                       
                                                                        保留
                       
                                                                        保留
                       
                                                                        12
                       
                                                                        保留
                       
                                                                        保留
                       
                                                                        13
                       
                                                                        进程ID
                       
                                                                        进程ID
                       
                                                                        14
                       
                                                                        保留
                       
                                                                        保留
                       
                                                                        15
                       
                                                                        芯片生产厂商定义
                       
                                                                        芯片生产厂商定义
                       
                 15.1.3  寄存器c0        寄存器c0包含的是ARM本身或芯片生产厂商的一些标识信息。当使用MRC指令读c0寄存器时,根据第二个操作码opcode2的不同,读出的标识符也是不同的。操作码与标识符的对应关系如表15.2所示。寄存器c0是只读寄存器,当用MCR指令对其进行写操作时,指令的执行结果不可预知。

        表15.2 操作码和标识符的对应关系
                                                                       
                                                                        操作码opcode2
                       
                                                                        对应的标识符寄存器
                       
                                                                        0b000
                       
                                                                        主标识符寄存器
                       
                                                                        0b001
                       
                                                                        Cache类型寄存器
                       
                                                                        其他
                       
                                                                        保留
继承事业,薪火相传
返回列表