NodeMCU 内存栈不足解决🚀

NodeMCU作为成熟的ESP8266模块平台,内存溢出,内存不足是其最大的缺点。本文指出一些我在学习过程中,对NodeMCU内存溢出的解决方案。

解决方案

避免出现内存溢出情况,要注意:

  1. 冗余的变量及时赋值nil注销。
1
extra = nil
  1. 需要时间执行的程序,延时一段时间再往下执行
    如解决 httpserver 中 Out Of Memory
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
wifi.setmode(wifi.STATION)
wifi.sta.config({ssid,passwd})
wifi.sta.autoconnect(1)
function startserver()
srv = net.createServer(net.TCP)
srv:listen(80, function(conn)
......
end)
end
tmr.create():alarm(1000,1,function(cb_timer)
if wifi.sta.getip() == nil then
print("Connecting...")
else
cb_timer:unregister()
tmr.create():alarm(1000,tmr.ALARM_SINGLE,start_server)
end
end)
  1. 避免回调函数构成完美闭包循环,由于无法进行垃圾回收,因此会导致内存泄漏。

  2. 使用net模块时,不应该在回调中关闭连接。

  3. 编译固件时,选择自己所需要用到的模块,减少固件所耗内存。

  4. 认真琢磨代码逻辑,减少多余操作,优化代码结构。

监测

使用node.heap()及时对内存问题进行监测,找出内存溢出问题所在。

如:在代码中实时打印node.heap()

1
2
3
4
5
6
7
8
9
10
11
heap0=0
heap1=0
heap0=node.heap()
function fun()
····
end
heap1=node.heap()
--heap0 开始内存值
--heap1 结束内存值
--heap0-heap1 所占用内存值
print('@heap',heap0,heap1,heap0-heap1)

输出结果如:

1
@heap 40576 40048 528