新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM存儲器之:協處理器CP15

        ARM存儲器之:協處理器CP15

        作者: 時間:2013-09-30 來源:網絡 收藏

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

        15.1.1寄存器訪問指令

        通常對的訪問使用以下兩種指令。

        MCR:將寄存器的值寫入寄存器中;

        MRC:將CP15寄存器的值寫入寄存器中。

        注意

        通過訪問指令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和協處理器交換數據時使用。在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中進行模式切換的例子。利用此例,調用SWI0來完成系統模式切換。

        EHT_SWI

        LDRsp,=EHT_Exception_Stack ;更新SWI堆棧指針

        ADDsp,sp,#EXCEPTION_SIZE ;得到棧頂指針

        STMDBsp!,{r0-r2,lr} ;保存程序中用到的寄存器

        MRSr0,SPSR ;得到SPSR

        STMDBsp!,{r0} ;保持SPSR

        LDRr0,[lr,#-4] ;計算SWI指令地址

        BICr0,r0,#0xFF000000 ;提取中斷向量號

        CMPr0,#MAX_SWI ;檢測中斷向量范圍

        LDRLSpc,[pc,r0,LSL#2] ;如果在范圍內,跳轉到軟中斷向量表

        BEHT_SWI_Exit ;為定義的SWI指令出口

        EHT_Jump_Table

        DCDEHT_SU_Switch

        DCDEHT_Disable_Interrupts

        ;*********************************************************************************

        ;用戶可在此添加更多的自定義軟中斷,在此SWI0作為系統保留的軟中斷,調用例程EHT_SU_Switch,來進行模式切換

        ;*********************************************************************************

        EHT_SU_Switch

        MMU_DISABLE ;轉換前禁用MMU

        LDMIAsp!,{r0} ;從堆棧中取出SPSR

        BICr0,r0,#MODE_MASK ;清除模式位

        ORRr0,r0,#SYS_MODE ;設置程序狀態字的supper模式位

        STMDBsp!,{r0} ;從新將SPSR放入堆棧

        BEHT_SWI_Exit

        EHT_Disable_Interrupts

        LDMIAsp!,{r0} ;從堆棧中讀出SPSR

        ORRr0,r0,#LOCKOUT ;禁止中斷

        STMDBsp!,{r0} ;存儲SPSR到中斷

        ;BEHT_SWI_Exit

        EHT_SWI_Exit

        LDMIAsp!,{r0} ;從堆棧中讀出SPSR

        MSRSPSR_cf,r0 ;將SPSR放入SPSR_cf

        LDMIAsp!,{r0-r2,pc}^ ;寄存器出棧并返回

        END



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 莎车县| 招远市| 会泽县| 东海县| 红原县| 兰溪市| 建水县| 门源| 乌鲁木齐县| 扶风县| 昌都县| 沐川县| 三原县| 大名县| 洛扎县| 江口县| 邹城市| 娄烦县| 林芝县| 浦北县| 海伦市| 和田县| 田东县| 鹿泉市| 郧西县| 隆尧县| 佛冈县| 西乌珠穆沁旗| 长汀县| 遵义市| 若羌县| 侯马市| 岳西县| 乐安县| 江口县| 高州市| 永善县| 永平县| 通江县| 横山县| 陆河县|