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

nodeMCU SDK 1.1.2

nikolz

Well-known member
Добрый день,
Собрал NODEMCU
получилось так:
NodeMCU 0.9.6 build 20150618 powered by Lua 5.1.4
lua: cannot open init.lua
NodeMCU 0.9.6;chipid=10517634;flash: id=1458415,size=4096,mode=0,speed=40000000
NodeMCU 0.9.6 build 20150618 powered by Lua 5.1.4
lua: cannot open init.lua
remain:.3407827...used:.3514..total:.3411341
heap=17968
 

Tomahawk

New member
Только флешка там уменьшилась до 38К, если ESP-01 использовать.
 
nikolz,
nodemcu-firmware-0.9.6-dev_20150627
при компиляции куча ошибок
Error makefile 4: Command syntax error
Error makefile 6: Command syntax error
Error makefile 11: Command syntax error
*** 59 errors during make ***
Что не так делаю?
 

pvvx

Активный участник сообщества
Только флешка там уменьшилась до 38К, если ESP-01 использовать.
Со всеми модулями:
Код:
EspLua.ru 1.1.2 build 20150701  powered by Lua 5.1.4
lua: cannot open init.lua
> =node.heap()
30288
>
Total : 64256 bytes
Used  : 0 bytes
Remain: 64256 bytes
Только безобразие в NodeMCU 20150627 будет падать, т.к. данные в flash, а на момент чтения и записи flash "кеширование" отключается :) :)
Развлекайтесь цифрами дальше :)
 

pvvx

Активный участник сообщества
Праздровляю с очередным дохлым кроликом из шляпы.
Браво!!!
В зале овации,
зрители восхищаются
и уходят в буфет жевать пряники!!!
Все уже знают, что у вас всё работает :) Продолжайте. Я попкорн уже заготовил и жду очередных перлов :)
 

nikolz

Well-known member
Добрый день,
Здесь можно взять сборку nodemcu 1.1.2 с любыми модулями.
http://frightanic.com/nodemcu-custom-build/
Мне что-то не удается заставить эти сборки работать на dev-kit.
сборки 0.9.6 работают.
У кого работает nodemcu 1.1.2 c этого сайта ?
 
Последнее редактирование:
Попробовал на модулях 4M, 32M,128M.
Почистил Flash.
nodemcu-dev112-8-modules-2015-07-03-15-25-47-float.bin
горит синий диод в UART постоянный поток на скорости 74880
"Fatal exception[0]
epc1=0x40107ec4,epc2=0,epc3=0..."
-----------------
nodemcu-dev096-8-modules-2015-07-03-15-43-30-float.bin -работает.
Код:
NodeMCU custom build by frightanic.com
    branch: dev096
    commit: aa710d1f5362a204eb90362f8e660a9f73941d7a
    SSL: true
    modules: node,file,gpio,wifi,net,i2c,tmr,uart
     built on: 2015-07-03 15:42
  powered by Lua 5.1.4
