一、基本概念
講到這個cache呢,就要先講一些其他東西來幫助我們理解它,首先要明白的是指令週期,什麼是指令週期?
cpu的工作通常就是讀取指令,然後執行指令,周而復始知道down機,所以乙個取指並且執行完指令的所需要的時間就被稱為指令週期,在乙個指令週期內,cpu必然會讀取一次甚至多次指令,而cpu執行速度必然大於從記憶體讀取指令的速度,所以cpu的能力受限於指令讀取速度,為了解決這個問題,我們在記憶體與cpu中間加入了一種預讀指令的機制,就是我們的cache快取記憶體, 將指令從記憶體預讀至快取內,然後cpu又從快取記憶體中讀取指令,當然記憶體與快取之間以塊傳送方式,而快取與cpu之間採用字或位元組傳送,所以快取與cpu之間通訊速度還是大於記憶體與快取,為了平衡這個速度關係,通常cpu與記憶體之間會有多個快取,比如s5pv210有l1和l2兩個快取記憶體。
當然扯點題外話,根據這種設計思路我們可以發現,cpu是不是類似於乙個消費者,而記憶體是否類似於乙個生產者,當生產者速度小於消費者的消費速度的時候,我們是不是就可以採用快取在解決類似的問題?當然大多數時候,我們也是這樣做的。
反之,如果消費者消費速度小於生產者呢?
這就意味著你可以將生產者的陳本再降低一些,就例如如果我有個女朋友,例如哈,當然我是沒有的,程式猿怎麼可能有女朋友嘛。如果我一分鐘削一百個蘋果,而我女朋友一分鐘吃五十個蘋果,那麼我就生產過剩了,怎麼辦?通常換一把便宜點的撇點的刀來降低我的生產力就好了,對吧,媽的,我編不下去了,咦,怎麼可以做到1分鐘削一百個蘋果呢,只要你有單身的手速,可以的。
二、實驗
c**,沒錯,仍然是點燈。
#define gpj2con (*(volatile unsigned long *)
0xe0200280)
#define gpj2dat (*(volatile unsigned long *)
0xe0200284)
void delay(unsigned long count)
void led_blink()
}
彙編**
主要就是使能與關閉cache
.global _start
_start:
//關閉看門狗
ldr r0, =0xe2700000
movr1, #0
str r1, [r0]
#ifdef config_sys_icache_off
bic r0, r0, #0x00001000
#else
// set bit 12 (i) i-cache
orr r0, r0, #0x00001000
#endif
mcr p15, 0, r0, c1, c0, 0
ldr sp, =0xd0037d80
bl led_blink
halt:
b halt
這裡有一段協處理器操作
bic r0, r0, #0x00001000 將第十三位清0,可看成與
orr r0, r0, #0x00001000 設定第十三位,可看成或
mcr p15 0 r0 c1 c0 0 將r0值傳入c1協處理器
協處理器程式設計是一大方面,改天有時間再寫。
通過比較使能cache與關閉cache我們可以看到,使能cache的情況下,明顯的led閃爍的速度要快很多,所以這就是快取記憶體的作用。
詳細**見git上bareos中的cache目錄
S5PV210 裸機中斷
這裡我以外部中斷為例畫出了中斷響應的過程。當外部中斷得到響應,會由硬體自動轉到異常向量表,執行對應的異常處理程式。在這裡指的就是irq的處理程式。在異常處理程式irq handle中將會執行現場的保護與恢復,以及最重要的中斷處理函式 注意,這裡就來到了中斷處理部分,而不是異常處理了,相當於是乙個兩級...
S5PV210控制蜂鳴器
s5pv210帶有乙個蜂鳴器,十分吵鬧,本章將學習如何控制蜂鳴器。相關引腳 蜂鳴器的操作十分簡單,原理跟操作led一樣,通過控制gpdo o這個引腳就可以達到控制蜂鳴器的目的。1.start.s start.s做了下面3件事 第一步 關看門狗 第二步 設定棧,以便呼叫c函式 第三步 呼叫main函式...
S5PV210控制蜂鳴器
s5pv210帶有乙個蜂鳴器,十分吵鬧,本章將學習如何控制蜂鳴器。相關引腳 蜂鳴器的操作十分簡單,原理跟操作led一樣,通過控制gpdo o這個引腳就可以達到控制蜂鳴器的目的。1.start.s start.s做了下面3件事 第一步 關看門狗 第二步 設定棧,以便呼叫c函式 第三步 呼叫main函式...