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

EspLua вместо NodeMCU

nikolz

Well-known member
измерил время записи исправленной немного расковыренной файловой системы стандартной прошивки nodemcu
поучилось:
запись 1 байта 4.5 мкс.
если в цикле записи блоками ставить flush, то время увеливается примерно в 10 раз.
выкладываю сборку скорость UART 115200 буфер 256.
------------------------------------------------------------------
Я достаю из широких штанин дубликат ентой прошивки, читайте, завидуйте...
--------------------------------------------------------------------------------
P.S. Созидательная критика приветствуется, зубоскальство - игнорируется.
 

Вложения

P.S. Созидательная критика приветствуется, зубоскальство - игнорируется.
Залил в ESP12E
все Ваши прошивки у меня запускаются кнопкой reset
после заливки только 3 - 4 раза, выдают мусор в UART.
Это нормально?
Запустил тест5 FS
пишет в файл заметно быстрее:)
замедлилась на x2.txt (на одну запись 1 сек)
5899
подождал, остановил.
результат очень интересный:
Код:
----------------------------
Test5.lua       : 437 bytes
x1.txt          : 1000000 bytes
x2.txt          : 1000000 bytes
x3.txt          : 98000 bytes
----------------------------
Total file(s)   : 4
Total size      : 2098437 bytes

Total : 3201705 bytes
Used  : 2108613 bytes
Remain: 1093092 bytes
Еще раз оставлю по дольше писать.
Посмотрите почему тормозит с 1589900;)

P.S.
пригляделся к монитору, после 1589900 код выполняется как то рывками по 1-3 записей через ~ 1сек
после
Used : 2212041 bytes
по несколько секунд на строку записи - остановил.
 
Последнее редактирование:

nikolz

Well-known member
не пойму что же делает flush в ESP?;)
http://www.lua.org/manual/5.1/manual.html#3.10
в ESP делает тоже самое - т е записывает данные из буфера во флеш. т е каждый раз при ее вызове буфер очищается записью во флеш
Поэтому эту функцию используют обычно в многозадачных, многопоточных системах и при работе с файлами общего доступа.
В ESP этого нет, поэтому эта функция почти не нужна.
 

nikolz

Well-known member
Залил в ESP12E
все Ваши прошивки у меня запускаются кнопкой reset
после заливки только 3 - 4 раза, выдают мусор в UART.
Это нормально?
Запустил тест5 FS
пишет в файл заметно быстрее:)
замедлилась на x2.txt (на одну запись 1 сек)
5899
подождал, остановил.
результат очень интересный:
Код:
----------------------------
Test5.lua       : 437 bytes
x1.txt          : 1000000 bytes
x2.txt          : 1000000 bytes
x3.txt          : 98000 bytes
----------------------------
Total file(s)   : 4
Total size      : 2098437 bytes

Total : 3201705 bytes
Used  : 2108613 bytes
Remain: 1093092 bytes
Еще раз оставлю по дольше писать.
Посмотрите почему тормозит с 1589900;)

P.S.
пригляделся к монитору, после 1589900 код выполняется как то рывками по 1-3 записей через ~ 1сек
после
Used : 2212041 bytes
по несколько секунд на строку записи - остановил.
после заливке для своего SCITE я обычно передергиваю кабель .
LuaLoader стартует без каких-либо манипуляций кабелем.
ESPloader - тоже, но не всегда.
 

nikolz

Well-known member
могу предложить такой тест как основу:
local n=1
local s=0
local str="0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
local len=string.len(str);
print("len="..len);
local tt=0;
local E=1000;
if file.open("x.txt","w") then
for i=1,E do
tmr.wdclr()
local TM=tmr.now();
file.write(str); --file.flush();
local y=tmr.now()-TM; tt=tt+y;
n=n+1; s=s+len;
if n>1000 then print("TT="..tt..",ts="..y/len..",s="..s..",len="..len); n=1; end
end
end

он печатает через 1000 операций вывода
TT- общее чистое время записи мкс
ts - мкс на один байт
s - длина записи всегов байтах
len- длина одной записи
---------------------------------------------------
writeln отличается от write тем что делается write и потом еще write "/n" -перевода строки.
 
Последнее редактирование:
в ESP делает тоже самое - т е записывает данные из буфера во флеш.
записывает данные из буфера RAM на диск (это по книжке) - на PC в 32Гб RAM понятно, а в ESP?
Вот я и не понял как организован буфер 1мб в RAM размером менее 32к.
Но эта команда что-то делает- это видно!
вопрос что?
 