lua: cannot open init.lua
> =node.heap()
35648
>
команда "format" работает заметно быстрее...
Залил серверок - работает, но
куча по сравнению с nodemcu_float_0.9.6-dev_20150627.bin
уменьшилась на 2-3 кб.??:(
 
Последнее редактирование:

pvvx

Активный участник сообщества
В случае СИ, при отрытых и работающих NETBIOS, SNTP, UDP-Test server, Web server со скоростями передачи более 1 Мегабайт/сек (обслуживание более десятка одновременных соединений) и TCP2UART client/server, WiFi в режиме AP+ST на SDK 1.2.0 получается:

По данным компилятора: Free RAM : 39704, FreeIRam : 29619

По реальному графику “heap” во время работы точками по 20..20ms за 3 минуты (на каждый запрос передача на одну точку файла XML):
heap_sdk120.gif
По запросу через UDP-Test server:
Код:
 heapsize: 35320
UDP pcbs: (активные порты UDP всей системы)
flg:04 0.0.0.0:4096 192.168.1.1:53 recv:402473f8
flg:00 0.0.0.0:4097 0.0.0.0:0 recv:4026f478
flg:04 0.0.0.0:68 0.0.0.0:67 recv:402468c8
flg:00 0.0.0.0:67 0.0.0.0:0 recv:40240d10
flg:00 0.0.0.0:1025 0.0.0.0:0 recv:40248694
flg:00 0.0.0.0:137 0.0.0.0:0 recv:4026a4e0
Active PCB states:
none
Listen PCB states: (активные порты TCP)
Port 80|0 flg:00 tmr:ffffffff LISTEN
Port 12345|0 flg:48 tmr:252e6425 LISTEN
TIME-WAIT PCB states:
none
TCP Server connections:
80 192.168.1.2:10503 CLOSEWAIT
80 192.168.1.2:10502 CLOSEWAIT
80 192.168.1.2:10501 CLOSEWAIT
По данным загрузчика Web:
Код:
Simple WEB version: 0.1.3
OpenLoaderSDK v1.2
Flash Header:
SPI Flash Interface: QIO
SPI CLK: 80MHz
Flash size: 512K
Detect 'rapid loader'
Number of segments: 3
Entry point: 0x4010007c
Segment 1: offset: 0x40100000, size: 19552
Segment 2: offset: 0x3ffe8000, size: 2544
Segment 3: offset: 0x3ffe89f0, size: 3616
Found free IRAM: base:0x40104c60, size:29600 bytes
System memory:
data  : 0x3ffe8000 ~ 0x3ffe89f0, len: 2544
rodata: 0x3ffe89f0 ~ 0x3ffe9810, len: 3616
bss   : 0x3ffe9810 ~ 0x3fff24e8, len: 36056
heap  : 0x3fff24e8 ~ 0x3fffc000, len: 39704
Current 'heap' size: 39456 bytes (при старте, до полной инициализации SDK)
....
На 512k flash:
Curent Disk has 56 files, Disk Size: 83493 bytes.
Disk Addres: 0x0000a000, Max Disk Size: 221184 bytes, Max 250 files.
График с точками в ~50ms RSSI позволяет узнавать пассы руками с модулем и "танцы с бубном" вокруг него :p.
 
Последнее редактирование:

pvvx

Активный участник сообщества
В данном моем примере речь о файловой системе spiffs (чтение/запись файлов).
Т е если ее смонтировать (это я и делал), то память сокращается на 7 Кбайт.
В результате выигрыш в RAM не столь существенный.
В Node MCU очень плохо портирована spiffs. Об этом говорилось много раз. Смотрите описание spiffs по минимальной занимаемой памяти и удивитесь, что натворили прортировщики...
Вообще-то, получается, что файловая система в СИ не имеет смысла для программного кода.
Вы ошибаетесь с СИ. Страницы динамические - генерируются на ходу. Запись фалов в моей "Web свалке" не предусмотрена по причине ненужности мне лично. Монтируется любая система. Смотрите Arduino IDE.
Поэтому без оверлеев на СИ либо существенного увеличения RAM (вроде обещают)
выигрыш на СИ лишь в быстродействии (а оно нам нужно в умных вещах?)
а проигрыш - в трудоемкости разработки для любителей.
Для любителей есть Arduino на ESP.
А скорость просто необходима для мобильных устройств - это имеет прямое отношение к потреблению. Модуль должен накапливать данные, включать WiFi и сливать их в размере до 15 мегобайт. Иначе, при потере связи даже не по вашей вине данные будут утеряны. Для записи данных лучше применить специальный протокол записи в flash, а не файловую систему. Этим достигается неимоверный выигрыш по массе параметров в стесненных условиях. Я планирую сделать базу данных годового накопления 16-ти аналоговых датчиков с дискретом не менее полчаса усредненных данных с дискретом в несколько секунд (иначе данные будут не верны - потеря пиковых) и выработку показаний - текущих (с шагом в секунды), за сутки (минимальный шаг = 30 минут), за неделю и так до года (шаг показаний типа усреднения за месяц или пол) + запись логов событий безусловно всё с выводом в графическом виде без задействования чего-либо внешнего (прямое соединении на WEB и всё ПО в модуле). Это уже ранее было реализовано мной на PIC24 (8к RAM) с 1 Мб falsh и портом инет (+ web сервер безусловно :), но с ограничением в 3 одновременных соединения). Проект работает на многих пром.установках уже более нескольких лет.
В текущем состоянии NodeMCU годится только для опроса одного простейшего датчика и мигания одним светодиодом раз в минуту и никакого автономного или аварийного питания, если только не использовать аккумулятор от автомобиля на 50..100 A/ч. И соединение NodeMCU нельзя выводить через глобальную сеть инет. Только местную и только с нормированными запросами. Иначе всё будет виснуть. Такова текущая реализация. А вы не хотите приложить усилия в модификации и родах EspLua.ru :) Мне то она не нужна, но народ....
 
