當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]實(shí)驗(yàn)?zāi)康模簡(jiǎn)⒂肕MU,映射SDRAM的地址空間,操作虛擬地址實(shí)現(xiàn)“點(diǎn)燈大法”,借此掌握MMU的使用。實(shí) 驗(yàn)環(huán)境及說(shuō)明:恒頤S3C2410開發(fā)板H2410。H2410核心板擴(kuò)展有64MB的K4S561632 SDRAM(4M*16bit*4BANK),地址范圍是0x30

實(shí)驗(yàn)?zāi)康模簡(jiǎn)⒂肕MU,映射SDRAM的地址空間,操作虛擬地址實(shí)現(xiàn)“點(diǎn)燈大法”,借此掌握MMU的使用。

實(shí) 驗(yàn)環(huán)境及說(shuō)明:恒頤S3C2410開發(fā)板H2410。H2410核心板擴(kuò)展有64MB的K4S561632 SDRAM(4M*16bit*4BANK),地址范圍是0x30000000~0x33FFFFFF。GPIO端口的地址范圍是 0x56000000~0X560000B0。

實(shí) 驗(yàn)思路:開發(fā)板上電啟動(dòng)后,自動(dòng)將NandFlash開始的4K數(shù)據(jù)復(fù)制到SRAM中,然后跳轉(zhuǎn)到0地址開始執(zhí)行,然后初始化存儲(chǔ)控制器SDRAM,把 2K后的代碼從SRAM中復(fù)制到SDRAM中(存放在0x30004000,前16KB用來(lái)存放頁(yè)表)、設(shè)置頁(yè)表、啟動(dòng)MMU實(shí)現(xiàn)虛擬地址映射GPIO寄 存器和SDRAM,最后跳轉(zhuǎn)到SDRAM中(地址0xB0004000)運(yùn)行。重新設(shè)置棧指針,跳到點(diǎn)燈代碼的入口點(diǎn)實(shí)現(xiàn)點(diǎn)燈操作。

