MAM淺析

ARM處理器運行速度很快,當系統時鐘爲60Mhz時,一條指令的執行時間只需十幾納秒(ns)。Flash存儲器的速度無法滿足ARM處理器對指令的需求。ARM通過將內部flash部件的總線寬度擴展成128位寬度,來解決這個問題,雖然Flash的一次讀寫操作仍要50ns左右,但是一次操作可以獲取4條ARM指令(或者八條Thumb指令),平均一條指令只有幾十ns,和處理器相當。
       用存儲器加速模塊(MAM)來管理128位寬度的Flash存儲器。
1.MAM結構 
      Flash存儲器被分爲兩組,每個Flash組包含預取指緩存和分支跟蹤緩存。
      預取指緩存區保存有將要執行的指令。而分支跟蹤緩存區保存有程序跳轉後可能執行到的指令。
      當程序連續執行代碼時,通常一個Flash組包含當前正在取指的指令和包含該指令的整個Flash行,而另一個Flash組則包含或正在預取指下一個連續的代碼行。     
      當程序向前跳轉時,嘗試從預取指緩存區取指。當程序向後跳轉時,嘗試從分支跟蹤緩存區取指。
如果程序跳轉出緩存的範圍,CPU將要停止,等待若干個週期,直到正確的指令從Flash中被讀出。
      Flash中除了存儲指令之外,還可用來存儲不修改或者很少修改的數據,所以在MAM模塊中設計有數據緩衝區。數據緩存區可以提高順序讀取數據的操作速度。但是對隨機讀取操作幾乎沒有加速效果。
      Flash編程不受存儲器加速模塊控制,而作爲一個獨立的功能進行處理。“Boot Block”扇區包含了可被用戶程序調用的Flash編程算法(即IAP代碼)和一個可對Flash存儲器進行串口編程的裝載程序(即ISP代碼)。
      雖然MAM可以大大提升指令和數據的獲取速度,但是系統的功耗也會增加。
2.MAM的定值問題
     (1)當改變MAM定時值時,必須先將MAMCR設置爲0關閉MAM,然後將新值寫入MAMTIM。最後將需要的操作模式的對應值(1或2)寫入MAMCR,再次打開MAM;
     (2)對於低於20MHz的系統時鐘,MAMTIM設定爲001,將Flash訪問時間設定爲1CCLK ;對於20MHz到40MHz之間的系統時鐘,建議將Flash訪問時間設定爲2CCLK;高於40MHz的系統時鐘,建議使用3CCLK。依此類推,總之要確保Flash的訪問週期不小於50ns,否則會導致操作錯誤。
       對定值的操作C代碼如下:
                                . . .
                                MAMCR = 0;
                                if Fcclk < 20000000
                                      MAMTIM = 1;
                                else
                                if Fcclk < 40000000
                                      MAMTIM = 2;
                                else
                                      MAMTIM = 3;
                                MAMCR = 2;

MAM的任務就是在一條指令被需要時立刻將下條指令提供給CPU。通常,程序和數據存儲器的寬度設計成與處理器字的寬度相同,ARM7系列內核爲32位。但爲了降低成本,系統經常使用16位寬的存儲器和外部存儲器,從而造成器件性能的下降。提高系統速度的最好方法就是將Flash存儲器加寬到128位。這樣,每訪問一次存儲器就可以提取4條32位的ARM指令或8條16位的Thumb指令。然而,CPU仍然必須等到存儲器訪問結束後才能提取第一條指令,再無延時地處理緊跟其後的3條(ARM指令)或7條(Thumb)指令。
爲了消除延時,Flash存儲器分成兩組,每組的寬度爲128位。當128位被讀出並緩存到一個flash組時,之前緩存在另一個flash組的指令被執行。由於每個flash組一次能存儲幾條指令,兩個flash組的指令被需要之間存在幾個處理器週期的時間。MAM就利用這段時間來將當前未使用的flash組中的128位數據重裝到緩衝區(預取指緩衝區)。當從較慢的flash存儲器中讀取指令時,可以通過這種方法來增加幾個等待週期,而不會影響指令的執行時間。
這種簡單的預取指方法(見圖2)很有用,它使得CPU的執行速度是普通flash最高速度的4倍(只要程序流程中沒有跳轉指令)。分支、子程序調用和中斷有時會中斷執行指令行。這時,隨着極短的跳轉的出現,相關組的預取指緩衝區的內容無效。
程序分支
當目標地址到達第二個組的底部時,已經啓動了重裝。如果在下個週期內將完成相應flash組的讀操作,則可以立刻訪問第二個flash組的預取指緩衝區。反之必須增加一個或幾個等待週期,直到完成flash的讀操作。
如果程序跳轉出預取指緩衝區的範圍,CPU停下來執行等待週期,直到數據從“正確”的目標地址複製到緩衝區。只有在這種情況下,相對較長的訪問時間生效。然後,下條指令從緩衝區中全速讀出,直到下條指令再次碰到中斷。
程序也可以往回跳轉。程序的循環就是這種情況。通過重複讀取flash中的指令可防止循環執行速度的減慢,每個存儲器組還另外有一個緩衝區,它存放着執行的最後一條指令。這些分支跟蹤緩衝區的寬度也爲128位。當一個預取指緩衝區的指令被執行時,另一個組的預取指緩衝區已從flash存儲器中裝載了新的指令。這時循環指令要執行舊的程序代碼,但這些代碼已經不在另一個預取指緩衝區中了。但是,舊的程序代碼在覆蓋之前已被複制到相應的分支跟蹤緩衝區,此時恰好可以爲程序提供下一條指令(循環)。

