資料介紹
ARM存儲(chǔ)系統(tǒng)有非常靈活的體系結(jié)構(gòu),可以適應(yīng)不同的嵌入式應(yīng)用系統(tǒng)的需要。ARM存儲(chǔ)器系統(tǒng)可以使用簡(jiǎn)單的平板式地址映射機(jī)制(就像一些簡(jiǎn)單的單片機(jī)一樣,地址空間的分配方式是固定的,系統(tǒng)中各部分都使用物理地址),也可以使用其他技術(shù)提供功能更為強(qiáng)大的存儲(chǔ)系統(tǒng)。比如:
· 系統(tǒng)可能提供多種類型的存儲(chǔ)器件,如FLASH、ROM、SRAM等;
· Caches技術(shù);
· 寫緩存技術(shù)(write buffers);
· 虛擬內(nèi)存和I/O地址映射技術(shù)。
大多數(shù)的系統(tǒng)通過(guò)下面的方法之一實(shí)現(xiàn)對(duì)復(fù)雜存儲(chǔ)系統(tǒng)的管理。
· 使能Cache,縮小處理器和存儲(chǔ)系統(tǒng)速度差別,從而提高系統(tǒng)的整體性能。
· 使用內(nèi)存映射技術(shù)實(shí)現(xiàn)虛擬空間到物理空間的映射。這種映射機(jī)制對(duì)嵌入式系統(tǒng)非常重要。通常嵌入式系統(tǒng)程序存放在ROM/FLASH中,這樣系統(tǒng)斷電后程序能夠得到保存。但是通常ROM/FLASH與SDRAM相比,速度慢很多,而且基于ARM的嵌入式系統(tǒng)中通常把異常中斷向量表放在RAM中。利用內(nèi)存映射機(jī)制可以滿足這種需要。在系統(tǒng)加電時(shí),將ROM/FLASH映射為地址0,這樣可以進(jìn)行一些初始化處理;當(dāng)這些初始化處理完成后將SDRAM映射為地址0,并把系統(tǒng)程序加載到SDRAM中運(yùn)行,這樣很好地滿足嵌入式系統(tǒng)的需要。
· 引入存儲(chǔ)保護(hù)機(jī)制,增強(qiáng)系統(tǒng)的安全性。
· 引入一些機(jī)制保證將I/O操作映射成內(nèi)存操作后,各種I/O操作能夠得到正確的結(jié)果。在簡(jiǎn)單存儲(chǔ)系統(tǒng)中,不存在這樣問(wèn)題。而當(dāng)系統(tǒng)引入了Cache和write buffer后,就需要一些特別的措施。
在ARM系統(tǒng)中,要實(shí)現(xiàn)對(duì)存儲(chǔ)系統(tǒng)的管理通常是使用協(xié)處理器CP15,它通常也被稱為系統(tǒng)控制協(xié)處理器(System Control Coprocessor)。
ARM的存儲(chǔ)器系統(tǒng)是由多級(jí)構(gòu)成的,每級(jí)都有特定的容量和速度。
圖15.1顯示了存儲(chǔ)器的層次結(jié)構(gòu)。
?、?寄存器。處理器寄存器組可看作是存儲(chǔ)器層次的頂層。這些寄存器被集成在處理器內(nèi)核中,在系統(tǒng)中提供最快的存儲(chǔ)器訪問(wèn)。典型的ARM處理器有多個(gè)32位寄存器,其訪問(wèn)時(shí)間為ns量級(jí)。