知識(shí)掌握:MMU地址轉(zhuǎn)換、內(nèi)存訪問(wèn)權(quán)限檢查、TLB及Cache的使用
一、MMU地址轉(zhuǎn)換:
1. 首先弄清除為什么要使用MMU納?MMU即內(nèi)存管理單元,直白一點(diǎn)的講,就像食堂的餐具,所有的學(xué)生一起吃飯時(shí)不夠用,但食堂又不想再出資購(gòu)買新的餐具 (原因很明顯:一方面要成本,另一方面又占地方。這就像增加內(nèi)存一樣),那么有沒(méi)有解決辦法?根據(jù)以往經(jīng)驗(yàn)得知不可能全學(xué)校的學(xué)習(xí)一起都到食堂吃飯,于是 食堂就找?guī)讉€(gè)人負(fù)責(zé)餐具的管理(相當(dāng)于MMU),他們一方面發(fā)放餐具,保證來(lái)的同學(xué)有餐具可用,另一方面又回收用完的餐具(這就相當(dāng)于虛擬地址到物理地址 之間建立了一個(gè)映射一樣,內(nèi)存還是那么多,但從任意單個(gè)程序角度都好像用不完一樣)。當(dāng)然如果有同學(xué)一個(gè)人拿好幾套餐具肯定不允許的(這就相當(dāng)于內(nèi)存的權(quán) 限檢查)。MMU在地址轉(zhuǎn)換過(guò)程中涉及到三種地址:(VA---Virtual Address,虛擬地址)---這個(gè)就相當(dāng)于餐具存放的地方(大家都可以領(lǐng)到餐具)。CPU核心看到和用到的只是虛擬地址VA,至于VA如果去對(duì)應(yīng)物理 地址PA,CPU核心不理會(huì),大家也不會(huì)去關(guān)心總共有多少餐具吧;(MVA---Modified Virtual Address,變換后的虛擬地址)---這個(gè)相當(dāng)于放假的時(shí)候,人很少,只發(fā)餐具好了,用過(guò)的就不先回收了,節(jié)省人員了。Caches和MMU看不到 VA,他們利用MVA轉(zhuǎn)換得到PA,放假了回收餐具的人也不需要一直尋找用完的餐具;(PA---Physical Address,物理地址)---實(shí)際的餐具量,就那些。實(shí)際設(shè)備看不到VA、MVA,讀寫它們使用的是物理地址PA,同學(xué)們就餐一般會(huì)領(lǐng)到餐具。
2. 虛擬地址到物理地址的轉(zhuǎn)換過(guò)程。ARM使用頁(yè)表來(lái)進(jìn)行轉(zhuǎn)換,S3C2410最多會(huì)用到兩級(jí)頁(yè)表,以段(Section,1M)的方式進(jìn)行轉(zhuǎn)換時(shí)只用到一級(jí) 頁(yè)表,以頁(yè)(Page)的方式進(jìn)行轉(zhuǎn)換時(shí)用到兩級(jí)頁(yè)表。頁(yè)的大小有3種:大頁(yè)(64KB)、小頁(yè)(4KB)和極小頁(yè)(1KB)。本文只是以段地址轉(zhuǎn)換過(guò)程 為例來(lái)講解一下,頁(yè)的轉(zhuǎn)換大同小異。
★首先有個(gè)頁(yè)表基址寄存器(位置為協(xié)處理器CP15的寄存器C2),它里面寫入的就是一級(jí)頁(yè)表的地址,通過(guò)讀 取它就可以找到一級(jí)頁(yè)表存放的起始位置。一級(jí)頁(yè)表的地址是16K對(duì)齊(所以[13:0]為0,使用[31:14]存儲(chǔ)頁(yè)表基址)。一級(jí)頁(yè)表使用4096個(gè) 描述符來(lái)表示4GB空間,所以每個(gè)描述符對(duì)應(yīng)1MB的虛擬地址,存儲(chǔ)它對(duì)應(yīng)的1MB物理空間的起始地址,或者存儲(chǔ)下一級(jí)頁(yè)表的地址。使用 MVA[31:20]來(lái)索引一級(jí)頁(yè)表(31-20一共12位,2^12=4096,所以是4096個(gè)描述符),得到一個(gè)描述符,每個(gè)描述符占4個(gè)字節(jié)。
★ 描述符最后兩位為0B10時(shí),即是段的方式映射。[31:20]為段基址,此描述符低20位填充0后就是一塊1MB物理地址空間的起始地址。 MVA[19:0]用來(lái)在這1MB空間中尋址。描述符的位[31:20]和MVA[19:0]構(gòu)成了這個(gè)虛擬地址MVA對(duì)應(yīng)的物理地址。以段的方式進(jìn)行映 射時(shí),虛擬地址MVA到物理地址PA的轉(zhuǎn)換過(guò)程如下:①頁(yè)表基址寄存器位[31:14]和MVA[31:20]組成一個(gè)低兩位為0的32位地址,MMU利 用這個(gè)地址找到段描述符;②取出段描述符的位[31:20](段基址),它和MVA[19:0]組成一個(gè)32位的物理地址(這就是MVA對(duì)應(yīng)的PA)。

'700')this.width='700';if(this.offsetHeight>'700')this.height='700';" src="http://www.arm79.com/attachment/Mon_1005/73_67_c19a93f3ccea9b3.jpg" onclick="if(this.width>=700) window.open('http://www.arm79.com/attachment/Mon_1005/73_67_c19a93f3ccea9b3.jpg');" border="0" width="700">

