• <tbody id="wslfv"><pre id="wslfv"></pre></tbody>
    <span id="wslfv"></span>
    <tbody id="wslfv"><pre id="wslfv"></pre></tbody>
    <th id="wslfv"><track id="wslfv"><rt id="wslfv"></rt></track></th>

    <li id="wslfv"><acronym id="wslfv"></acronym></li>
    更多課程 選擇中心

    嵌入式培訓
    達內IT學院

    400-111-8989

    你還沒明白嵌入式ARM的MMU和Cache機制?

    • 發布:嵌入式培訓
    • 來源:嵌入式問答
    • 時間:2017-08-17 11:48

    Cache是高性能CPU解決總線訪問速度瓶頸的方法,然而它的使用卻是需要權衡的,因為緩存本身的動作,如塊拷貝和替換等,也是很消耗CPU時間的。MMU的重要性勿庸置疑,ARM920T(和ARM720T)集成了MMU是其最大的賣點;有了MMU,高級的操作系統(虛擬地址空間,平面地址,進程保護等)才得以實現。二者都挺復雜,并且在920T中又高度耦合,相互配合操作,所以需要結合起來研究。同時,二者的操作對象都是內存,內存的使用是使用MMU/Cache的關鍵。另外,MMU和Cache的控制寄存器不占用地址空間,CP15是操縱MMU/Cache的唯一途徑。

    Cache/Write Buffer的功

    Cache通過預測CPU即將要訪問的內存地址(一般都是順序的),預先讀取大塊內存供CPU訪問,來減少后續的內存總線上的讀寫操作,以提高速度。然而,如果程序中長跳轉的次數很多,Cache的命中率就會顯著降低,隨之而來,大量的替換操作發生,于是,過多的內存操作反而降低了程序的性能。

    ARM920T內部采用哈佛結構,將內部指令總線和數據總線分開,分別連接到ICache和DCache,再通過AMBA(高級微控制器總線結構)總線接口連接到ASB總線上去訪問內存。Cache由Line組成,Line是Cache進行塊讀取和替換的單位。

    Writer Buffer是和DCache相逆過程的一塊硬件,目的也是通過減少memory bus的訪問來提高性能。

    MMU的功能

    在內存中維護一張或幾張表,就看你怎么給內存劃分page和section了。通過CP15指定好轉換表的位置,920T的硬件會自動將轉換表的一部分讀到TLB中。CPU每次進行內存讀寫時,發出虛擬地址,參照TLB中的轉換表轉換到物理地址,并讀取相應entry中的信息,以決定是否可以有權限讀寫和緩存。

    mmugen這個工具就是幫你構造這個表的,省的自己寫程序了。

    操作MMU,實際上就是如何分配和使用你的內存,并記錄在translationtable里。

    ARM920T中,MMU的每條entry包括Cachable和Buffable位來指定相應的內存是否可以用Cache緩存。此處就是MMU與Cache的交互作用處。

    實際上,MMU和Cache的使用是操作系統設計者根據系統軟硬件配置而考慮的事情。操作系統針對分配給應用程序的地址空間作內存保護和緩存優化。在沒有操作系統的情況下,就需要我們自己來掌控它們了。其中,主要是合理分配內存。

    我認為,以下幾點需要著重考慮:

    1) 安全第一! -- 避免MMU和Cache的副作用。

    當你在無OS的裸機上開發程序時,初始化運行環境的代碼很重要,比如:各種模式堆棧指針的初始化;將代碼和RW data從ROM拷貝到RAM;初始化.bss段(zero initialized)空間等。此時會有大量的內存操作,如果你enable了Cache,那么在拷貝完代碼之后,一定要invalidate ICache和flush DCache。否則將會出現緩存中的代碼或數據與內存中的不一致,程序跑飛。

    另外,有時候我們需要自己作loader來直接運行ELF文件,情況也是一樣,拷貝完代碼后一定要刷新Cache,以免不測。

    還有,對硬件的操作要小心。很多寄存器值都是被硬件改變的,讀寫時,要保證確實訪問到它的地址。首先,在C語言代碼中聲明為volatile變量,以防止內存讀寫被編譯器優化掉;另外,設置好TLB,使得寄存器映射的地址空間不被緩存。

    總之,緩存和內存中代碼的不一致,是一定要避免的。

    2) 弄巧成拙! -- 只對頻繁訪問的地址空間進行Cache優化。

    我們很清楚自己的程序中,那里有大量的運算,哪里有無數的循環或遞歸,而這正是Cache的用武之地,我們將這些空間進行緩存將大大提高運行速度。但是,很多函數或子程序往往僅僅運行很少幾次,若是對它們也緩存,只會撿了芝麻丟了西瓜,造成不必要的緩存和替換操作,反而增加了系統負擔,降低了整體性能。

    3) 斷點哪兒去了? -- 如何調試“加速”了的代碼?

    據我所知,一般,debugger都是通過掃描地址總線,在斷點處暫停CPU。ARM9TDMI中集成的JTAG調試口,也是這樣。

    當我們調試使用Cache的代碼時,將會出現問題。比如:CPU訪問某斷點所在地址之前的地址時,發生緩存操作,斷點處代碼被提前讀入Cache,此時地址總線上出現了斷點地址,CPU被debugger暫停,并且斷點之后的指令也被Cache緩存。于是,當你從斷點處step時,程序卻停不了了,因為地址總線上不再出現斷點之后的下一個地址了。

    再舉個例子:

    int i,a;

    for (i=0; i<100; i++) {

    -> a++; /* set breakpoints */

    }

    當地址總線上第一次出現斷點地址時,CPU暫停;之后,就再也不會停了。因為,之后CPU會從cache中直接去代碼了。(當然,后來,Cache的代碼有可能會被替換掉,斷點又可到達。) 所幸的是,我用的debugger提供JTAG Monitor,允許斷點跟蹤使用cache的程序。

    預約申請免費試聽課

    填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

    上一篇:嵌入式行業相關企業招聘需求是什么?
    下一篇:淺談嵌入式的現狀以及產業規模
    • 掃碼領取資料

      回復關鍵字:視頻資料

      免費領取 達內課程視頻學習資料

    • 視頻學習QQ群

      添加QQ群:1143617948

      免費領取達內課程視頻學習資料

    Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

    選擇城市和中心
    黑龍江省

    吉林省

    河北省

    湖南省

    貴州省

    云南省

    廣西省

    海南省

    欧美一级高清片,一级欧美免费大片视频,欧美三级在线电影免费 百度 好搜 搜狗
    <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>