【问题标题】:Does compiling NodeMCU with lots of modules have an impact on the memory usage?用大量模块编译NodeMCU对内存使用有影响吗?
【发布时间】:2017-09-08 07:23:16
【问题描述】:

使用cloud compiling website,我创建了一个包含很多模块的自定义 NodeMCU 固件。如此之多以至于固件本身的大小几乎是 700KB。对于一个项目,我通常最多只使用 5 个模块,所以我想知道固件中包含所有其他模块是否会对 RAM 使用产生明显的负面影响。

【问题讨论】:

  • RAM 使用和闪存使用是两个不同的东西。您的固件保存在闪存中,其中的一部分可能会临时加载到 IRAM(指令 RAM,与 DRAM 相对,数据 RAM)中。使用 ESP-12F 时,您有 4 MB 的闪存可供固件使用。但是从闪存中获取代码可能很慢,因此 IRAM(64 KiB 大)。其他所有内容(堆和堆栈)都在 DRAM (96 KiB) 中。您无法从固件的大小(占用闪存和部分 IRAM)推断 DRAM 中的动态内存使用情况,您必须知道模块在堆栈上创建或静态分配的对象。
  • 好的,例如,如果我在构建中包含tmr 模块,那么我可以随时调用tmr.now()。所以我会假设 tmr 对象/类总是加载到 RAM 中。但也许我错了,固件只有在我尝试访问 tmr 时才会加载模块。我不知道.. 好吧,我问这个问题的原因是因为固件本身似乎占据了几乎所有的 RAM(一旦我的 Lua 脚本超过 300 行左右,脚本就不再执行了,并且我得到了内存错误)。

标签: memory lua ram esp8266 nodemcu


【解决方案1】:

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 正在进行大修。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 2016-10-22
    相关资源
    最近更新 更多