• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Как самому отключить модули в NODEMCU

nikolz

Well-known member
Добрый день,
Если такое сообщение уже есть, то не ругайтесь.
----------------------------------
В сборке NODEMCU можно самостоятельно отключять ненужные модули
и таким образом увеличить объем свободной памяти.
Это делается следующим образом (пример в UDK - : nodemcu-firmware)
Включаемые в сборку модули определены в файле
C:\Espressif\examples\nodemcu-firmware\app\modules\moduleles.h
включены следующие модули:
LUA_MODULES_ROM \
ROM_MODULES_GPIO \
ROM_MODULES_PWM \
ROM_MODULES_WIFI \
ROM_MODULES_COAP \
ROM_MODULES_MQTT \
ROM_MODULES_U8G \
ROM_MODULES_I2C \
ROM_MODULES_SPI \
ROM_MODULES_TMR \
ROM_MODULES_NODE \
ROM_MODULES_FILE \
ROM_MODULES_NET \
ROM_MODULES_ADC \
ROM_MODULES_UART \
ROM_MODULES_OW \
ROM_MODULES_BIT \
ROM_MODULES_WS2812 \
ROM_MODULES_CJSON

Исходный пример дает нам следующее распределение памяти:
--------------------------------------------------
Section info:
Section| Description| Start (hex)| End (hex)|Used space
------------------------------------------------------------------------------
data| Initialized Data (RAM)| 3FFE8000| 3FFE8B48| 2888
rodata| ReadOnly Data (RAM)| 3FFE8B50| 3FFEC78C| 15420
bss| Uninitialized Data (RAM)| 3FFEC790| 3FFF4FF8| 34920
text| Cached Code (IRAM)| 40100000| 40107D44| 32068
irom0_text| Uncached Code (SPI)| 40201010| 402599EA| 362970
Total Used RAM : 53228
Free RAM : 28692
Free IRam : 718
---------------
Теперь уберем например следующие модули:
ROM_MODULES_U8G
ROM_MODULES_WS2812
ROM_MODULES_COAP
ROM_MODULES_PWM

для этого в указанном файле ставим коммент строк следующим образом:

[HASHTAG]#define[/HASHTAG] LUA_MODULES_ROM \
ROM_MODULES_GPIO \
// ROM_MODULES_PWM \
ROM_MODULES_WIFI \
// ROM_MODULES_COAP \
ROM_MODULES_MQTT \
// ROM_MODULES_U8G \
ROM_MODULES_I2C \
ROM_MODULES_SPI \
ROM_MODULES_TMR \
ROM_MODULES_NODE \
ROM_MODULES_FILE \
ROM_MODULES_NET \
ROM_MODULES_ADC \
ROM_MODULES_UART \
ROM_MODULES_OW \
ROM_MODULES_BIT \
// ROM_MODULES_WS2812 \
ROM_MODULES_CJSON

[HASHTAG]#endif[/HASHTAG]
------------------
в результате получаем:
------------------------------------------------------------------------------
Section info:
Section| Description| Start (hex)| End (hex)|Used space
------------------------------------------------------------------------------
data| Initialized Data (RAM)| 3FFE8000| 3FFE8AE0| 2784
rodata| ReadOnly Data (RAM)| 3FFE8AE0| 3FFEAADC| 8188
bss| Uninitialized Data (RAM)| 3FFEAAE0| 3FFF3060| 34176
text| Cached Code (IRAM)| 40100000| 40107C88| 31880
irom0_text| Uncached Code (SPI)| 40210000| 4024DD9C| 253340
Total Used RAM : 45148
Free RAM : 36772
Free IRam : 906
 

windalser