могу предложить такой тест как основу:
То же хороший вариант- можно время оценить.
теперь уже ясно, что FS грустно:( как не тестируй.

вот 2 теста:
Визуально V 9.9.9 бежала очень быстро
по Вашему тесту этого не видно -странно.;)
Код:
NodeMCU 9.9.9 build 20150713  powered by Lua 5.1.4
lua: cannot open init.lua
> dofile('test6.lua')
len=100
TT=1900600,ts=4.33,s=100000,len=100


NodeMCU.ru 0.9.6 build 20150715  powered by Lua 5.1.4
lua: cannot open init.lua
> dofile('test6.lua')
len=100
TT=2252686,ts=5,s=100000,len=100
>
 
Последнее редактирование:
Понавешали транзисторов на GPIO0 и RESET, а при старте в GPIO0 выводится 26 MHz и что там твориться - только вам и известно, но найти и исправить пока не можете
я уже писал, замыкал GPIO0,2,15, Reset перемычками и через резистор куда надо - не помогло.
на остальных прошивках нет проблем с этим.;)
 

nikolz

Well-known member
записывает данные из буфера RAM на диск (это по книжке) - на PC в 32Гб RAM понятно, а в ESP?
Вот я и не понял как организован буфер 1мб в RAM размером менее 32к.
Но эта команда что-то делает- это видно!
вопрос что?
Нет там буфера на 1 Мб. эта файловая система сделана для:
1) работы без кучи
2) равномерного износа флеш
3) нет каталога в понимании fat.
Но в ней есть кеширование данных для записи файлов.
Возможно что для ESP это лишнее.
-----------------------------------------------
О быстродействии:
С моей точки зрения скорость записи хорошая.
Чтобы точнее ее измерить надо немного изменить тест таким образом:
local n=1
local s=0
local str="0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
local len=string.len(str);
print("len="..len);
local tt=0;
local T2=tmr.now();
T2=tmr.now()-T2;
local E=1000;
file.remove("x.txt")
if file.open("x.txt","w") then
for i=1,E do
tmr.wdclr()
local TM=tmr.now();
file.write(str); --file.flush();
local y=tmr.now()-TM-T2; tt=tt+y;
n=n+1; s=s+len;
if n>1000 then print("TT="..tt..",ts="..y/len..",s="..s..",len="..len); n=1; end
end
end
Уточненный результат:
TT=1406693,ts=2.24,s=100000,len=100
----------------------------
Т е примерно 400 Кбайт/сек.
Это мало?
 
Последнее редактирование:

nikolz

Well-known member
что касается уарт,
то я пока не нашел никаких специальных задержек,
кроме вывода параметров при старте на скорости 74880
 
Нет там буфера на 1 Мб. эта файловая система сделана для:
1) работы без кучи
Привет nikolz!
Спасибо за ответ.
Китайцы сделали flush и сами не поняли зачем, наверное многозадачный Lua планировали и забыли:).
Могли бы и урезанный FAT32 с каталогами приклеить - таблицы FAT во flash.
400 Кбайт/сек. не много, после контроллеров с 10Mбайт/сек на ARM с полной FAT32 и тд.
но это другая ниша оборудования при цене 2,4$.
На счет плохого старта после заливки.
Дергать кабели плохо,
думаю просто что кнопки RESET не достаточно, для 25Q32/128 то же нужен рестарт, а это питание.
это только после записи, потом все нормально.
 

pvvx

Активный участник сообщества
Нет там буфера на 1 Мб. эта файловая система сделана для:
1) работы без кучи
2) равномерного износа флеш
3) нет каталога в понимании fat.
Она 'работает' только в варианте 512 к flash, когда диск 60 кило. И то это кажется, что она работает. :)
Много ошибок. Переписывать всё нет никакого желания.
C 16 Mbytes Flash ваши прошивки не работают. Одни проблемы, куда там не сунься и желание что-то исправлять отпадает.
Как не писал, какие условия не ставил, всегда выходит счетчик к 15, свободное место остается, а записи нет (после того как первый раз файл записался). Пример:
Код:
local i=1
if (file.open("x.txt","a")==true) then
while (file.writeline("12345678901234567890")==true) do
  i=i+1
  print(i)
  tmr.wdclr()
end
file.close()
else
  print ("no file")
end
И это от прошивки, ваша/наша или ещё какая, не зависит. Просто сделано всё криво и spiffs и Lua.
Т е примерно 400 Кбайт/сек. Это мало?
Физическая скорость записи flash со стиранием меньше (~200кило в сек при стирании страницами (!) при +25 C и тесте множественных flash без учета времени работы CPU). Вы измеряете скорость "кэш". Т.е. опять гоните очередную рекламу не понимая реалий.
flash_t.gif
 