圖15.1 存儲(chǔ)器的層次結(jié)構(gòu)
② 緊耦合存儲(chǔ)器TCM。為彌補(bǔ)Cache訪問(wèn)的不確定性增加的存儲(chǔ)器。TCM是一種快速SDRAM,它緊挨內(nèi)核,并且保證取指和數(shù)據(jù)操作的時(shí)鐘周期數(shù),這一點(diǎn)對(duì)一些要求確定行為的實(shí)時(shí)算法是很重要的。TCM位于存儲(chǔ)器地址映射中,可作為快速存儲(chǔ)器來(lái)訪問(wèn)。
?、?片上Cache存儲(chǔ)器的容量在8KB~32KB之間,訪問(wèn)時(shí)間大約為10ns。
④ 高性能的ARM結(jié)構(gòu)中,可能存在第二級(jí)片外Cache,容量為幾百KB,訪問(wèn)時(shí)間為幾十ns。
?、?DRAM。主存儲(chǔ)器可能是幾MB到幾十MB的動(dòng)態(tài)存儲(chǔ)器,訪問(wèn)時(shí)間大約為100ns。
?、?后援存儲(chǔ)器,通常是硬盤,可能從幾百M(fèi)B到幾個(gè)GB,訪問(wèn)時(shí)間為幾十ms。
注意TCM和SRAM在技術(shù)上相同,但在結(jié)構(gòu)排列上不同;TCM在片上,而SRAM在板上。
15.1 協(xié)處理器CP15
ARM處理器支持16個(gè)協(xié)處理器。在程序執(zhí)行過(guò)程中,每個(gè)協(xié)處理器忽略屬于ARM處理器和其他協(xié)處理器的指令。當(dāng)一個(gè)協(xié)處理器硬件不能執(zhí)行屬于它的協(xié)處理器指令時(shí),將產(chǎn)生一個(gè)未定義指令異常中斷,在該異常中斷處理程序中,可以通過(guò)軟件模擬該硬件操作。比如,如果系統(tǒng)不包含向量浮點(diǎn)運(yùn)算器,則可以選擇浮點(diǎn)運(yùn)算軟件模擬包來(lái)支持向量浮點(diǎn)運(yùn)算。
CP15,即通常所說(shuō)的系統(tǒng)控制協(xié)處理器(System Control Coprocesssor)。它負(fù)責(zé)完成大部分的存儲(chǔ)系統(tǒng)管理。除了CP15外,在具體的各種存儲(chǔ)管理機(jī)制中可能還會(huì)用到其他的一些技術(shù),如在MMU中除CP15外,還使用了頁(yè)表技術(shù)等。
在一些沒有標(biāo)準(zhǔn)存儲(chǔ)管理的系統(tǒng)中,CP15是不存在的。在這種情況下,針對(duì)協(xié)處理器CP15的操作指令將被視為未定義指令,指令的執(zhí)行結(jié)果不可預(yù)知。
CP15包含16個(gè)32位寄存器,其編號(hào)為0~15。實(shí)際上對(duì)于某些編號(hào)的寄存器可能對(duì)應(yīng)多個(gè)物理寄存器,在指令中指定特定的標(biāo)志位來(lái)區(qū)分這些物理寄存器。這種機(jī)制有些類似于ARM中的寄存器,當(dāng)處于不同的處理器模式時(shí),某些相同編號(hào)的寄存器對(duì)應(yīng)于不同的物理寄存器。
CP15中的寄存器可能是只讀的,也可能是只寫的,還有一些是可讀可寫的。在對(duì)協(xié)處理器寄存器進(jìn)行操作時(shí),需要注意以下幾個(gè)問(wèn)題。
· 寄存器的訪問(wèn)類型(只讀/只寫/可讀可寫)。
· 不同的訪問(wèn)引發(fā)的不同功能。
· 相同編號(hào)的寄存器是否對(duì)應(yīng)不同的物理寄存器。
· 寄存器的具體作用。
15.1.1 CP15寄存器訪問(wèn)指令
通常對(duì)協(xié)處理器CP15的訪問(wèn)使用以下兩種指令。
MCR:將ARM寄存器的值寫入CP15寄存器中;
MRC:將CP15寄存器的值寫入ARM寄存器中。
注意通過(guò)協(xié)處理器訪問(wèn)指令CDP、LDC和STC指令對(duì)協(xié)處理器CP15進(jìn)行訪問(wèn)將產(chǎn)生不可預(yù)知的結(jié)果。
其中,CDP為協(xié)處理器數(shù)據(jù)操作指令,這個(gè)指令初始化一些與協(xié)處理器相關(guān)的操作;
LDC為一個(gè)或多個(gè)字的協(xié)處理器數(shù)據(jù)讀取指令,此指令從存儲(chǔ)器讀取數(shù)據(jù)到指定的協(xié)處理器中;
STC為一個(gè)或多個(gè)32位字的協(xié)處理器數(shù)據(jù)寫入指令,此指令初始化一個(gè)協(xié)處理器的寫操作,從給定的協(xié)處理器把數(shù)據(jù)傳送到存儲(chǔ)器中。
指令MCR和MRC指令訪問(wèn)CP15寄存器使用通用語(yǔ)法。
語(yǔ)法格式為:
MCR{《cond》} p15,《opcode1=0》,《Rd》,《CRn》,《CRm》{,《opcode2》}
MRC{《cond》} p15,《opcode1=0》,《Rd》,《CRn》,《CRm》{,《opcode2》}
其中:
《cond》為指令的執(zhí)行條件。當(dāng)《cond》條件域?yàn)榭諘r(shí),指令無(wú)條件執(zhí)行;
《opcode1》在標(biāo)準(zhǔn)的MRC指令中,為協(xié)處理器的《opcode1》,即操作數(shù)1。對(duì)于CP15來(lái)說(shuō),此操作數(shù)恒為0,即0b000。當(dāng)針對(duì)CP15的MRC指令中《opcode1》不為0時(shí),指令的操作結(jié)果不可預(yù)知;
《Rd》為ARM寄存器,在ARM和協(xié)處理器交換數(shù)據(jù)時(shí)使用。在MRC指令中作為目的寄存器,在MCR中作為源寄存器。
注意r15不能作為ARM寄存器出現(xiàn)在MRC或MCR指令中,如果r15作為《Rd》出現(xiàn)在這里,那么指令的執(zhí)行結(jié)果不可預(yù)知。
《CRn》是CP15協(xié)處理器指令中用到的主要寄存器。在MRC指令中為源寄存器,在MCR中為目的寄存器。CP15協(xié)處理器的寄存器c0、c1、…、c15均可出現(xiàn)在這里。
《CRm》是附加的協(xié)處理器寄存器,用于區(qū)分同一個(gè)編號(hào)的不同物理寄存器和訪問(wèn)類型。當(dāng)指令中不需要提供附加信息時(shí),將《CRm》指定為C0,否則指令的操作結(jié)果不可預(yù)知。
《opcode2》提供附加信息,用于區(qū)分同一個(gè)編號(hào)的不同物理寄存器,當(dāng)指令中沒有指定附加信息時(shí),省略《opcode2》或者將其指定為0,否則指令的操作結(jié)果不可預(yù)知。
MCR和MRC指令只能操作在特權(quán)模式下,如果處理器運(yùn)行在用戶模式,指令的執(zhí)行結(jié)果不可預(yù)知。
注意在用戶模式下,如果要訪問(wèn)系統(tǒng)控制協(xié)處理器,通常的做法是由操作系統(tǒng)提供SWI軟中斷調(diào)用來(lái)完成系統(tǒng)模式的切換。由于不同型號(hào)的ARM處理器對(duì)此管理差別很大,所以建議用戶在應(yīng)用時(shí)將SWI作為一個(gè)獨(dú)立的模塊來(lái)管理并向上提供通用接口,以屏蔽不同型號(hào)處理器之間的差異。
例15.1給出了一個(gè)典型的利用SWI進(jìn)行模式切換的例子。
【例15.1】
典型的在SWI中進(jìn)行模式切換的例子。利用此例,調(diào)用SWI 0來(lái)完成系統(tǒng)模式切換。
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] ;計(jì)算SWI指令地址
BIC r0,r0,#0xFF000000 ;提取中斷向量號(hào)
CMP r0,#MAX_SWI ;檢測(cè)中斷向量范圍
LDRLS pc,[pc,r0,LSL #2] ;如果在范圍內(nèi),跳轉(zhuǎn)到軟中斷向量表
B EHT_SWI_Exit ;為定義的SWI指令出口
EHT_Jump_Table
DCD EHT_SU_Switch
DCD EHT_Disable_Interrupts
??;*********************************************************************************
??;用戶可在此添加更多的自定義軟中斷,在此SWI0作為系統(tǒng)保留的軟中斷,調(diào)用例程EHT_SU_Switch,來(lái)進(jìn)行模式切換
;*********************************************************************************
EHT_SU_Switch
MMU_DISABLE ;轉(zhuǎn)換前禁用MMU
LDMIA sp!,{r0} ;從堆棧中取出SPSR
BIC r0,r0,#MODE_MASK ;清除模式位
ORR r0,r0,#SYS_MODE ;設(shè)置程序狀態(tài)字的supper模式位
STMDB sp!,{r0} ;從新將SPSR放入堆棧
B EHT_SWI_Exit
EHT_Disable_Interrupts
LDMIA sp!,{r0} ;從堆棧中讀出SPSR
ORR r0,r0,#LOCKOUT ;禁止中斷
STMDB sp!,{r0} ;存儲(chǔ)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寄存器
寄存器編號(hào)基 本 作 用特 殊 用 途
0ID編號(hào)(只讀)ID和Cache類型
1控制位各種控制位
2存儲(chǔ)器保護(hù)和控制MMU:地址轉(zhuǎn)換表基地址
PU:Cache屬性設(shè)置
3內(nèi)存保護(hù)和控制MMU:域訪問(wèn)控制
PU:寫緩存控制
4內(nèi)存保護(hù)和控制保留
5內(nèi)存保護(hù)和控制MMU:錯(cuò)誤狀態(tài)
PU:訪問(wèn)權(quán)限控制
6內(nèi)存保護(hù)和控制MMU:錯(cuò)誤狀態(tài)
PU:保護(hù)區(qū)域控制
7Cache和寫緩存Cache和寫緩存控制
8內(nèi)存保護(hù)和控制MMU:TLB控制
PU:保留
9Cache和寫緩存Cache鎖定
續(xù)表
寄存器編號(hào)基 本 作 用特 殊 用 途
10內(nèi)存保護(hù)和控制MMU:TLB鎖定
PU:保留
11保留保留
12保留保留
13進(jìn)程ID進(jìn)程ID
14保留保留
15芯片生產(chǎn)廠商定義芯片生產(chǎn)廠商定義
15.1.3 寄存器c0
寄存器c0包含的是ARM本身或芯片生產(chǎn)廠商的一些標(biāo)識(shí)信息。當(dāng)使用MRC指令讀c0寄存器時(shí),根據(jù)第二個(gè)操作碼opcode2的不同,讀出的標(biāo)識(shí)符也是不同的。操作碼與標(biāo)識(shí)符的對(duì)應(yīng)關(guān)系如表15.2所示。寄存器c0是只讀寄存器,當(dāng)用MCR指令對(duì)其進(jìn)行寫操作時(shí),指令的執(zhí)行結(jié)果不可預(yù)知。
表15.2 操作碼和標(biāo)識(shí)符的對(duì)應(yīng)關(guān)系
操作碼opcode2對(duì)應(yīng)的標(biāo)識(shí)符寄存器
0b000主標(biāo)識(shí)符寄存器
0b001Cache類型寄存器
其他保留
在操作碼opcode2的取值中,主標(biāo)識(shí)符(opcode2=0)是強(qiáng)制定義的,其他標(biāo)識(shí)符由芯片的生產(chǎn)廠商定義。如果操作碼opcode2指定的值未定義,指令將返回主標(biāo)識(shí)符。其他標(biāo)識(shí)符的值應(yīng)與主標(biāo)識(shí)符的值不同,可以由軟件編程來(lái)實(shí)現(xiàn),同時(shí)讀取主標(biāo)識(shí)符和其他標(biāo)識(shí)符,并將兩者的值進(jìn)行比較。如果兩個(gè)標(biāo)識(shí)符值相同,說(shuō)明未定義該標(biāo)識(shí)符;如果兩個(gè)標(biāo)識(shí)符值不同,說(shuō)明定義了該標(biāo)識(shí)符,并且得到該標(biāo)識(shí)符的值。
· 系統(tǒng)可能提供多種類型的存儲(chǔ)器件,如FLASH、ROM、SRAM等;
· Caches技術(shù);
· 寫緩存技術(shù)(write buffers);
· 虛擬內(nèi)存和I/O地址映射技術(shù)。
大多數(shù)的系統(tǒng)通過(guò)下面的方法之一實(shí)現(xiàn)對(duì)復(fù)雜存儲(chǔ)系統(tǒng)的管理。
· 使能Cache,縮小處理器和存儲(chǔ)系統(tǒng)速度差別,從而提高系統(tǒng)的整體性能。
· 使用內(nèi)存映射技術(shù)實(shí)現(xiàn)虛擬空間到物理空間的映射。這種映射機(jī)制對(duì)嵌入式系統(tǒng)非常重要。通常嵌入式系統(tǒng)程序存放在ROM/FLASH中,這樣系統(tǒng)斷電后程序能夠得到保存。但是通常ROM/FLASH與SDRAM相比,速度慢很多,而且基于ARM的嵌入式系統(tǒng)中通常把異常中斷向量表放在RAM中。利用內(nèi)存映射機(jī)制可以滿足這種需要。在系統(tǒng)加電時(shí),將ROM/FLASH映射為地址0,這樣可以進(jìn)行一些初始化處理;當(dāng)這些初始化處理完成后將SDRAM映射為地址0,并把系統(tǒng)程序加載到SDRAM中運(yùn)行,這樣很好地滿足嵌入式系統(tǒng)的需要。
· 引入存儲(chǔ)保護(hù)機(jī)制,增強(qiáng)系統(tǒng)的安全性。
· 引入一些機(jī)制保證將I/O操作映射成內(nèi)存操作后,各種I/O操作能夠得到正確的結(jié)果。在簡(jiǎn)單存儲(chǔ)系統(tǒng)中,不存在這樣問(wèn)題。而當(dāng)系統(tǒng)引入了Cache和write buffer后,就需要一些特別的措施。
在ARM系統(tǒng)中,要實(shí)現(xiàn)對(duì)存儲(chǔ)系統(tǒng)的管理通常是使用協(xié)處理器CP15,它通常也被稱為系統(tǒng)控制協(xié)處理器(System Control Coprocessor)。
ARM的存儲(chǔ)器系統(tǒng)是由多級(jí)構(gòu)成的,每級(jí)都有特定的容量和速度。
圖15.1顯示了存儲(chǔ)器的層次結(jié)構(gòu)。
?、?寄存器。處理器寄存器組可看作是存儲(chǔ)器層次的頂層。這些寄存器被集成在處理器內(nèi)核中,在系統(tǒng)中提供最快的存儲(chǔ)器訪問(wèn)。典型的ARM處理器有多個(gè)32位寄存器,其訪問(wèn)時(shí)間為ns量級(jí)。

圖15.1 存儲(chǔ)器的層次結(jié)構(gòu)
② 緊耦合存儲(chǔ)器TCM。為彌補(bǔ)Cache訪問(wèn)的不確定性增加的存儲(chǔ)器。TCM是一種快速SDRAM,它緊挨內(nèi)核,并且保證取指和數(shù)據(jù)操作的時(shí)鐘周期數(shù),這一點(diǎn)對(duì)一些要求確定行為的實(shí)時(shí)算法是很重要的。TCM位于存儲(chǔ)器地址映射中,可作為快速存儲(chǔ)器來(lái)訪問(wèn)。
?、?片上Cache存儲(chǔ)器的容量在8KB~32KB之間,訪問(wèn)時(shí)間大約為10ns。
④ 高性能的ARM結(jié)構(gòu)中,可能存在第二級(jí)片外Cache,容量為幾百KB,訪問(wèn)時(shí)間為幾十ns。
?、?DRAM。主存儲(chǔ)器可能是幾MB到幾十MB的動(dòng)態(tài)存儲(chǔ)器,訪問(wèn)時(shí)間大約為100ns。
?、?后援存儲(chǔ)器,通常是硬盤,可能從幾百M(fèi)B到幾個(gè)GB,訪問(wèn)時(shí)間為幾十ms。

15.1 協(xié)處理器CP15
ARM處理器支持16個(gè)協(xié)處理器。在程序執(zhí)行過(guò)程中,每個(gè)協(xié)處理器忽略屬于ARM處理器和其他協(xié)處理器的指令。當(dāng)一個(gè)協(xié)處理器硬件不能執(zhí)行屬于它的協(xié)處理器指令時(shí),將產(chǎn)生一個(gè)未定義指令異常中斷,在該異常中斷處理程序中,可以通過(guò)軟件模擬該硬件操作。比如,如果系統(tǒng)不包含向量浮點(diǎn)運(yùn)算器,則可以選擇浮點(diǎn)運(yùn)算軟件模擬包來(lái)支持向量浮點(diǎn)運(yùn)算。
CP15,即通常所說(shuō)的系統(tǒng)控制協(xié)處理器(System Control Coprocesssor)。它負(fù)責(zé)完成大部分的存儲(chǔ)系統(tǒng)管理。除了CP15外,在具體的各種存儲(chǔ)管理機(jī)制中可能還會(huì)用到其他的一些技術(shù),如在MMU中除CP15外,還使用了頁(yè)表技術(shù)等。
在一些沒有標(biāo)準(zhǔn)存儲(chǔ)管理的系統(tǒng)中,CP15是不存在的。在這種情況下,針對(duì)協(xié)處理器CP15的操作指令將被視為未定義指令,指令的執(zhí)行結(jié)果不可預(yù)知。
CP15包含16個(gè)32位寄存器,其編號(hào)為0~15。實(shí)際上對(duì)于某些編號(hào)的寄存器可能對(duì)應(yīng)多個(gè)物理寄存器,在指令中指定特定的標(biāo)志位來(lái)區(qū)分這些物理寄存器。這種機(jī)制有些類似于ARM中的寄存器,當(dāng)處于不同的處理器模式時(shí),某些相同編號(hào)的寄存器對(duì)應(yīng)于不同的物理寄存器。
CP15中的寄存器可能是只讀的,也可能是只寫的,還有一些是可讀可寫的。在對(duì)協(xié)處理器寄存器進(jìn)行操作時(shí),需要注意以下幾個(gè)問(wèn)題。
· 寄存器的訪問(wèn)類型(只讀/只寫/可讀可寫)。
· 不同的訪問(wèn)引發(fā)的不同功能。
· 相同編號(hào)的寄存器是否對(duì)應(yīng)不同的物理寄存器。
· 寄存器的具體作用。
15.1.1 CP15寄存器訪問(wèn)指令
通常對(duì)協(xié)處理器CP15的訪問(wèn)使用以下兩種指令。
MCR:將ARM寄存器的值寫入CP15寄存器中;
MRC:將CP15寄存器的值寫入ARM寄存器中。

其中,CDP為協(xié)處理器數(shù)據(jù)操作指令,這個(gè)指令初始化一些與協(xié)處理器相關(guān)的操作;
LDC為一個(gè)或多個(gè)字的協(xié)處理器數(shù)據(jù)讀取指令,此指令從存儲(chǔ)器讀取數(shù)據(jù)到指定的協(xié)處理器中;
STC為一個(gè)或多個(gè)32位字的協(xié)處理器數(shù)據(jù)寫入指令,此指令初始化一個(gè)協(xié)處理器的寫操作,從給定的協(xié)處理器把數(shù)據(jù)傳送到存儲(chǔ)器中。
指令MCR和MRC指令訪問(wèn)CP15寄存器使用通用語(yǔ)法。
語(yǔ)法格式為:
MCR{《cond》} p15,《opcode1=0》,《Rd》,《CRn》,《CRm》{,《opcode2》}
MRC{《cond》} p15,《opcode1=0》,《Rd》,《CRn》,《CRm》{,《opcode2》}
其中:
《cond》為指令的執(zhí)行條件。當(dāng)《cond》條件域?yàn)榭諘r(shí),指令無(wú)條件執(zhí)行;
《opcode1》在標(biāo)準(zhǔn)的MRC指令中,為協(xié)處理器的《opcode1》,即操作數(shù)1。對(duì)于CP15來(lái)說(shuō),此操作數(shù)恒為0,即0b000。當(dāng)針對(duì)CP15的MRC指令中《opcode1》不為0時(shí),指令的操作結(jié)果不可預(yù)知;
《Rd》為ARM寄存器,在ARM和協(xié)處理器交換數(shù)據(jù)時(shí)使用。在MRC指令中作為目的寄存器,在MCR中作為源寄存器。

