ESP8266学习随笔之三——在NodeMCU使用LFS

在上一篇文章里面,我们用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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值