'700')this.width='700';if(this.offsetHeight>'700')this.height='700';" src="http://www.arm79.com/attachment/Mon_1005/73_67_ba0dd29d824d17a.jpg" onclick="if(this.width>=700) window.open('http://www.arm79.com/attachment/Mon_1005/73_67_ba0dd29d824d17a.jpg');" border="0" width="700">
二、內(nèi)存的訪問(wèn)權(quán)限檢查
內(nèi) 存的訪問(wèn)權(quán)限檢查決定一塊內(nèi)存是否允許讀/寫。這由CP15寄存器C3(域訪問(wèn)控制)、描述符的域(Domain)、CP15寄存器C1的R/S/A位和 描述符的AP位共同決定。“域”決定是否對(duì)某塊內(nèi)存進(jìn)行權(quán)限檢查,"AP"決定如何對(duì)某塊內(nèi)容進(jìn)行權(quán)限檢查。S3C2440有16個(gè)域,CP15寄存器 C3中每?jī)晌粚?duì)應(yīng)一個(gè)域(一共32位),用來(lái)表示這個(gè)域是否進(jìn)行權(quán)限檢查。
每?jī)晌粩?shù)據(jù)的含義:00---無(wú)訪問(wèn)權(quán)限(任何訪問(wèn)都將導(dǎo) 致"Domain fault"異常);01---客戶模式(使用段描述符、頁(yè)描述符進(jìn)行權(quán)限檢查);10---保留(保留,目前相當(dāng)于“無(wú)訪問(wèn)權(quán)限”);11---管理模 式(不進(jìn)行權(quán)限檢查,允許任何訪問(wèn))。"Domain"占用4位,用來(lái)表示內(nèi)存屬于0-15哪一個(gè)域。
三、TLB和Cache
首先說(shuō)兩者都是利用程序訪問(wèn)的局部性原理,通過(guò)設(shè)置高速、小容量的存儲(chǔ)器來(lái)提高性能。
1.(TLB---Translation Lookaside Buffers,轉(zhuǎn)譯查找緩存):由于從MVA到PA的轉(zhuǎn)換需要訪問(wèn)多次內(nèi)存,大大降低了CPU的性能,故提出TLB辦法改進(jìn)。當(dāng)CPU發(fā)出一個(gè)虛擬地址 時(shí),MMU首先訪問(wèn)TLB。如果TLB中含有能轉(zhuǎn)換這個(gè)虛擬地址的描述符,則直接利用此描述符進(jìn)行地址轉(zhuǎn)換和權(quán)限檢查,否則MMU訪問(wèn)頁(yè)表找到描述符后再 進(jìn)行地址轉(zhuǎn)換和權(quán)限檢查,并將這個(gè)描述符填入TLB中,下次再使用這個(gè)虛擬地址時(shí)就直接使用TLB用的描述符。使用TLB需要保證TLB中的內(nèi)容與頁(yè)表一 致,在啟動(dòng)MMU之前,頁(yè)表中的內(nèi)容發(fā)生變化后,尤其要注意。一般的做法是在啟動(dòng)MMU之前使整個(gè)TLB無(wú)效,改變頁(yè)表時(shí),使所涉及的虛擬地址對(duì)應(yīng)的 TLB中條目無(wú)效。
2.(Cache,高速緩存):為提高程序的運(yùn)行速度,在主存和CPU通用寄存器之間設(shè)置一個(gè)高速的、容量相對(duì)較小的存儲(chǔ)器,把正在執(zhí)行的指令地址附近的一部分指令或數(shù)據(jù)從主存調(diào)入這個(gè)存儲(chǔ)器,供CPU在一段時(shí)間內(nèi)使用。
★ 寫數(shù)據(jù)的兩種方式:①(Write Through,寫穿式)---任一CPU發(fā)出寫信號(hào)送到Cache的同時(shí),也寫入主存,保證主存的數(shù)據(jù)同步更新。優(yōu)點(diǎn)是操作簡(jiǎn)單,但由于主存速度慢,降 低了系統(tǒng)的寫速度并占用了總線的時(shí)間。②(Write Back,回寫式)---數(shù)據(jù)一般只寫到Cache,這樣可能出現(xiàn)Cache中的數(shù)據(jù)得到更新而主存中的數(shù)據(jù)不變(數(shù)據(jù)陳舊)的情況。此時(shí)可在Cache 中設(shè)一個(gè)標(biāo)志地址及數(shù)據(jù)陳舊的信息,只有當(dāng)Cache中的數(shù)據(jù)被換出或強(qiáng)制進(jìn)行”清空“操作時(shí),才將原更新的數(shù)據(jù)寫入主存響應(yīng)的單元中,保證了Cache 和主存中數(shù)據(jù)一致。
★Cache有以下兩個(gè)操作:①(Clean,清空)---把Cache或Write buffer中已經(jīng)臟的(修改過(guò),但未寫入主存)數(shù)據(jù)寫入主存。②(Invalidate,使無(wú)效)---使之不能再使用,并不將臟的數(shù)據(jù)寫入主存。
★S2C2440 內(nèi)置了(ICaches,指令Cache)、(DCaches,數(shù)據(jù)Cache)和(Write buffer,寫緩存),操作時(shí)需要用到描述符中的C位(Ctt)和B位(Btt)。①(ICaches,指令Cache)---系統(tǒng)剛上電或復(fù)位 時(shí),ICaches中的內(nèi)容是無(wú)效的,并且ICaches功能關(guān)閉。往Icr位(CP15協(xié)處理器中寄存器1的第12位)寫1可以啟動(dòng)ICaches,寫 0停止ICaches。ICaches一般在MMU開啟后使用,此時(shí)描述符的C位用來(lái)表示一段內(nèi)存是否可以被Cache。若Ctt=1,允許Cache, 否則不允許。如果MMU沒(méi)有開啟,ICaches也可以被使用,此時(shí)CPU讀取指令時(shí)所涉及的內(nèi)存都被當(dāng)做允許Cache。ICaches關(guān)閉時(shí),CPU 每次取指都要讀取主存,性能低,所以通常盡早啟動(dòng)ICaches。ICaches開啟后,CPU每次取指時(shí)都會(huì)先在ICaches中查看是否能找到所用指 令,而不管Ctt是0還是1。如果找到成為Cache命中,找不到稱為Cache丟失,ICaches被開啟后,CPU的取指有如下三種情況:Cache 命中且Ctt為1時(shí),從ICaches中取指,返回CPU;Cache丟失且Ctt為1時(shí),CPU從主存中取指,并且把指令緩存到Cache中;Ctt為 0時(shí),CPU從主存中取指。②(DCaches,數(shù)據(jù)Cache)---與ICaches相似,系統(tǒng)剛上電或復(fù)位時(shí),DCaches中的內(nèi)容無(wú)效,并且 DCaches功能關(guān)閉,Write buffer中的內(nèi)容也是被廢棄不用的。往Ccr位(CP15協(xié)處理器 中寄存器1的第二位)寫1啟動(dòng)DCaches,寫0停止DCaches。Write buffer和DCaches緊密結(jié)合,額米有專門的控制來(lái)開啟和停止它。與ICaches不同,DCaches功能必須在MMU開啟之后才能被使用。 DCaches被關(guān)閉時(shí),CPU每次都去內(nèi)存取數(shù)據(jù)。DCaches被開啟后,CPU每次讀寫數(shù)據(jù)時(shí)都會(huì)先在DCaches中查看是否能找到所要的數(shù)據(jù), 不管Ctt是0還是1,找到了稱為Cache命中,找不到稱為Cache丟失。
★使用Cache時(shí)需要保證Cache、Write buffer的內(nèi)容和主存內(nèi)容一致,保證下面兩個(gè)原則:①清空DCaches,使主存數(shù)據(jù)得到更新。②使無(wú)效ICaches,使CPU取指時(shí)重新讀取主存。
在 實(shí)際編寫程序時(shí),要注意如下幾點(diǎn):①開啟MMU前,使無(wú)效ICaches,DCaches和Write buffer。②關(guān)閉MMU前,清空ICaches、DCaches,即將“臟”數(shù)據(jù)寫到主存上。③如果代碼有變,使無(wú)效ICaches,這樣CPU取指 時(shí)會(huì)從新讀取主存。④使用DMA操作可以被Cache的內(nèi)存時(shí):將內(nèi)存的數(shù)據(jù)發(fā)送出去時(shí),要清空Cache;將內(nèi)存的數(shù)據(jù)讀入時(shí),要使無(wú)效Cache。⑤ 改變頁(yè)表中地址映射關(guān)系時(shí)也要慎重考慮。⑥開啟ICaches或DCaches時(shí),要考慮ICaches或DCaches中的內(nèi)容是否與主存保持一致。⑦ 對(duì)于I/O地址空間,不使用Cache和Write buffer。
四、MMU、TLB及Cache的控制指令
S3C2410除了ARM920T的CPU核心外,還有若干個(gè)協(xié)處理器,用來(lái)幫助主CPU完成一些特殊功能,對(duì)MMU、TLB及Cache等的操作就涉及到協(xié)處理器。格式如下:
{條件} 協(xié)處理器編碼,協(xié)處理器操作碼1,目的寄存器,源寄存器1,源寄存器2,協(xié)處理器操作碼2
{cond} p#,,Rd,cn,cm{,}
MRC//從協(xié)處理器獲得數(shù)據(jù),傳給ARM920T CPU核心寄存器
MCR//數(shù)據(jù)從ARM920T CPU核心寄存器傳給協(xié)處理器
{cond}//執(zhí)行條件,省略時(shí)表示無(wú)條件執(zhí)行
p#//協(xié)處理器序號(hào)
//一個(gè)常數(shù)
Rd//ARM920T CPU核心的寄存器
cn和cm//協(xié)處理器中的寄存器
//一個(gè)常數(shù)
其中,、cn、cm、僅供協(xié)處理器使用,它們的作用如何取決于具體的協(xié)處理器。