Последнее редактирование:

pvvx

Активный участник сообщества
Пробуем поглядеть, как тама с "кучей".
Код:
SDK version: 1.1.2
Heap size: 38224 bytes.
Found free IRAM: base:0x4010a7f8, size:6152 bytes
Real Flash size: 524288 bytes.
Распределение памяти у компилятора - https://github.com/pvvx/EspLua/blob/master/mem.txt
Включены все модули и всё, что возможно: https://github.com/pvvx/EspLua/blob/master/app/include/user_modules.h
Лог в ESPlorer (старт после прошивки с пустым диском)
Код:
EspLua.ru 1.1.2 build 20150702  powered by Lua 5.1.4
lua: cannot open init.lua
> =node.heap()
30824
>
Total : 64256 bytes
Used  : 0 bytes
Remain: 64256 bytes
> =node.heap() <-- Тут произошло соединение с AP клиента (компа) к модулю и:
30072
> =wifi.ap.getip()
192.168.4.1    255.255.255.0    192.168.4.1
Старт, но уже с фалом init.lua, на соединение с роутером:
Код:
EspLua.ru 1.1.2 build 20150702  powered by Lua 5.1.4
> =node.heap()
30880=wifi.sta.getip()
nil
> =node.heap()
30880=wifi.sta.getip()
nil
> =node.heap()
30880=wifi.sta.getip()
nil
> =node.heap()
30408=wifi.sta.getip() <-- Тут произошло соединение с ST модуля с роутером
192.168.1.15    255.255.255.0    192.168.1.1
>
----------------------------
init.lc         : 232 bytes
init.lua        : 91 bytes
----------------------------
Total file(s)   : 2
Total size      : 323 bytes

Total : 64256 bytes
Used  : 1004 bytes
Remain: 63252 bytes
Разницы после исполнения init.lua не наблюдается.
При старте имеем heep до инициализации NodeMCU в 38224 bytes.
После - 30408. Разница в 7816 байт уходит на соединение WiFi в SDK (порядка 1к на AP и/или ST - если оба, то более 1к, практически x2) и на инициализацию spiffs + интерпретатора Lua.
Так что нет 8 кило на spiffs в heap
PS: Советую не ныть, а заняться подготовкой списка - какие команды надо исправить, какие добавить в EspLua на SDK 1.2.0 в соответствующей теме. Займусь её лечением, когда запущу Lua как вторую задачу, отдельно от SDK (второй "тред"). Иначе Lua работать не будет (только с отключенным WDT и потерями связи на исполнение delay() и т.д.).
 
Последнее редактирование:

pvvx

Активный участник сообщества
Но мой вопрос касался потери памяти при сборке программы на СИ с включением в нее spiffs.
При правильном портировании равно нескольким словам в bss, а не в heap. Там находятся указатели на открытые структуры для обработки. В ESP сегмент bss отъедает от heap. При работе кратковременно, на время обработки выделятся heep и работает стек.
Т е СИ программа потеряла 7 кбайт, а nodeMCU - нет.
- это ошибка. Посмотрите внимательнее. NodeMCU - это худший пример. Там всё размешено в bss и стеке. Все структуры spiffs заранее "открыты" и сидят в bss (под них навсегда выделена память, которую никто другой не может задействовать).
Мне например непонятно, зачем копить годовые данные в маленькой коробочке,
если есть многоэтажные хранилища.
Но пусть будет коробочка,
тогда почему не задействовать SD карту?
Надежность SD карты хуже flash. По всем характеристикам. А так-же данные всегда можно скопировать и держать где угодно в сотнях копиях. Представьте, к примеру, что модуль стоит на автомобиле. На месте, куда он подъехал всегда имеется полная картина за год и на каждой стоянке их копия :) Интернет ещё не охватывает весь Земной шарик с применением WiFi (что и хорошо).
Вопросов с СИ vs Lau я не решаю и не собираюсь. Т.к. есть масса разных программных языков и зацикливаться на одном нехорошо.
 

