來源:百問網_嵌入式Linux wiki_jz2440 新1期視頻維基教程 (視頻文字版)
作者:韋東山
本文字數:1719,閱讀時長:2分鐘
如果對MMU ICache有所了解或者知道其概念作用,那麼這節課可以跳過,我們很少會使用MMU或ICache
在2440芯片裡面除了CPU之外, Instruction MMU 指令MMU;
Data MMU 數據MMU;
InstructionC ACHE(16KB) 指令cache;
Data CACHE (16KB) 數據cache
全都通過CP15協處理器來進行操作這些
協處理器的含義作用 coprocessor協助主處理器做某些事情, 比如在ARM系統中有cp0 – cp15一共16個協處理器,其中cp15負責管理mmu icache
寫一個程序,0到100求和
int sum() { int I; int sum =0; for(i=0; I <= 100; i ) sum = I; return sum; }
查看反彙編代碼
局部變量保存在棧中,也就是内存
70: e50b3014 str r3, [fp,#-20] //這個應該就是sum 假設地址是A 78: e50b3010 str r3, [fp, #-16] //這個應該就是I 假設地址是B ldr r3, [fp, #-16] //也就是地址B中取出值 cmp r3, #100 //跟100比較 //如果大于100程序跳到 a8 如果小于100則執行下面的for循環 從7c: 到 a4 指令保存在内存中,CPU根據這些執行進行操作
1 不斷的讀寫地址A和B
2 不斷的執行for循環裡面代碼
2.1 取指令
2.2 執行指令
問SDRAM非常慢,那麼怎麼提高程序執行效率? 先引入一個概念,程序局部性原理
- 時間局部性:在同一段時間裡,有極大的概率訪問同一地址的指令或數據
(在這個for循環中同一個地址指令經常被訪問到)
- 空間局部性: 有極大概率訪問到相鄰空間的指令/數據
我們在一個比較慢的SDRAM上能不能在CPU上開一個高速緩存,把這些指令放進高速緩存icache
指令cache隻有16KB 數據cache也隻有16KB 而我們的SDRAM有64MB空間,顯然擦車不可能存儲SDRAM中所有的内容,它隻能存儲一部分
cache的示意圖
以數據開始為例
- 1 程序要讀地址A的數據
ldr r0, [A的數據]
a. cpu以地址A查找cache,一開始cache無數據,導緻cache miss
返回一系列的數據,叫做cache line: 8word 32byte
b. cpu把地址A發到SDRAM,讀入cache line,成為cache file 把地址A上的數據返回給CPU 2 程序再次讀取地址A的數據 a cpu以地址A查找cache,cache hit有數據直接從cache返回數據給CPU
3 程序要讀地址B的數據,CPU也是以地址B查找數據,cache hint直接返回
4 cache滿了,CPU訪問C a cache替換,置換老的數據 b 填充新數據
數據寫
write buffer
查看2410芯片手冊 附錄 appendix4-caches, write buffer 585頁
設置為NCNB (no cache no buffer)數據直接到達硬件不經過緩沖器
比如GPFDAT寄存器CPU讀寄存器的時候想讀到引腳狀态,不應該從cache讀取老的數據,而是不斷直接訪問硬件返回最新的數據 對于這些寄存器應該設置為NCNB
不使用cache但數據寫到buffer中,CPU就不管了 由write buffer直接進行寫操作 CPU直接操作下一條指令
- 第一種不使用cache buffer 适用于直接硬件操作 gpio 得到最新數據
- 第二種 不使用cache使用write buffer, cpu把寫發給buffer,cpu就可以直接下一條指令
- 第三種 WT 寫通方式 使用cache不使用buffer,馬上寫硬件
CPU直接寫給write buffer 由write執行緩慢寫操作
- 第四種 寫回方式
miss: cpu數據直接到達write buffer hit: cpu數據寫入cache标記為dirty,讓後會在合适的時機由write buffer寫給硬件
- 合适的時機
cache替換時dirty會寫給write buffer寫給硬件
或者強制Flash cache 寫給write buffer 寫給硬件
下節講協處理指令
「新品首發」STM32MP157開發闆火爆預售!首批僅300套
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!