示例代碼解析:
開 啟MMU,并將虛擬地址0xA0000000~0xA0100000映射到物理地址0x56000000~0x56100000(GPFCON物理地址為 0x56000050,GPFDAT物理地址為0x56000054);將虛擬地址0xB0000000~0xB3FFFFFF映射到物理地址 0x30000000~0x33FFFFFF。本示例以段的方式進(jìn)行地址映射,只使用一級(jí)頁(yè)表,通過(guò)上面內(nèi)容可知一級(jí)頁(yè)表使用4096個(gè)描述符來(lái)表示4G 空間(每個(gè)描述符對(duì)應(yīng)1MB),每個(gè)描述符占4字節(jié),所以一級(jí)頁(yè)表占16KB。使用SDRAM的開始16KB存放一級(jí)頁(yè)表,所以剩下的內(nèi)存開始地址就為 0x30004000,這個(gè)地址最終會(huì)對(duì)應(yīng)虛擬地址0xB0004000(所以代碼運(yùn)行地址為0xB0004000)。
★程序執(zhí)行主要流程的示例代碼。
.text
.global _start
_start:
bldisable_watch_dog @ 關(guān)閉WATCHDOG,否則CPU會(huì)不斷重啟
blmem_control_setup@ 設(shè)置存儲(chǔ)控制器以使用SDRAM
ldr sp, =4096@ 設(shè)置棧指針,以下是C函數(shù)調(diào)用前需要設(shè)好棧
blcopy_2th_to_sdram@ 將第二部分代碼復(fù)制到SDRAM
blcreate_page_table@ 設(shè)置頁(yè)表
blmmu_init@ 啟動(dòng)MMU,啟動(dòng)以后下面代碼都用虛擬地址
ldr sp, =0xB4000000 @ 重設(shè)棧指針,指向SDRAM頂端(使用虛擬地址)
ldr pc, =0xB0004000@ 跳到SDRAM中繼續(xù)執(zhí)行第二部分代碼
halt_loop:
b halt_loop
★設(shè)置頁(yè)表。
void create_page_table(void)
{

/*
* 用于段描述符的一些宏定義:[31:20]段基址,[11:10]AP,[8:5]Domain,[3]C,[2]B,[1:0]0b10為段描述符
*/
#define MMU_FULL_ACCESS (3 << 10) /* 訪問(wèn)權(quán)限AP */
#define MMU_DOMAIN(0 << 5)/* 屬于哪個(gè)域 Domain*/
#define MMU_SPECIAL (1 << 4)/* 必須是1 */
#define MMU_CACHEABLE (1 << 3)/* cacheable C位*/
#define MMU_BUFFERABLE(1 << 2)/* bufferable B位*/
#define MMU_SECTION (2) /* 表示這是段描述符 */
#define MMU_SECDESC (MMU_FULL_ACCESS | MMU_DOMAIN | MMU_SPECIAL | MMU_SECTION)
#define MMU_SECDESC_WB(MMU_FULL_ACCESS | MMU_DOMAIN | MMU_SPECIAL | MMU_CACHEABLE | MMU_BUFFERABLE | MMU_SECTION)
#define MMU_SECTION_SIZE0x00100000/*每個(gè)段描述符對(duì)應(yīng)1MB大小空間*/


unsigned long virtuladdr, physicaladdr;
unsigned long *mmu_tlb_base = (unsigned long *)0x30000000;/*SDRAM開始地址存放頁(yè)表*/

/*
* Steppingstone的起始物理地址為0,第一部分程序的起始運(yùn)行地址也是0, 為了在開啟MMU后仍能運(yùn)行第一部分的程序, 將0~1M的虛擬地址映射到同樣的物理地址
*/
virtuladdr = 0;
physicaladdr = 0;
/*虛擬地址[31:20]用于索引一級(jí)頁(yè)表,找到它對(duì)應(yīng)的描述符,對(duì)應(yīng)于(virtualaddr>>20)。段描述符中[31:20]保存段的物理地址,對(duì)應(yīng)(physicaladdr & 0xFFF00000)*/
*(mmu_tlb_base + (virtuladdr >> 20)) = (physicaladdr & 0xFFF00000) | MMU_SECDESC_WB;

/*
* 0x56000000是GPIO寄存器的起始物理地址,GPBCON和GPBDAT這兩個(gè)寄存器的物理地址0x56000010、0x56000014, 為了在第二部分程序中能以地址0xA0000010、0xA0000014來(lái)操作GPBCON、GPBDAT,
* 把從0xA0000000開始的1M虛擬地址空間映射到從0x56000000開始的1M物理地址空間
*/
virtuladdr = 0xA0000000;
physicaladdr = 0x56000000;
*(mmu_tlb_base + (virtuladdr >> 20)) = (physicaladdr & 0xFFF00000) | MMU_SECDESC;


/*
* SDRAM的物理地址范圍是0x30000000~0x33FFFFFF, 將虛擬地址0xB0000000~0xB3FFFFFF映射到物理地址0x30000000~0x33FFFFFF上, 總共64M,涉及64個(gè)段描述符
*/
virtuladdr = 0xB0000000;
physicaladdr = 0x30000000;
while (virtuladdr < 0xB4000000)
{
*(mmu_tlb_base + (virtuladdr >> 20)) = (physicaladdr & 0xFFF00000) | MMU_SECDESC_WB;
virtuladdr += MMU_SECTION_SIZE;
physicaladdr += MMU_SECTION_SIZE;
}
}
★ 啟動(dòng)MMU。
void mmu_init(void)
{
unsigned long ttb = 0x30000000;


__asm__(
"movr0, #0n"
"mcrp15, 0, r0, c7, c7, 0n"/* 使無(wú)效ICaches和DCaches */

"mcrp15, 0, r0, c7, c10, 4n" /* drain write buffer on v4 */
"mcrp15, 0, r0, c8, c7, 0n"/* 使無(wú)效指令、數(shù)據(jù)TLB */

"movr4, %0n" /* r4 = 頁(yè)表基址 */
"mcrp15, 0, r4, c2, c0, 0n"/* 設(shè)置頁(yè)表基址寄存器 */

"mvnr0, #0n"
"mcrp15, 0, r0, c3, c0, 0n"/* 域訪問(wèn)控制寄存器設(shè)為0xFFFFFFFF, 不進(jìn)行權(quán)限檢查*/
/*
* 對(duì)于控制寄存器,先讀出其值,在這基礎(chǔ)上修改感興趣的位,然后再寫入
*/
"mrcp15, 0, r0, c1, c0, 0n"/* 讀出控制寄存器的值 */

/* 控制寄存器的低16位含義為:.RVI ..RS B... .CAM
* R : 表示換出Cache中的條目時(shí)使用的算法,0 = Random replacement;1 = Round robin replacement
* V : 表示異常向量表所在的位置,0 = Low addresses = 0x00000000;1 = High addresses = 0xFFFF0000
* I : 0 = 關(guān)閉ICaches;1 = 開啟ICaches
* R、S : 用來(lái)與頁(yè)表中的描述符一起確定內(nèi)存的訪問(wèn)權(quán)限
* B : 0 = CPU為小字節(jié)序;1 = CPU為大字節(jié)序
* C : 0 = 關(guān)閉DCaches;1 = 開啟DCaches
* A : 0 = 數(shù)據(jù)訪問(wèn)時(shí)不進(jìn)行地址對(duì)齊檢查;1 = 數(shù)據(jù)訪問(wèn)時(shí)進(jìn)行地址對(duì)齊檢查
* M : 0 = 關(guān)閉MMU;1 = 開啟MMU
*/

/*
* 先清除不需要的位,往下若需要?jiǎng)t重新設(shè)置它們
*/
/* .RVI ..RS B... .CAM */
"bicr0, r0, #0x3000n"/* ..11 .... .... .... 清除V、I位 */
"bicr0, r0, #0x0300n"/* .... ..11 .... .... 清除R、S位 */
"bicr0, r0, #0x0087n"/* .... .... 1... .111 清除B/C/A/M */


/*
* 設(shè)置需要的位
*/
"orrr0, r0, #0x0002n"/* .... .... .... ..1. 開啟對(duì)齊檢查 */
"orrr0, r0, #0x0004n"/* .... .... .... .1.. 開啟DCaches */
"orrr0, r0, #0x1000n"/* ...1 .... .... .... 開啟ICaches */
"orrr0, r0, #0x0001n"/* .... .... .... ...1 使能MMU */

"mcrp15, 0, r0, c1, c0, 0n"/* 將修改的值寫入控制寄存器 */
: /* 無(wú)輸出 */
: "r" (ttb) );
}

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