nikolz

Well-known member
Поковырял немного гвоздиком и получил 20.3 Кбайт свободной IRAM в NODEMCU:
------------------------------------------------------------------------------
Section info:
Section| Description| Start (hex)| End (hex)|Used space
------------------------------------------------------------------------------
data| Initialized Data (RAM)| 3FFE8000| 3FFE8AD0| 2768
rodata| ReadOnly Data (RAM)| 3FFE8AD0| 3FFEBDC0| 13040
bss| Uninitialized Data (RAM)| 3FFEBDC0| 3FFF4C78| 36536
text| Cached Code (IRAM)| 40100000| 401030C4| 12484
irom0_text| Uncached Code (SPI)| 4020C000| 40262E9B| 355995
Total Used RAM : 52344
Free RAM : 29576
Free IRam : 20302
 

pvvx

Активный участник сообщества
Поковырял немного гвоздиком и получил 20.3 Кбайт свободной IRAM в NODEMCU:
Free IRam : 20302
Это работать не будет. Т.к. не остается места для диска и критические функции отрабатывающие во время отключения "кеша" Flash тоже отключатся. А на них указывают вектора прерывания CPU :) NodeMCU использует IRAM под функции, которые можно перенести в Flash, но не системные. Сделано это как простейший компромисс в целях малого увеличения размера диска на 512к flash. Им лень сдвигать сегмент кодов с атрибутом размещения во flash при каждой паковке проекта :) Если это делать, то выигрыш нивелируется. В общем NodeMCU-шники = халявщики. :)
Использовать IRAM приходится на полную (все 48к) т.к. иначе константы всех процедур находятся в области "кеширования" flash, что незя из-за её отключения во время чтения-записи Flash. Обработка системных событий SDK не останавливается во время чтения-записи Flash, а тем процедурам требуются их данные :) Аналогично и со всеми аппаратными векторами прерываний, которые в SDK используют библиотеки libgcc.a и libc.a и другие, а они имеют константы, которые вы закинули во flash :) Тоже самое и с драйверами...

Поэкспериментируйте и поизучайте - придет понимание, что если у вас есть активный драйвер, то на Lua и других интерпретаторах он занимает больше RAM на таблицу стыковки с остальной частью и описаний устройства, чем написанное на C и C++. Но там и там память выделяется только на время работы драйвера. По этой причине лучше иметь готовый встроенный драйвер на СИ для вызова из Lua (из чего и строится интерпретатор Lua).
 
Последнее редактирование:

nikolz

Well-known member
Добрый день,
Здесь можно взять сборку nodemcu 1.1.2 с любыми модулями.
http://frightanic.com/nodemcu-custom-build/
Мне что-то не удается заставить эти сборки работать на dev-kit.
сборки 0.9.6 работают.
У кого работает nodemcu 1.1.2 c этого сайта ?
--------------------------
На данный вопрос получил ответ с указанного сайта.
Действительно не работает c dev 1.1.2
но с 0.9.6 очень даже рекомендую попробовать:

----------------------------------------------
NodeMCU custom build by frightanic.com
branch: dev096
commit: 2224f24dadebdccd82fa0e1a543ca904ac37a8d4
SSL: true
modules: node,file,gpio,wifi,net,pwm,i2c,spi,tmr,adc,uart,ow,bit,mqtt,cjson,crypto,rc,dht
built on: 2015-07-05 10:37
powered by Lua 5.1.4
lua: cannot open init.lua
NodeMCU 0.9.6;chipid=10517634;flash: id=1458415,size=4096,mode=0,speed=40000000
NodeMCU custom build by frightanic.com
branch: dev096
commit: 2224f24dadebdccd82fa0e1a543ca904ac37a8d4
SSL: true
modules: node,file,gpio,wifi,net,pwm,i2c,spi,tmr,adc,uart,ow,bit,mqtt,cjson,crypto,rc,dht
built on: 2015-07-05 10:37
powered by Lua 5.1.4
lua: cannot open init.lua
remain:.3426401...used:.0..total:.3426401
heap=34472
 

