在上一篇文章里面,我们用NodeMCU写了一个能在线更新lua代码的HTTP服务器,这个服务器启动后会输出类似以下信息:
start free mem: 41008
start httpd on 192.168.4.1:80
end free mem: 33560
这一篇文章里,我们只关注首尾两行信息,这是启动HTTP服务器前后的空闲内存情况,也就是说这个 HTTP服务占用了7-8K的内存,启动之后可用内存约为33K,是否有办法把内存占用再降低一些呢?答案就是今天要讲到的LFS。
LFS具体解释看这里https://nodemcu.readthedocs.io/en/master/lfs/ ,简单来说就是可以让代码放在闪存中,但如同放在内存中一样运行,达成的效果就是会减少内存的占用。上一篇文章里面我们上传了5个lua文件,除了init.lua,另外4个文件拷贝到第一篇文章提到的luasrc目录,并修改以下三个文件的内容
httpd.lua
httpserver = require("httpserver")
修改成
httpserver = node.flashindex("httpserver")()
httpserver.lua
local csend = (require "fifosock").wrap(conn)
修改成
local csend = (node.flashindex("fifosock")()).wrap(conn)
fifosock.lua
local fsmall, lsmall, fbig = {}, 0, (require "fifo").new()
修改成
local fsmall, lsmall, fbig = {}, 0, (node.flashindex("fifo")()).new()
以上修改的目的是把从文件系统加载模块的代码改成从LFS里面加载
执行编译操作
docker run --rm -ti -v `pwd`/nodemcu-firmware:/opt/nodemcu-firmware -v `pwd`/luasrc:/opt/lua marcelstoer/nodemcu-build lfs-image
在刚才这个luasrc目录里多了一个以LFS开头,img扩展名的文件,把它改名成为flash.img并用esplorer 上传到ESP8266中。
同理,init.lua文件也要修改,但这个文件不能放在LFS里面
print("start free mem:",node.heap())
if node.flashindex() == nil then
node.flashreload('flash.img') --只需执行一次,手工执行也可以,就不用每次启动检查了
end
wifi.setmode(wifi.SOFTAP)
local apcfg={ssid="testap", pwd="12345678",}
wifi.ap.config(apcfg)
node.flashindex("httpd")().run() --在LFS运行httpd的代码
print("end free mem:",node.heap())
此时可以删除esp8266上面其他所有文件,只保留flash.img和init.lua。重启后可以看到输出
start free mem: 40816
start httpd on 192.168.4.1:80
end free mem: 40488
HTTP服务器占用内存不到400字节(估计是一些变量的分配所占),最终剩余的内存是40488,和使用LFS之前相比节约了约7K的内存空间。
这时甚至可以把flash.img文件删除,init.lua文件也可以改成
print("start free mem:",node.heap())
wifi.setmode(wifi.SOFTAP)
local apcfg={ssid="testap", pwd="12345678",}
wifi.ap.config(apcfg)
node.flashindex("httpd")().run() --在LFS运行httpd的代码
print("end free mem:",node.heap())
重启后显示
start free mem: 41000
start httpd on 192.168.4.1:80
end free mem: 40720
又多了300字节的内存。
使用NodeMCU,内存紧张,或者想极限优化下内存占用的朋友,不妨先尝试下LFS。
相关代码:
链接:https://pan.baidu.com/s/1hvdAToW7VKGra2Aa69spsQ
提取码:ag60