Tiny4412裸機程序之操做ICache

1、首先普及一下什麼是Cache

基於程序訪問的侷限性,在主存和CPU通用寄存器以前設置了一類高速的、容量較小的存儲器,把正在執行的指令地址附件的一部分指令或數據從主存調入這類存儲器,供CPU在一段時間內使用,這對提升程序的運行速度有很大的做用。這類介於主存和CPU之間的高速小容量存儲器稱做高速cache。比較常見的cache包括icache和dcache。服務器

icache的使用比較簡單,系統剛上電時,icache中的內容是無效的,而且icache的功能是關閉的,往CP15協處理器中的寄存器1的bit[12]寫1能夠啓動icache,寫0能夠中止icache。icache關閉時,CPU每次取指都要讀主存,性能很是低。由於icache可隨時啓動,越早開icache越好。與icache類似,系統剛上電時, dcache中的內容是無效的,而且dcache的功能是關閉的,往CP15協處理器中的寄存器1的bit[2]寫1能夠啓動dcache,寫0能夠中止dcache。由於 dcache必須在啓動mmu後才能被啓動,而對於裸機而言,不必開mmu,因此本教程的程序將不會啓動dcache。工具

2、再介紹一下ARM協處理器CP15及MCR和MRC指令  

在基於ARM的嵌入式應用系統中,存儲系統一般是經過系統控制協處理器CP15完成的。CP15包含16個32位的寄存器,其編號爲0~15。性能

訪問CP15寄存器的指令spa

  • MCR   ARM寄存器到協處理器寄存器的數據傳送
  • MRC   協處理器寄存器到ARM寄存器的數據傳送

MCR指令和MRC指令只能在處理器模式爲系統模式時執行,在用戶模式下執行MCR指令和MRC指令將會觸發未定義指令的異常中斷。code

①MCR指令教程

MCR指令將ARM處理器的寄存器中的數據傳送到協處理器寄存器中。若是協處理器不能成功地執行該操做,將產生未定義的指令異常中斷。ci

指令語法格式:文件上傳

MCR{<cond>} <p>,< opcode_1>,<Rd>,<CRn>,<CRm>{,<opcode_2>}
MCR{<cond>} p15,0,<Rd>,<CRn>,<CRm>{,<opcode_2>}

其中,<cond>爲指令執行的條件碼。當<cond>忽略時指令爲無條件執行。it

< opcode_1>爲協處理器將執行的操做的操做碼。對於CP15協處理器來講,< opcode_1>永遠爲0b000,當< opcode_1>不爲0b000時,該指令操做結果不可預知。io

<Rd>做爲源寄存器的ARM寄存器,其值將被傳送到協處理器寄存器中。

<CRn>做爲目標寄存器的協處理器寄存器,其編號多是C0,C1,…,C15。

<CRm>和<opcode_2>二者組合決定對協處理器寄存器進行所須要的操做,若是沒有指定,則將爲<CRm>爲C0,opcode_2爲0,不然可能致使不可預知的結果。

The CRm field and opcode_2 field are used to specify a particular action when addressing registers.The opcode_1, opcode_2 and CRm fields should be zero, except when the values specified are used to select the desired operations, in all instructions which access CP15. Using other values will result in unpredictable behavior. Attempting to read from a non-readable register, or writing to a non-writable register will cause unpredictable results.

使用示例:

下面的指令從ARM寄存器R4中中將數據傳送到協處理器CP15的寄存器C1中。其中R4爲ARM寄存器,存放源操做數,C一、C0爲協處理器寄存器,爲目標寄存器,opcode_1爲0,opcode_2爲0。

MCR  p15,  0,  R4,  C1,  C0,  0

②MRC指令

MRC指令將協處理器的寄存器中的數值傳送到ARM處理器的寄存器中、若是協處理器不能成功地執行該操做,將產生未定義的指令異常中斷。

指令語法格式:

MRC{<cond>} <p>,< opcode_1>,<Rd>,<CRn>,<CRm>{,<opcode_2>}
MRC{<cond>} p15,0,<Rd>,<CRn>,<CRm>{,<opcode_2>}

參數用法同MCR指令

先介紹到這裏,等着開一篇文章專門介紹CP15協處理器的寄存器

3、程序說明

從這一小節開始,咱們加入本身關閉看門狗的代碼,儘管IROM已經這樣作了:

// 關閉看門狗
ldr r0, =0x10060000
mov r1, #0
str r1, [r0]

基於上一個實驗的程序,其餘文件不動,咱們只改變start.S文件,增長以下代碼:

mrc p15, 0, r0, c1, c0, 0
orr r0, r0, #0x00001000
mcr p15, 0, r0, c1, c0, 0

這樣就打開了ICache。

4、程序編譯及燒寫

1.編譯

經過FTP或者其餘工具將文件上傳到服務器上去,輸入make命令進行編譯將獲得open_ichche.bin文件。

2.燒寫

將SD卡插入電腦,並讓VmWare裏的Ubuntu識別出來,而後執行以下命令:

sudo ./sd_fusing.sh /dev/sdb ../7_open_icache/open_icache.bin

5、上電實驗

你會發現LED閃動的頻率和上一個實驗徹底相同,爲何呢?由於IROM的固化代碼已經幫咱們啓動了icache,若是咱們要想體驗icache 的威力,只需修改start.S文件爲如下便可:

// 打開icache可提升運行速度
mrc p15, 0, r0, c1, c0, 0
//orr r0, r0, #0x00001000 //打開ICache
bic r0, r0, #0x00001000 //關閉ICache
mcr p15, 0, r0, c1, c0, 0

而後從新編譯、燒寫、上電運行,你會發現LED的閃動頻率慢了不少不少,由此就能夠看到ICache的強大威力!!

相關文章
相關標籤/搜索