使用大量模块编译NodeMCU是否会影响内存使用?

问题描述:

使用cloud compiling website我创建了一个定制的NodeMCU固件,其中包含很多模块。很多固件本身的容量几乎都是700KB。我通常只为一个项目使用多达5个模块,所以我想知道在固件中包含所有其他模块是否对RAM使用有明显的负面影响。使用大量模块编译NodeMCU是否会影响内存使用?

+1

内存使用情况和闪存使用情况是两回事。您的固件保存在闪存中,其中的一部分可能会临时加载到IRAM(指令RAM,与DRAM,数据RAM一起使用)。使用ESP-12F时,您有4 MB闪存可用于您的固件。但是从闪存中获取代码可能会很慢,因此IRAM(64 KiB大)。其他一切(堆栈和堆栈)都在DRAM(96 KiB)中。您不能从固件的大小(占用闪存和IRAM的一部分)推断DRAM中的动态内存使用情况,您必须知道模块在堆栈上创建或静态分配的对象。 –

+0

好的,如果我在我的版本中包含'tmr'模块,那么我可以在任何时候简单地调用'tmr.now()'。所以我会假设tmr对象/类总是加载到RAM中。但是也许我错了,一旦我尝试访问tmr,固件只会加载模块。我不知道......我之所以问这个问题是因为固件本身几乎占用了所有内存(一旦我的Lua脚本长于300行左右,脚本就不会再执行了,我得到内存错误)。 – Forivin

https://www.kickstarter.com/projects/214379695/micropython-on-the-esp8266-beautifully-easy-iot/posts/1501224有ESP8266内存映射(和其他有趣的位)的一个很好的解释。此外,你作为评论得到了一个很好的答案。

烘焙到二进制文件中的每个模块都会通过“在那里”而消耗内存。如果你想测量单个模块对可用堆的影响,你必须建立两个二进制文件,一个和一个没有该模块。你可以同时闪烁并在开始后立即计算运行node.heap()的增量。

使用大量模块编译NodeMCU是否会影响内存使用?

是的,它绝对如你所见。

我一般最多只能使用5个模块为一个单一的项目

这就是为什么我们建议使用一组不同的每一个项目的模块(读“最小集合”)。 NodeMCU固件的美妙之处在于,您只需执行一次操作,与例如Arduino,之后交换脚本甚至是个人功能都非常快。

我建议你也看看https://nodemcu.readthedocs.io/en/dev/en/lua-developer-faq/#techniques-for-reducing-ram-and-spiffs-footprinthttps://github.com/nodemcu/nodemcu-firmware/pull/1899正在进行重大改革。