《CRn》是CP15協(xié)處理器指令中用到的主要寄存器。在MRC指令中為源寄存器,在MCR中為目的寄存器。CP15協(xié)處理器的寄存器c0、c1、…、c15均可出現(xiàn)在這里。
《CRm》是附加的協(xié)處理器寄存器,用于區(qū)分同一個(gè)編號(hào)的不同物理寄存器和訪問(wèn)類型。當(dāng)指令中不需要提供附加信息時(shí),將《CRm》指定為C0,否則指令的操作結(jié)果不可預(yù)知。
《opcode2》提供附加信息,用于區(qū)分同一個(gè)編號(hào)的不同物理寄存器,當(dāng)指令中沒有指定附加信息時(shí),省略《opcode2》或者將其指定為0,否則指令的操作結(jié)果不可預(yù)知。
MCR和MRC指令只能操作在特權(quán)模式下,如果處理器運(yùn)行在用戶模式,指令的執(zhí)行結(jié)果不可預(yù)知。

例15.1給出了一個(gè)典型的利用SWI進(jìn)行模式切換的例子。
【例15.1】
典型的在SWI中進(jìn)行模式切換的例子。利用此例,調(diào)用SWI 0來(lái)完成系統(tǒng)模式切換。
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] ;計(jì)算SWI指令地址
BIC r0,r0,#0xFF000000 ;提取中斷向量號(hào)
CMP r0,#MAX_SWI ;檢測(cè)中斷向量范圍
LDRLS pc,[pc,r0,LSL #2] ;如果在范圍內(nèi),跳轉(zhuǎn)到軟中斷向量表
B EHT_SWI_Exit ;為定義的SWI指令出口
EHT_Jump_Table
DCD EHT_SU_Switch
DCD EHT_Disable_Interrupts
??;*********************************************************************************
??;用戶可在此添加更多的自定義軟中斷,在此SWI0作為系統(tǒng)保留的軟中斷,調(diào)用例程EHT_SU_Switch,來(lái)進(jìn)行模式切換
;*********************************************************************************
EHT_SU_Switch
MMU_DISABLE ;轉(zhuǎn)換前禁用MMU
LDMIA sp!,{r0} ;從堆棧中取出SPSR
BIC r0,r0,#MODE_MASK ;清除模式位
ORR r0,r0,#SYS_MODE ;設(shè)置程序狀態(tài)字的supper模式位
STMDB sp!,{r0} ;從新將SPSR放入堆棧
B EHT_SWI_Exit
EHT_Disable_Interrupts
LDMIA sp!,{r0} ;從堆棧中讀出SPSR
ORR r0,r0,#LOCKOUT ;禁止中斷
STMDB sp!,{r0} ;存儲(chǔ)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寄存器
寄存器編號(hào)基 本 作 用特 殊 用 途
0ID編號(hào)(只讀)ID和Cache類型
1控制位各種控制位
2存儲(chǔ)器保護(hù)和控制MMU:地址轉(zhuǎn)換表基地址
PU:Cache屬性設(shè)置
3內(nèi)存保護(hù)和控制MMU:域訪問(wèn)控制
PU:寫緩存控制
4內(nèi)存保護(hù)和控制保留
5內(nèi)存保護(hù)和控制MMU:錯(cuò)誤狀態(tài)
PU:訪問(wèn)權(quán)限控制
6內(nèi)存保護(hù)和控制MMU:錯(cuò)誤狀態(tài)
PU:保護(hù)區(qū)域控制
7Cache和寫緩存Cache和寫緩存控制
8內(nèi)存保護(hù)和控制MMU:TLB控制
PU:保留
9Cache和寫緩存Cache鎖定
續(xù)表
寄存器編號(hào)基 本 作 用特 殊 用 途
10內(nèi)存保護(hù)和控制MMU:TLB鎖定
PU:保留
11保留保留
12保留保留
13進(jìn)程ID進(jìn)程ID
14保留保留
15芯片生產(chǎn)廠商定義芯片生產(chǎn)廠商定義
15.1.3 寄存器c0
寄存器c0包含的是ARM本身或芯片生產(chǎn)廠商的一些標(biāo)識(shí)信息。當(dāng)使用MRC指令讀c0寄存器時(shí),根據(jù)第二個(gè)操作碼opcode2的不同,讀出的標(biāo)識(shí)符也是不同的。操作碼與標(biāo)識(shí)符的對(duì)應(yīng)關(guān)系如表15.2所示。寄存器c0是只讀寄存器,當(dāng)用MCR指令對(duì)其進(jìn)行寫操作時(shí),指令的執(zhí)行結(jié)果不可預(yù)知。
表15.2 操作碼和標(biāo)識(shí)符的對(duì)應(yīng)關(guān)系
操作碼opcode2對(duì)應(yīng)的標(biāo)識(shí)符寄存器
0b000主標(biāo)識(shí)符寄存器
0b001Cache類型寄存器
其他保留
在操作碼opcode2的取值中,主標(biāo)識(shí)符(opcode2=0)是強(qiáng)制定義的,其他標(biāo)識(shí)符由芯片的生產(chǎn)廠商定義。如果操作碼opcode2指定的值未定義,指令將返回主標(biāo)識(shí)符。其他標(biāo)識(shí)符的值應(yīng)與主標(biāo)識(shí)符的值不同,可以由軟件編程來(lái)實(shí)現(xiàn),同時(shí)讀取主標(biāo)識(shí)符和其他標(biāo)識(shí)符,并將兩者的值進(jìn)行比較。如果兩個(gè)標(biāo)識(shí)符值相同,說(shuō)明未定義該標(biāo)識(shí)符;如果兩個(gè)標(biāo)識(shí)符值不同,說(shuō)明定義了該標(biāo)識(shí)符,并且得到該標(biāo)識(shí)符的值。
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- 使用TMS320C6416協(xié)處理器:Turbo協(xié)處理器(TCP)
- 使用TMS320C6416協(xié)處理器:Viterbi協(xié)處理器(VCP)
- 基于ARM處理器的TFT-LCD顯示系統(tǒng) 34次下載
- 基于ARM處理器的禽舍環(huán)境監(jiān)控系統(tǒng) 31次下載
- 鴻蒙內(nèi)核內(nèi)存實(shí)現(xiàn)涉及哪些匯編代碼 14次下載
- ARM處理器內(nèi)核的詳細(xì)資料概述 15次下載
- AM1707 ARM微處理器英文原版資料詳細(xì)概述 0次下載
- Xeon Phi協(xié)處理器的功耗測(cè)量 0次下載
- 初識(shí)ARM系列處理器 3次下載
- 協(xié)處理器群以小博大Cortex_A15的大小核戰(zhàn)略 5次下載
- 淺談ARM處理器基礎(chǔ)知識(shí) 16次下載
- 多核處理器中的超越函數(shù)協(xié)處理器設(shè)計(jì) 2次下載
- 微機(jī)原理--數(shù)學(xué)協(xié)處理器 0次下載
- ARM微處理器的編程模型
- 簡(jiǎn)述協(xié)處理器發(fā)展歷程及前景展望
- 淺談DSSHA1可綜合SHA-1協(xié)處理器 1533次閱讀
- ARM協(xié)處理器接口 1509次閱讀
- 淺談arm處理器的優(yōu)勢(shì) 1.2w次閱讀
- 協(xié)處理器的介紹及應(yīng)用 4136次閱讀
- 解決CPU異常的功臣_系統(tǒng)控制協(xié)處理器的全定制設(shè)計(jì) 2594次閱讀
- arm的協(xié)處理器有幾個(gè)?ARM協(xié)處理器詳解 8996次閱讀
- 驍龍835有協(xié)處理器嗎 6484次閱讀
- 有哪些手機(jī)內(nèi)置了協(xié)處理器_五款內(nèi)置協(xié)處理器的手機(jī)介紹 1.6w次閱讀
- 手機(jī)上的協(xié)處理器有什么作用_蘋果協(xié)處理器是干什么的 2.1w次閱讀
- 淺談ARM處理器的特點(diǎn)和體系結(jié)構(gòu) 1.7w次閱讀
- HBase的協(xié)處理器開發(fā)編碼實(shí)例 1895次閱讀
- 協(xié)處理器的三大類數(shù)據(jù)傳送指令 2182次閱讀
- 怎樣將GPU作為CPU的協(xié)處理器工作 1.1w次閱讀
- 協(xié)處理器是什么_intel協(xié)處理器有什么用 2.6w次閱讀
- 常見的五大ARM存儲(chǔ)器之一:協(xié)處理器CP15 1.5w次閱讀
下載排行
本周
- 1TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 2開關(guān)電源基礎(chǔ)知識(shí)
- 5.73 MB | 6次下載 | 免費(fèi)
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設(shè)計(jì)
- 0.60 MB | 3次下載 | 免費(fèi)
- 5基于FPGA的光纖通信系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 0.61 MB | 2次下載 | 免費(fèi)
- 6基于FPGA的C8051F單片機(jī)開發(fā)板設(shè)計(jì)
- 0.70 MB | 2次下載 | 免費(fèi)
- 751單片機(jī)窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費(fèi)
- 8基于51單片機(jī)的RGB調(diào)色燈程序仿真
- 0.86 MB | 2次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33564次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21548次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
- 0.00 MB | 6653次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537796次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191185次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183278次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論