New member
Добрый день,
Если такое сообщение уже есть, то не ругайтесь.
----------------------------------
В сборке NODEMCU можно самостоятельно отключять ненужные модули
и таким образом увеличить объем свободной памяти.
Это делается следующим образом (пример в UDK - : nodemcu-firmware)
Включаемые в сборку модули определены в файле
C:\Espressif\examples\nodemcu-firmware\app\modules\moduleles.h
включены следующие модули:
LUA_MODULES_ROM \
ROM_MODULES_GPIO \
ROM_MODULES_PWM \
ROM_MODULES_WIFI \
ROM_MODULES_COAP \
ROM_MODULES_MQTT \
ROM_MODULES_U8G \
ROM_MODULES_I2C \
ROM_MODULES_SPI \
ROM_MODULES_TMR \
ROM_MODULES_NODE \
ROM_MODULES_FILE \
ROM_MODULES_NET \
ROM_MODULES_ADC \
ROM_MODULES_UART \
ROM_MODULES_OW \
ROM_MODULES_BIT \
ROM_MODULES_WS2812 \
ROM_MODULES_CJSON

Исходный пример дает нам следующее распределение памяти:
--------------------------------------------------
Section info:
Section| Description| Start (hex)| End (hex)|Used space
------------------------------------------------------------------------------
data| Initialized Data (RAM)| 3FFE8000| 3FFE8B48| 2888
rodata| ReadOnly Data (RAM)| 3FFE8B50| 3FFEC78C| 15420
bss| Uninitialized Data (RAM)| 3FFEC790| 3FFF4FF8| 34920
text| Cached Code (IRAM)| 40100000| 40107D44| 32068
irom0_text| Uncached Code (SPI)| 40201010| 402599EA| 362970
Total Used RAM : 53228
Free RAM : 28692
Free IRam : 718
---------------
Теперь уберем например следующие модули:
ROM_MODULES_U8G
ROM_MODULES_WS2812
ROM_MODULES_COAP
ROM_MODULES_PWM

для этого в указанном файле ставим коммент строк следующим образом:

[HASHTAG]#define[/HASHTAG] LUA_MODULES_ROM \
ROM_MODULES_GPIO \
// ROM_MODULES_PWM \
ROM_MODULES_WIFI \
// ROM_MODULES_COAP \
ROM_MODULES_MQTT \
// ROM_MODULES_U8G \
ROM_MODULES_I2C \
ROM_MODULES_SPI \
ROM_MODULES_TMR \
ROM_MODULES_NODE \
ROM_MODULES_FILE \
ROM_MODULES_NET \
ROM_MODULES_ADC \
ROM_MODULES_UART \
ROM_MODULES_OW \
ROM_MODULES_BIT \
// ROM_MODULES_WS2812 \
ROM_MODULES_CJSON

