ESP8266 NodeMCU加载liquidcrystal.lua提示内存不足如何解决
ESP8266加载liquidcrystal.lua报内存不足的解决方法
问题背景
在ESP8266 NodeMCU V.3(ESP-12E)开发板上驱动搭载PCF8574 I2C转接芯片的HD44780控制器16x2 LCD屏时,加载Matsievskiy Sergey开发的liquidcrystal.lua库出现如下报错:
Error loading module 'liquidcrystal' from file 'liquidcrystal.lua': not enough memory
设备当前剩余堆内存为21208字节,init.lua仅包含两行加载代码:
backend_meta = require("lc-i2c4bit") lc_meta = require("liquidcrystal")
且两个库文件已经上传至MCU文件系统根目录。
解决步骤
按优先级从高到低依次操作即可:
- 预编译Lua源码为字节码文件
直接加载.lua文本文件时,NodeMCU需要将完整文本读入内存完成词法分析、语法解析,内存开销是源文件体积的3-5倍,是触发本次报错的核心原因。使用和当前烧录固件版本完全匹配的luac.cross交叉编译器,将lc-i2c4bit.lua、liquidcrystal.lua编译为.lc后缀的字节码文件,上传到文件系统后删除原.lua格式的库文件。require加载逻辑不需要修改,NodeMCU会优先加载字节码版本,加载时的内存占用可降低60%以上。 - 加载过程中主动触发垃圾回收
修改init.lua代码,每加载一个模块前、后都主动执行全量垃圾回收,回收内存碎片,调整后代码如下:
操作后可通过串口执行collectgarbage("collect") backend_meta = require("lc-i2c4bit") collectgarbage("collect") lc_meta = require("liquidcrystal") collectgarbage("collect")print(node.heap())查看实时剩余堆内存。 - 裁剪库文件冗余功能
该liquidcrystal库默认集成了自定义字符生成、显示滚动、光标样式控制等非必需功能,若前两步操作后仍存在内存压力,可直接打开liquidcrystal.lua源码,删除当前项目用不到的功能函数,裁剪完成后重新编译为字节码上传即可。 - 刷入精简版NodeMCU固件
若开机剩余堆内存长期低于25KB,说明当前固件集成了过多不需要的功能模块(比如HTTP、MQTT等暂未使用的组件),重新编译仅保留GPIO、I2C、file、node、tmr等基础必需模块的固件刷入,开机剩余堆内存一般可提升至40KB以上,完全满足库加载需求。
内容的提问来源于stack exchange,提问作者Marcelo de Oliveira
相关产品推荐
相关产品推荐

