1. 程式人生 > >程式碼可在NOR Flash上執行的解釋

程式碼可在NOR Flash上執行的解釋

經常聽到程式程式碼可在NOR Flash上執行,而不能在NAND Flash上執行的說法,關於這個說法容易給人造成誤解,因為CPU執行程式碼分為取指譯碼執行三個步驟,所以真正執行程式碼的還是CPU,對於NOR Flash可以直接執行程式碼的說法,指的是CPU可以直接通過地址匯流排從NOR Flash上完成取指的操作。更深入的理解這個概念,我們先了解以下知識點。

1.FLASH儲存器

FLASH 儲存器又稱為快閃記憶體,它也是可重複擦寫的儲存器。根據儲存單元電路的不同,FLASH儲存器又分為 NOR FLASH NAND FLASH,其二者特性對比如表所示:

NOR與NAND特性的差別,主要是由於其內部“地址/資料線”是否分開導致的。由於 NOR的地址線和資料線分開,它可以按“位元組”讀寫資料,符合 CPU 的指令譯碼執行要求,所以假如 NOR上儲存了程式碼指令, CPU 給 NOR一個地址, NOR 就能向
CPU 返回一個數據讓 CPU 執行,中間不需要額外的處理操作。

而由於 NAND 的資料和地址線共用,只能按“塊”來讀寫資料,假如 NAND 上儲存了程式碼指令, CPU 給 NAND 地址後,它無法直接返回該地址的資料,所以不符合指令譯碼要求。 即不支援立即執行的特性(eXecute In Place),若程式碼儲存在NAND上,可以先把它載入到RAM儲存器上,再由CPU執行。

注:由於Flash擦寫通常是整塊擦寫,塊內有一位失效整個塊就會失效,這被稱為壞塊,而Nor 和 Nand Flash都有可能存在壞塊,所以Flash儲存器需要“探測/錯誤更正(EDC/ECC)”演算法來確保資料的正確性。
 

2.XIP( eXecute In Place)

XIP,executed in place,本地執行。作業系統採用這種系統,可以不用將核心或執行程式碼拷貝到記憶體,而直接在程式碼的儲存空間(Nor Flash)直接執行。採用這樣的技術既可以節省可用記憶體又可以減少載入的時間。由於Nand Flash的特性不支援XIP,所以不能在 Nand Flash中執行程式碼。

程式碼執行流程如上圖所示,其中NAND Flash執行程式碼時,需要先將程式碼載入到RAM中,CPU再從RAM中取指、譯碼、執行。而NOR Flash支援XIP,CPU可以直接通過匯流排從NOR Flash中取指,不需要將程式碼載入到RAM中執行。

3.分散載入

首先我們簡單瞭解下MDK的編譯過程,它與其它編譯器的工作過程是類似的,該過程見圖。

在工程的編譯提示輸出資訊中有一個語句"Program Size:Code=xx RO-data=xx RW-data=xx ZI-data=xx",它說明了程式各個域的大小,編譯後,應用程式中所有具有同一性質的資料(包括程式碼)被歸到一個域,程式在儲存或執行的時候,不同的域會呈現不同的狀態,這些域的意義如下