[HASHTAG]#endif[/HASHTAG]
------------------
в результате получаем:
------------------------------------------------------------------------------
Section info:
Section| Description| Start (hex)| End (hex)|Used space
------------------------------------------------------------------------------
data| Initialized Data (RAM)| 3FFE8000| 3FFE8AE0| 2784
rodata| ReadOnly Data (RAM)| 3FFE8AE0| 3FFEAADC| 8188
bss| Uninitialized Data (RAM)| 3FFEAAE0| 3FFF3060| 34176
text| Cached Code (IRAM)| 40100000| 40107C88| 31880
irom0_text| Uncached Code (SPI)| 40210000| 4024DD9C| 253340
Total Used RAM : 45148
Free RAM : 36772
Free IRam : 906
Попробовал - ненужные строки - удалял полностью. Free RAM увеличился,
однако HEAP при этом не увеличился :(
По-видимому, нужно еще что-то менять в коде.
 

pvvx

Активный участник сообщества
Попробовал - ненужные строки - удалял полностью. Free RAM увеличился,
однако HEAP при этом не увеличился :(
Free RAM увеличивается за счет не вошедшего в сборку кода помещаемого в IRAM :)
HEAP немного увеличивается, но реализация NodeMCU на SDK 0.9.5 = глюк со всеми вариантами TCP соединений. Зачем это нужно, если данный софт не может обеспечить простую связь на модуле ориентированном именно для этого? :confused:
На новые версии SDK, включая v1.1.2, NodeMCU транслируется, но не работает корректно, т.к. очень много изменений в SDK. Ну и при версиях SDK более 1.0.0 у NodeMCU вообще не остается "heap" для поддержки хоть одного соединения TCP. По этой причине NodeMCU заброшена "создателями" несколько месяцев назад.
Я пытался реанимировать данный труп - ничего хорошего не выходит. Необходимо переписывать полностью эту галиматью, что проще написать с нуля, совершено по другим алгоритмам использования памяти... Переориентируйтесь на Arduino IDE - там пока есть поддержка и развитие...
 
Последнее редактирование:

jmms

Moderator
Команда форума
Но это можно и не делать так как nodemcu умещается в самую маленькую ESP-01
Оффтоп: Прошу прощения, я немножко недопонял про самую маленькую ESP-01, если я не ошибаюсь, она структурно ничем не отличается от ESP-07, только отсутствием разведенных пинов. Или это не так? Размерами они практически идентичны.
 

pvvx

Активный участник сообщества
Оффтоп: Прошу прощения, я немножко недопонял про самую маленькую ESP-01, если я не ошибаюсь, она структурно ничем не отличается от ESP-07, только отсутствием разведенных пинов. Или это не так? Размерами они практически идентичны.
ESP-01 не имеет возможности работать с deep_sleep, большая часть I/O у него болтается и принимает что хочет, до выгорания чипа и выход GPIO15 у него засажен на GND, что требует обязательного присмотра - никогда его не назначать на выход во избежание доп. нагрева чипа.
Т.е. nikolz и пишет, что не смог реализовать на NodeMCU ни одного режима работы с датчиками с малым потреблением и ему это не позволяет его "придумывалка" . Но есть другие реализации Lua на ESP-8266, но их nikolz обходит стороной. Наверно он является ярым фанатом именно худшей реализации Lua - NodeMCU (он писал что переписывался с авторами и ему они нравяться). Тут на вкус и цвет :)
 

pvvx

Активный участник сообщества
pvvx,
Вы как всегда с ведром дерьма.
Запаять один пин на ресет не проблема,
Я сделал так, и работет с deep_sleep
Что еще у Вас не работает на ESP-01?
помощь нужна?
Да - отпаять GPIO15 от GND на десятках имеющихся у меня модулях :) А то использовать оф. AT прошивку никак - там RTS/CTS.
А лучше помогите людям в данной теме http://esp8266.ru/forum/threads/malenkij-server-s-fs-nodemcu.409/
Напомню - нормальный трансфер для модуля в TCP за 1.2 Мегобайта в секунду.
 

jmms

Moderator
Команда форума
@nikolz но хип у них одинаковый?
Второй вопрос о Arduino и разработке скетчей на c++, откуда уверенность, что код на c++ будет иметь размер на порядки превышающий код на lua. Как по мне код на c++ легче поддается контролю, как в смысле размера (библиотеки подключаются по мере необходимости), так и с точки зрения размера RAM (или хипа). Поправьте если я ошибаюсь.
 

pvvx

Активный участник сообщества
@nikolz но хип у них одинаковый?
Одинаковый, но надо снимать чип и всё перепаивать, что дороже самого модуля :).
Второй вопрос о Arduino и разработке скетчей на c++, откуда уверенность, что код на c++ будет иметь размер на порядки превышающий код на lua. Как по мне код на c++ легче поддается контролю, как в смысле размера (библиотеки подключаются по мере необходимости), так и с точки зрения размера RAM (или хипа). Поправьте если я ошибаюсь.
Он уже ответил и все давно согласны, что в текущей реализации NodeMCU использовать TCP невозможно. Только "в особых условиях". Используйте UDP и то аккуратно, т.к. скорость прима пакетов превышает скорость обработки их в NodeMCU.
А по самой теме - вырезание пакетов не дает подходящего итого - не дает возможности использовать NodeMCU по назначению = осуществлению связи по стандартным протоколам через WiFi с внешними устройствами. И никаким пиаром nikolz-у это не исправить. :( (причина в том, что он не знает ничего кроме lua, а для исправления ситуации надо написать пару килобайт на СИ, заместив кривой релиз NodeMCU на правильный :) сборку с SDK 1.1.1 старой NodeMCU я уже подготовил, но исправлять код самой NodeMCU никто не берется - там проблем выше крыши, особенно с ажиотажем по копирайтам у "портировщиков" :) )
 
