1. 程式人生 > >MCU Flash中的只讀檔案系統

MCU Flash中的只讀檔案系統

ROM檔案系統

ROM檔案系統(ROMFS)是一個由eLua構建的微型的,只讀的檔案系統,它與C庫整合在一起,所以你可以使用標準的POSIX(fopen/fclose/fwrite...)來操作它。它也可以直接通過Lua的io模組來控制。這個檔案系統中的檔案是eLua二進位制映象中的一部分,所以映象構建以後它們不能被修改。因為同樣的原因,在映象構建後你不能增加或刪除映象檔案。ROMFS不支援子目錄。 為了最大化的在不同平臺上得以操作的靈活性,ROMFS與構建系統結合在一起。因此,當eLua執行在開發板上時,你可以選擇ROMFS中的內容。此外,你可以指定檔案系統中所擁有的應用(代替單獨的檔案),因為相比一個簡單的Lua程式來說,更需要一個實際的應用。

使用ROMFS

為了使用ROMFS,在構建eLua前,你得把檔案拷貝到rom/資料夾下。記住一個ROMFS檔案的最大名字字元數目為14個字元。包括字尾名和檔名之間的點號。確保這些檔名都來自rom/目錄下的檔案。然後編輯主要的構建指令碼(SConstruct)來增加一個新的應用或者修改已經存在的。所有被包含進ROMFS中的應用被定義在Sconstrcut中的romfs數組裡。每個應用會在romfs數組裡列出它相關的檔案。正如下面的程式碼所示,注意其中有些應用不止需要一個檔案。
romfs = { 
    'bisect' : [ 'bisect.lua' ],
    'hangman' : [ 'hangman.lua' ],
    'lhttpd' : [ 'index.pht', 'lhttpd.lua', 'test.lua' ],
    'pong' : [ 'pong.lua', 'LM3S.lua' ],
    'led' : [ 'led.lua' ],
    'piano' : [ 'piano.lua' ],
    'pwmled' : [ 'pwmled.lua' ],
    'tvbgone' : [ 'tvbgone.lua', 'codes.bin' ],
    'hello' : [ 'hello.lua' ],
    'info' : [ 'info.lua' ],
    'morse' : [ 'morse.lua' ],
    'dualpwm' : [ 'dualpwm.lua' ],
    'adcscope' : [ 'adcscope.lua' ],
    'life' : [ 'life.lua' ]
}

此後,你需要解決應用到開發板的對映關係。這些關係被定義在Sconstrcut中的另一個數組裡,叫做file_list。此陣列定義如下,不需要說明檔案格式。
file_list = { 
    'SAM7-EX256' : [ 'bisect', 'hangman' , 'led', 'piano', 'hello', 'info', 'morse' ],
    'EK-LM3S8962' : [ 'bisect', 'hangman', 'lhttpd', 'pong', 'led', 'piano', 'pwmled', 'tvbgone', 'hello', 'info', 'morse', 'adcscope' ],
    'EK-LM3S6965' : [ 'bisect', 'hangman', 'lhttpd', 'pong', 'led', 'piano', 'pwmled', 'tvbgone', 'hello', 'info', 'morse', 'adcscope' ],
    'STR9-COMSTICK' : [ 'bisect', 'hangman', 'led', 'hello', 'info' ],
    'PC' : [ 'bisect', 'hello', 'info', 'life' ],
    'LPC-H2888' : [ 'bisect', 'hangman', 'led', 'hello', 'info' ],
    'MOD711' : [ 'bisect', 'hangman', 'led', 'hello', 'info', 'dualpwm' ],
    'STM3210E-EVAL' : [ 'bisect', 'hello', 'info' ],
    'ATEVK1100' : [ 'bisect', 'hangman', 'led', 'hello', 'info' ],
    'ET-STM32' : [ 'hello', 'hangman', 'info', 'bisect' ],
    'EAGLE-100' : [ 'bisect', 'hangman', 'lhttpd', 'led', 'hello', 'info' ]              
}

然後剩下的工作就是構建eLua了。作為構建過程的一部分,mkfs.py會被呼叫。此檔案會讀取romfs下的內容並且輸出一個C標頭檔案,此標頭檔案包含了檔案系統的二進位制描述。使用C程式碼來操作ROMFS,當你某個時候想使用此檔案,在檔名加上字首/rom/。比如你想開啟ROMFS中的一個a.txt檔案,你可以這樣寫:
f = fopen( "/rom/a.txt", "rb" )

如果你想執行一個來自ROMFS中的檔案,你可以在shell中輸入下面的語句,
eLua# lua /rom/bisect.lua

或者這樣也可以執行檔案:
> dofile "/rom/bisect.lua"

ROMFS模式

從0.7版本開始,ROMFS可以使用3種不同的方法被載入進二進位制映象檔案中:
  • 逐字:這是預設方式。所有檔案直接被拷貝到ROMFS中,沒有經過任何處理。
  • 壓縮:使用LuaSrcDiet(在eLua中)壓縮Lua原始碼。這樣的話通過不同的轉換可以減少Lua原始檔的大小。所有來自ROMFS的檔案都經過了LuaSrcDiet的處理,並且結果會被寫進eLua二進位制映象檔案中。這個選項可以產生不錯的壓縮,唯一的不好是壓縮後的lua檔案沒有那麼容易讀了。然後,在很多實際操作中,這不算是一個問題。
  • 編譯:預先編譯Lua原始檔成二進位制。所有lua原始檔都經過Lua編譯器的操作,結果也會被寫入eLua二進位制映象中。這個選型可能減少或者增加ROMFS映象的大小。但是它最重要的好處是提升了速度(因為eLua首先不需要編譯Lua原始碼成二進位制),而且還減少了RAM的消耗(lua直譯器不時會吃掉大量的記憶體,反過來會造成堆疊溢位而很難發現錯誤)。
水平有限,若有錯誤,給出指正。