Последнее редактирование:

pvvx

Активный участник сообщества
я уже писал, замыкал GPIO0,2,15, Reset перемычками и через резистор куда надо - не помогло.
на остальных прошивках нет проблем с этим.;)
Ножки GND и питания у чипа припаяйте или смените его, если считаете что всё остальное проверили.
 

pvvx

Активный участник сообщества
измерил время записи исправленной немного расковыренной файловой системы стандартной прошивки nodemcu
поучилось:
запись 1 байта 4.5 мкс.
Выполнение одной команды из Lua в NodeMCU примерно аналогично (2..20 ms и зависит от процедуры, если не завязано с чтением байт через прерывание исключения...). В цикле, когда созданы связи и процедура короткая, типа инверсии GPIO, то доходит до пару стробов шины - 400 us.
Вот вам таблица скорости работы CPU при последовательной записи в регистры периферии (работы шины в тактах CPU ESP8266):
clk_wr.gif Из которой следут, что глубина FIFO шины всего 8 слов.
(пояснение - на последовательную запись 16 слов в регистры периферии CPU затрачивает 118 тактов на 160 MHz, на чтение всегда не менее 8 )
Из-за тормоза шины запись и чтения по SPI Flash ограничены временем чтения/записи регистров SPI. GPIO ещё тормознее, т.к. используют своё внутреннее тактирование на ещё ниже частоте.
Но это всё мелочи по сравнению с применной системой исправления байтного чтения через прерывание исключения, примененного в NodeMCU для чтения констант (текстовых строк и т.д.) из области Flash или IRAM в погоне за размером 'heap'. Там время получения одного байта CPU равно нескольким сотням тактов CPU (более 300 - итог CPU типа на 80MHz/300 = 260 kHz). Простое выравнивание обращений за переменными к области Flash или IRAM решается до 10 тактов CPU, но для этого надо переписывать всё, включая SDK.
 
Последнее редактирование:

nikolz

Well-known member
Добрый день,Vladimir555,
1) Собрал новую прошивку обновил некоторые библиотеки в SDK.
Мне показалось,что работает устойчивее.
Попробуйте
2) Скорость 10 Мбайт в сек это хорошо.
Но вот что получают на fat реально(см прикрученную картику)
Посмотрите какая скорость при записи 100 байт.
Т е скорость такая же.
 

Вложения

nikolz

Well-known member
Про реальные скорости
Как Вы думаете, с какой скоростью будет посылать пакеты размером 100 байт Ваш комп через высокоскоростной WIFI , предположим в 300 Мб/c, при условии что на каждый пакет надо получить ответ.
Будет примерно 4-5 пакета в секунду. т е 3-4 Кб/с
 
Последнее редактирование:

pvvx

Активный участник сообщества
Добрый день,Vladimir555,
1) Собрал новую прошивку обновил некоторые библиотеки в SDK.
Мне показалось,что работает устойчивее.
Попробуйте
Кому нужна, кроме вас, прошивка на SDK 0.9.6 (b1)?
Тем более она не работает с 16 Mбайт Flash.

Но вот что получают на fat реально(см прикрученную картику)
Посмотрите какая скорость при записи 100 байт.
Т е скорость такая же.
Низкая скорость у Lua от того, что при диске на 16М передача строки для записи или открытие файла занимает более 1 секунды с текущей реализацией spiffs. :p
Последовательная запись, хоть на SD или MMS работает на полной скорости, что не сказать про spiffs.
 

nikolz

Well-known member
pvvx,
Я к Вам обращался?
---------------------------------------
Когда Вы перестанете в каждую дырку на заборе свой член совать?
(Этот вопрос генерирован роботом по смыслу высказываний pvvx. Вопрос риторический. ответа не требует)
 
2) Скорость 10 Мбайт в сек это хорошо.
Но вот что получают на fat реально(см прикрученную картику)
10мбайт/с FAT32 (чтение, все карты 16/32 Гб только 10 класс) в проекте RTOS, STM32F407 168 мГц, (c аппаратным Float, для SDIO не нужен, но заметно ускоряет DSP модули)
так что на LPC2368 (ARM7, RAM 32 kB) 72 мГц. (еще не смотрел как там у него с внутренними шинами, сколько тактов).
Результаты очень даже приличные, да и Вы еще не указали класс SD карт, судя по размеру - очень старые.
для LPC2368 на 168 мГц. получиться 16 (шутка)
но это все для другого форума.;)
P.S.
в прошивке UART буферы какие ?
 
Сверху Снизу