Последнее редактирование:

pvvx

Активный участник сообщества
Ну ложанулись, купили подешовке кучу ненужного.
Технический маркетинг не является ненужной задачей :p
Может лучше признать ошибку и купить новую кучку (или спросить себя - А зачем они нужны?)
И другая куча тоже куплена. Не производить же анализ возможностей на одном модуле? Не перепаивать же единственный модуль, как это делаете вы? :)
Трансивер бывает либо необходим для решения задачи либо нафик нужный.
а нормальный - это когда ля ля, а задачи то и нет.
Кто такой "трансивер"? Мне такое не нужно, а то что нужно - не нужно вам. Ведь у вас кое-как работающие поделки на кухне, а мне требуется надежность работы. Другая выпадающая у вас тема - помощь другим - показать возможности реализаций разных задач путем создания и демонстрации альтернативы, а не пиара :)
Исправьте NodeMCU и включите новые необходимые всем функции из SDK 1.1.2. Вы же пишите, что являетесь великим программистом на С, С++ и Lua. А я не считаю себя программистом, по тому не берусь решать такие задачи для всех. :p Я решаю задачи зашедшие в тупик... Как пример и в случае с NodeMCU - там всё "упало" по причине невозможности скомпоновать и усадить NodeMCU c новыми SDK. Решение дано и давно (вы сами тестировали вариант с SDK 1.0.1) - а дальнейшего нет. Причина значит в том, что никому не нужна NodeMCU, кроме как для рекламы и прочего пиара, о чем свидетельствует кол-во её скачиваний.
 
Последнее редактирование:

jmms

Moderator
Команда форума
Да, я дилетант. И не скрываю это, а даже подчеркиваю. Поэтому и пишу "поправьте меня, если что".
Я объясню, почему пришел к выводу, что код на C++ легче контролировать. Например, вам нужна гипотетическая библиотека для работы с "файловой системой" - вы подключаете ее [HASHTAG]#include[/HASHTAG], код библиотеки помещается в скомпилированную прошивку. Не нужна библиотека - убрали подключение - места стало больше. Верно?
NodeMCU модули вы разобрались как отключать?
Да. C++ низкоуровневый язык (ниже уровнем, чем Lua), но ИМХО, он больше подходит для контроллеров, чем скажем нечто похожее по разработке на JavaScript. Ведь любая абстракция накладывает кучу дополнительного кода, а в ситуации когда ресурсы ограничены, мне кажется, уместнее использовать менее ресурсозатратные языки.
Повторюсь, я дилетант, это ИМХО, и этот текст скорее написан и для самого себя. Я не приуменьшаю ваше мнение и совершенно не хочу спорить. Я лишь хочу взвесить все за и против Lua и C++.
 

pvvx

Активный участник сообщества
-------------------
У меня тоже три кучи (я их вам уже перечислил)
Было интересно экспериментировать с ESP-01 вот и припаял.
Относительно NodeMCU, я уже написал но повторю
Не пересаживайте своих обезъян на мое дерево.
У меня нет проблем. Они у Вас - вот и переписывайте что Вам интересно.
Мне интересно решать задачи - я их решаю.
---------------------------------
Чего тогда сюда залезли? Тут тема не о ваших задачах, а о том как изменить размер heap и увеличить пространство RAM для NodeMCU. :)
А варианты есть и примеры тоже даны в том что выложено в коде. Часть переменных можно перенести в область RAM-BIOS. Там есть незадействованные зоны, совокупностью ~3 килобайта (описаны в предоставленном примере в посту выше). Это даст увеличение heap на эти 3 кило. Плюс использование оверлеев для драйверов в IRAM. Но это требует переписывания бездарно выбранной концепции "портировщиков" Lua в виде NodeMCU.
 
Последнее редактирование:

pvvx

Активный участник сообщества
nikolz - тему и основные вопросы прочтите :)
Java процессоры есть давно, но не пошли - основная причина = маркетинг.
 

