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解释器不时会吃掉大量的内存,反过来会形成堆栈溢出而很难发现错误)。

水平有限,如有错误,给出指正。
相关文章
相关标签/搜索