jcmvbkbc

New member
bss не содержит данных на которые выделяется память.
Поэтому просьба пояснить назначение bss и какая ее часть требует памяти а какая нет
bss не содержится в прошивке, но памяти требует, просто всегда инициализируется нулями
 

jcmvbkbc

New member
1) Почему надо очищать так много памяти?
Потому что прошивка использует столько неинициализированных статических данных.
Добавьте линковщику ключ -M (-Wl,-M если линкуете gcc) и посмотрите, что и откуда попадает в .bss.

В документации сказано, что в программах прерываний нельзя обращаться к функциям во флеш т е к коду
Но ничего не сказано о запрете обращения к данным во флеш
2) Можно или нет обращаться к данным во флеш в таких программах? Если нет, то где об этом сказано?
Нужно понимать почему нельзя: потому, что прерывание может прийти в тот момент, когда кэш FLASH отключен, т.е. FLASH не мэппится в адресное пространство памяти. И тогда попытавшись выполнить что-то из FLASH вы выполните нули (или что там окажется на шине), а попытавшись загрузить данные вы загрузите в регистры эти нули (или како-то другой мусор).
 

jcmvbkbc

New member
Полагаю,что данное объяснение логично для кода во флеш.
Я же спрашивал о данных во флеш.

Код во FLASH ничем не отличается от данных в том смысле, что для обращения к ним используется общий механизм кеширования.

Поэтому повторю свой вопрос развернуто:
Можно или нет обращаться к данным,
а не к коду команд,
во флеш в таких программах?

Уточните заодно, в каких "таких" программах?

Я спрашиваю не о возможности или нет использовать код и данные из флеш внутри обработчиков прерываний (это-то все понятно),
а о возможности использовать код и данные из флеш в функциях использующие колбеки, которые конечно в iRAM.
Конечно это можно делать, если есть гарантия, что такие функции не вызываются из обработчиков прерываний.
Вообще, на мой взгляд, ситуация вывернута наизнанку: вся прошивка танцует вокруг обращений к замэпленному флэшу, при том, что единственная операция, при которой мэппинг отключается -- запись во FLASH -- довольно редкое событие.
 

jcmvbkbc

New member
1) Т е Вы хотите сказать, что 36536 байт будут каждый раз при старте заполнятся нулями?
Если так
то какая программа в ESP это делает (загрузчик точно этого не делает)
и в прошивке этого нет.
Каким же образом это делается?
Я хочу сказать, что эта область должна заполняться нулями при старте.
Код для этого есть в libmain.a(app_main.o), его легко найти, потому что это единственный кусок кода, ссылающийся на символы _bss_start и _bss_end:
Код:
        ...
                        648: R_XTENSA_32        _bss_end
                        64c: R_XTENSA_32        _bss_start
64d:   000000          ill
650:   fffe61          l32r    a6, 648 <wdt_init+0x368>
                        650: R_XTENSA_SLOT0_OP  .irom0.text+0x648
653:   fffe41          l32r    a4, 64c <wdt_init+0x36c>
                        653: R_XTENSA_SLOT0_OP  .irom0.text+0x64c
656:   050c            movi.n  a5, 0
658:   07b467          bgeu    a4, a6, 663 <wdt_init+0x383>
                        658: R_XTENSA_SLOT0_OP  .irom0.text+0x663
65b:   004452          s8i     a5, a4, 0
65e:   441b            addi.n  a4, a4, 1
660:   f79467          bne     a4, a6, 65b <wdt_init+0x37b>
                        660: R_XTENSA_SLOT0_OP  .irom0.text+0x65b
663:   f00d            ret.n
Если он почему-то не вызывается, то это просто ещё один баг.

2) Если посмотрим на таблицу символов bss для nodemcu:
...
многие из этих переменных не имеет смысла заполнять нулями.
--------------------
Может быть bss область ничем не инициализируется и тем отличается от .data ?
https://en.wikipedia.org/wiki/.bss
От себя добавлю, что одними только средствами C нет возможности статически выделить неинициализированную область данных.
 
Последнее редактирование:
Сверху Снизу