jmms

Moderator
Команда форума
Если Вам действительно легко отлаживать на Си то я рад за вас но рекомендую еще попробовать на луа - решать задачи быстро.
Все вылилось в холивар. Посим это мое последнее сообщение.
Пример из жизни: делаю устройство "полив растений" с начальной настройкой: подключение к ESP, вывод HTML странички для настройки, сохранение параметров.
На lua уперся в ограничение хипа, при учете что разбил все приложение на под-файлы, следовал советам. Получилось. Но, в HTML страницу ничего не удалось запихнуть, кроме как пары инпутов. Любое наведение "марофета" резко ограничивается свободным хипом. Хорошо. Допустим, жить можно, но когда из-за нехватки хипа я попадал в ситуации, когда не понимаю почему вдруг ESP уходит в ребут в совершенно неожиданных ситуациях, я понял, что 1) быстро что то сделать можно 2) работать стабильно оно не будет. И здесь вопрос к вам, как вы отлаживаете такие ситуации?
P.S.: можно долго спорить о том, что мол это не та задача, и ESP для этого не годится, но тем не менее на C++ все работает и даже стабильно.
 

pvvx

Активный участник сообщества
Вам тоже не мешает прочесть тему.
Вы где в заголовке этой темы нашли про ошибки или про хип?
А какова цель удаления "модулей"?
Я написал тему как отключить модули.
Вы поняли как это сделать?
Нет. Не понял и не знал :)
Если отключили 4 модуля хип увеличился на 2 КБ
Вам мало? Вы знаете как сделать больше?
Да и написал как.
Флаг вам в руки - откройте тему и расскажите как Вы это сделали а не читайте нравоучения.
Смотрящий Вы наш.
Т.е. решения не требуется?
Значит можно удалить, то, что может привести к нормальной реализации Lua на ESP и назначить смотрящим в данной теме вас?
 

Kutrik

New member
nikolz,

А как подключить свои модули написанные на СИ? Как их потом вшить и обращаться к ним?
 

nikolz

Well-known member
nikolz,

А как подключить свои модули написанные на СИ? Как их потом вшить и обращаться к ним?
http://www.lua.org/manual/5.1/manual.html
http://ilovelua.narod.ru/
Потом добавить свою функцию в любой существующий модуль и таким образом расширить его возможности.
В качестве примера можно использовать любую функцию из модулей в проекте nodemcu
 

pvvx

Активный участник сообщества
Вопрос @nikolz, как великому знатоку NodeMCU:
Зачем программа в Lua использует память "heap"? Она же интерпретируется и почему не может исполнятся прямо с flash диска?
Данные, необходимые для обработки процедур при этом обычно (реализация на СИ) расположены в bss и там уже жестко выделен под них объем памяти. Результаты обработки (итоговые рабочие данные) не могут занимать столько места, сколько затрачивает NodeMCU. Т.е. память "heap" необходима только для временных буферов обработки потоковых данных.
Неужели так всё криво в реализации NodeMCU?
 
C++ все работает и даже стабильно.
Я тоже это все прошел,испытал все web серверы от разных источников на NodeMCU,нет,Луа хорош для быстрого освоения
ESP,и не более.По русски сказать задолбало heap,вот и все.А все остальное да,супер.
 
  • Like
Реакции: jmms

jmms

Moderator
Команда форума
@nikolz Вы специально подсчитывали и сравнивали или все подсчеты основаны на методе "пальцем в небо"?
 

jmms

Moderator
Команда форума
@nikolz Если исходить из "Если у Вас есть железо в 5 долларов и Вы тратите на реализацию идеи с использованием луа 5 дней", то зачем вообще что то сложное писать для ESP?
Пишем для ESP проброс данных в Serial и оставляем в покое бедный модуль, который должен заниматься подключением к Wi-Fi и пробросом данных в Arduino или что угодно совместимое с Arduino IDE.
Вот только дальше у меня вопрос: ну есть у меня Lua, что мне дальше с ней делать за пределами ESP?
 
Сверху Снизу