<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > ARM存儲器之:協(xié)處理器CP15

ARM存儲器之:協(xié)處理器CP15

作者: 時(shí)間:2013-09-30 來(lái)源:網(wǎng)絡(luò ) 收藏

本文引用地址:http://dyxdggzs.com/article/257013.htm

15.1.1寄存器訪(fǎng)問(wèn)指令

通常對的訪(fǎng)問(wèn)使用以下兩種指令。

MCR:將寄存器的值寫(xiě)入寄存器中;

MRC:將CP15寄存器的值寫(xiě)入寄存器中。

注意

通過(guò)訪(fǎng)問(wèn)指令CDP、LDC和STC指令對CP15進(jìn)行訪(fǎng)問(wèn)將產(chǎn)生不可預知的結果。

其中,CDP為協(xié)處理器數據操作指令,這個(gè)指令初始化一些與協(xié)處理器相關(guān)的操作;

LDC為一個(gè)或多個(gè)字的協(xié)處理器數據讀取指令,此指令從讀取數據到指定的協(xié)處理器中;

STC為一個(gè)或多個(gè)32位字的協(xié)處理器數據寫(xiě)入指令,此指令初始化一個(gè)協(xié)處理器的寫(xiě)操作,從給定的協(xié)處理器把數據傳送到中。

指令MCR和MRC指令訪(fǎng)問(wèn)CP15寄存器使用通用語(yǔ)法。

語(yǔ)法格式為:

MCR{cond>}p15,opcode1=0>,Rd>,CRn>,CRm>{,opcode2>}

MRC{cond>}p15,opcode1=0>,Rd>,CRn>,CRm>{,opcode2>}

其中:

cond>為指令的執行條件。當cond>條件域為空時(shí),指令無(wú)條件執行;

opcode1>在標準的MRC指令中,為協(xié)處理器的opcode1>,即操作數1。對于CP15來(lái)說(shuō),此操作數恒為0,即0b000。當針對CP15的MRC指令中opcode1>不為0時(shí),指令的操作結果不可預知;

Rd>為寄存器,在A(yíng)RM和協(xié)處理器交換數據時(shí)使用。在MRC指令中作為目的寄存器,在MCR中作為源寄存器。

注意

r15不能作為ARM寄存器出現在MRC或MCR指令中,如果r15作為Rd>出現在這里,那么指令的執行結果不可預知。

CRn>是CP15協(xié)處理器指令中用到的主要寄存器。在MRC指令中為源寄存器,在MCR中為目的寄存器。CP15協(xié)處理器的寄存器c0、c1、…、c15均可出現在這里。

CRm>是附加的協(xié)處理器寄存器,用于區分同一個(gè)編號的不同物理寄存器和訪(fǎng)問(wèn)類(lèi)型。當指令中不需要提供附加信息時(shí),將CRm>指定為C0,否則指令的操作結果不可預知。

opcode2>提供附加信息,用于區分同一個(gè)編號的不同物理寄存器,當指令中沒(méi)有指定附加信息時(shí),省略opcode2>或者將其指定為0,否則指令的操作結果不可預知。

MCR和MRC指令只能操作在特權模式下,如果處理器運行在用戶(hù)模式,指令的執行結果不可預知。

注意

在用戶(hù)模式下,如果要訪(fǎng)問(wèn)系統控制協(xié)處理器,通常的做法是由操作系統提供SWI軟中斷調用來(lái)完成系統模式的切換。由于不同型號的ARM處理器對此管理差別很大,所以建議用戶(hù)在應用時(shí)將SWI作為一個(gè)獨立的模塊來(lái)管理并向上提供通用接口,以屏蔽不同型號處理器之間的差異。

例15.1給出了一個(gè)典型的利用SWI進(jìn)行模式切換的例子。

【例15.1】

典型的在SWI中進(jìn)行模式切換的例子。利用此例,調用SWI0來(lái)完成系統模式切換。

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

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

;用戶(hù)可在此添加更多的自定義軟中斷,在此SWI0作為系統保留的軟中斷,調用例程EHT_SU_Switch,來(lái)進(jìn)行模式切換

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

EHT_SU_Switch

MMU_DISABLE ;轉換前禁用MMU

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

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

ORRr0,r0,#SYS_MODE ;設置程序狀態(tài)字的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



關(guān)鍵詞: ARM 存儲器 協(xié)處理器 CP15 TCM

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>