數據區
Flash存儲器不僅存儲程序代碼,還可存放不修改或很少修改的數據。這些數據包括常數、表格或文本串。爲了存放這類數據,還開闢了一個專門的數據鎖存區,這片區域是存儲器組的公共部分。當要訪問某個地址單元的數據,但數據並不在數據鎖存區內時,就觸發從flash並行讀出下面的4個32位的字。因爲只有在每訪問完第4個字才能觸發一次新的讀操作,所以加速了連續訪問的速度。但是,如果地址是隨機的,則所需數據通常不在數據鎖存區內,不能達到加速訪問的目的。
實際flash訪問的時間
使用了MAM後,ARM內核不是從flash中直接讀出指令或數據,而是分別從預取指和分支跟蹤緩衝區或數據鎖存區中讀取指令和數據。將Flash內容裝載到緩衝區寄存器的操作與系統時鐘同步。時鐘頻率爲20MHz時,數據可從Flash中讀出,無需延時。如果系統時鐘頻率太高,則必須插入等待週期。訪問flash時用戶可插入的總週期數爲1~7個。時鐘頻率爲20MHz時只需要1個週期。時鐘頻率爲40MHz時必須使用2個週期(即要增加1個等待週期)。當時鍾頻率增加到60MHz時,這也是規定的最高時鐘頻率,需要3個等待週期。
MAM的使用
MAM的作用可通過不同的頻率基準測試出來。MAM的作用取決於系統時鐘的大小。因爲時鐘頻率爲20MHz時在1個週期內就可將Flash的內容讀出,因此此時執行的代碼是來自RAM還是Flash以及是否使用了MAM都沒有任何的不同(圖3)。時鐘頻率越高,RAM的訪問時間越短,ARM內核可繼續工作在最高性能。當直接執行Flash中的代碼時,時鐘頻率提高到大於20MHz都不會產生明顯的影響。只有存儲器的訪問時間增加了,性能才受到影響。但是使能MAM能顯著提高器件的性能,使ARM內核能以最快的速度運行。與理想情況相比較,只有丟失了指令或數據纔會造成時間之間的延遲。
一方面,MAM的使用可以顯著增強高時鐘頻率下的特性,另一方面,也可看到由於Flash和緩衝區訪問時間的不同帶來的影響。爲了滿足不同的要求,MAM的使用可選擇三種不同的等級:
1. 不使用MAM
直接對Flash進行訪問;插入預先選好的等待週期。這時,處理器的動作是可預知的,但是如果時鐘頻率太高,性能會受到影響。
2. MAM部分使能
從預取指緩衝區中連續取指,但是即使最短的分支也會啓動對Flash的直接訪問。爲了使得操作可知,所需的數據都存放在Flash而非數據鎖存區中。
3. MAM完全使能
所有訪問都是對預取指或分支跟蹤緩衝區或數據鎖存區執行的操作。如果相關的數據未存放在以上的緩衝區內,將直接訪問Flash。在高時鐘頻率下,操作很難預知。

Flash編程
MAM不影響Flash的編程。當擦除或擦除一個Flash扇區時,數據分配到任何兩個存儲器區中的任何一個對用戶是完全透明的。Boot block存放着程序和必要的編程算法。這些程序也可被用戶程序調用來使能在應用中編程。引導裝載程序支持器件的串行編程。
復位後,控制權自動轉移給引導裝載程序。引導裝載程序先檢查Flash中是否包含有效的用戶程序。Flash是否包含有效的用戶程序取決於異常向量表(圖4)的內容。ARM異常向量表含有一個保留地址0x14。如果該地址包含剩餘向量校驗和的2的補碼,則所有向量的和等於0。只有滿足這個準則,引導裝載程序纔將控制權傳遞給Flash向量表中的復位向量。
爲了防止在編程完一個Flash扇區後以前的數據從MAM緩衝區寄存器中被讀出,在編程週期開始時便將所有預取指和分支跟蹤緩衝區以及數據鎖存區屏蔽。編程後,直接將Flash中的所有數據讀出,直到緩衝區用於再次存放有效信息。

由於編程過程中不能對Flash進行訪問,因此ARM內核一直處於等待狀態,如果看門狗功能使能,用戶必須確保等待時間不能超過預先設置的看門狗週期。
轉自Tony嵌入式論壇,地址:http://www.cevx.com/bbs/thread-24412-1-1.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章