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解釋器不時會吃掉大量的內存,反過來會形成堆棧溢出而很難發現錯誤)。

水平有限,如有錯誤,給出指正。
相關文章
相關標籤/搜索