Ключевое ?лово

vk

Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
Железо для умного дома
  • Страница:
  • 1
  • 2
  • 3

ТЕМА: Функционал на базе Lua от nodemcu

Функционал на базе Lua от nodemcu 28 Дек 2014 20:16 #618

  • Hoksmur
  • Hoksmur аватар
  • Не в сети
  • Осваиваюсь на форуме
  • Сообщений: 23
  • Спасибо получено: 8
  • Репутация: 2
Хочу реализовать функционал на базе прошивки от nodemcu. прошивка предоставляет скриптовый язык Lua. Это интерпретатор, то есть все команды исполняются сразу после ввода. Описание языка. В модуле реализован такой функционал.
Есть следующие "классы":
nodeперезагрузка, версия прошивки, свободная память, ...
fileодноуровневая файловая система. Из неприятностей - работа только с одним открытым файлом
wifiсобственно, "призвание" модуля
tmrизмерение времени, сторожевой таймер, и т.п.
gpio"дрыг-нога"
pwmширотно-импульсная модуляция
netработа собственно с сетью.
i2c"квадратная" шина. Назначается на произвольный вывод.
adcработает только с TOUT, вывод №6 чипа
uartпоследовательный порт.
owшина 1-wire. Назначается на произвольный вывод.
bitбитовые операции. Будет весело, т.к. сама LUA с типами данных обращается очень вольно.
Прошивка от автора этого сайта замечательна, но порой хочется иметь возможность менять функционал по своему усмотрению. Это и хорошо, и плохо - смотря с какой стороны смотреть.
Минус этого подхода - можем пользоваться только функциями, уже "вшитыми" в интерпретатор. И потеря скорости выполнения.
Плюс - можно любое место подкорректировать самому, вывести отладочную информацию, если возникают неоднозначности.
Архив с последними изменениями: uLuaNode.zip
Последнее редактирование: 31 Дек 2014 07:14 от Hoksmur.
Администратор запретил публиковать записи гостям.
Спасибо сказали: Yurip

Re: Функционал на базе Lua от nodemcu 28 Дек 2014 20:26 #620

  • Hoksmur
  • Hoksmur аватар
  • Не в сети
  • Осваиваюсь на форуме
  • Сообщений: 23
  • Спасибо получено: 8
  • Репутация: 2
Пока что только стартовый скрипт.

Вложенный файл:

Имя файла: init.zip
Размер файла:1 KB

Что делает?
1) Если при старте GPIO2 замкнута на 0, то зажигаем синий светодиод на 3 секунды, потом проверяем ещё раз вход. Если отпустили - загружаем на место основного скрипта аварийный, и запускаем. Такое поведение выбрано в расчёте на то, что датчик не будет менять своего состояния за это время.
2) Если есть скрипт обновления - перемещает на место основного, и запускает. И уже задача основного обеспечить появление этого файла, а программиста - его корректность.

У меня модуль с двумя GPIO
Последнее редактирование: 28 Дек 2014 20:47 от Hoksmur.
Администратор запретил публиковать записи гостям.

Re: Функционал на базе Lua от nodemcu 31 Дек 2014 07:11 #665

  • Hoksmur
  • Hoksmur аватар
  • Не в сети
  • Осваиваюсь на форуме
  • Сообщений: 23
  • Спасибо получено: 8
  • Репутация: 2
Накропал модуль для разбора запроса HTTP.
LUA оказалась весьма прожорливой в отношении памяти:
>print(node.heap() )
15520
> http = require( "http")
> print(node.heap() )
6552
В общем-то это было ожидаемо, но чтобы настолько?.. Описание функций в начале файла http.lua. Можно выкинуть разбор таблицы ["header"] для экономии памяти. В первом посте будет не вложение, а ссылка на DropBox

UPD 01-01-2015 Всё страньше и страньше, как говорила Алиса. Выяснилось слабое место идеологии. LUA - Это интерпретатор, а он крутит всё в памяти, которой и так очень немного.
Например, довольно короткая по меркам Си функция съедает 1688 байт. Если выкинуть содержимое строк - то 767 байт, на то чтобы обозначить функцию, выдающую длинную строку.
Файловая система позволяет хранить файлы, проверял до 80 кбайт, что явно не удержать в памяти. В то же время - функции можно переопределять на лету. Эти две особенности оставляют лазейку - держать всё в файлах, и на лету переопределять функции. Механизм обратного вызова тоже есть, но пока не разобрался. Это может помочь реализовать что-то вроде потоков, если цена в байтах не окажется сильно высока.
Последнее редактирование: 01 Янв 2015 19:12 от Hoksmur. Причина: новая инфа
Администратор запретил публиковать записи гостям.
Спасибо сказали: aaa

Re: Функционал на базе Lua от nodemcu 04 Янв 2015 18:46 #675

  • Hoksmur
  • Hoksmur аватар
  • Не в сети
  • Осваиваюсь на форуме
  • Сообщений: 23
  • Спасибо получено: 8
  • Репутация: 2
Следующая итерация. Функционал раскидан на файлы, предполагалось экономить тем самым память. Названия у них "говорящие". Запуск сервиса (на 80-м порту):
require("http")
Создаётся таблица с указанным именем (совпадает с именем файла, устанавливается динамически). Для взаимодействия с внешним миром вызывается на выполнение файл httpapi.lua, возвращаемое значение предполагается использовать для генерации вставки в таблицу ответа. Но памяти всё равно мало: из такого файла проверка через node.heap() даёт около 6 кб, при этом движок может упасть на 3 кб. Параметры из строки http запроса доступны в строке http.params . В архиве пример рисует простейшую таблицу. Длинна ответного сообщения ограничена 1460 байт - особенность этой реализации. Это ограничение может и обходится, но я пока пути не нашёл.
Как обращается Lua с памятью - не пойму. Строка занимает от 100 байт, функция единственной строкой вывода текста - так же около 160..200 б. И в то же время - при вызове на исполнение файла для программ в нём доступно меньше на ~4 кб. Такие дела. Возможно, будет разумно отказаться от выноса пользовательского функционала в файл, и просто дёргать функцию.
Вложения:
Последнее редактирование: 04 Янв 2015 18:54 от Hoksmur.
Администратор запретил публиковать записи гостям.

Re: Функционал на базе Lua от nodemcu 07 Янв 2015 22:15 #747

  • Hoksmur
  • Hoksmur аватар
  • Не в сети
  • Осваиваюсь на форуме
  • Сообщений: 23
  • Спасибо получено: 8
  • Репутация: 2
Радостные новости.
  • Коллектив NodeMCU допилили прошивку: свободной памяти теперь на старте 22616 байт! Появилась вторая функция для работы с бинарными файлами - так что, может будут и пиктограммы, та же favicon.ico
  • В прицепленном файле уже более-менее функциональный сервер!
  • При этом при исполнении пользовательской функции памяти будет меньше только на 5,5 кБ. Теперь есть что-то вроде API - если определить пользовательскую функцию, а затем привязать её, то в генерирующем html коде будет доступен её ответ. Функция должна возвращать строку. Примерно так:
myfunc=function() return "hellowen" end
http:setapi( myfunc )
  • Строка ответа по прежнему должна укладываться в 1460 байт.

  • TODO:
    • Сделать выдачу html файла
    • Сделать вставки в html, примерно как здесь: https://github.com/MrAPierce/esp8266/blob/master/Files/init.lua
    • Попробовать уйти от строковых индексов - хеш-таблицы индексации ощутимо потребляют память.
    • Набросать жизнеспособный пример.

    Вложенный файл:

    Имя файла: uLuaNode_vx3.zip
    Размер файла:2 KB
    Администратор запретил публиковать записи гостям.

    Re: Функционал на базе Lua от nodemcu 09 Янв 2015 21:18 #805

    • Hoksmur
    • Hoksmur аватар
    • Не в сети
    • Осваиваюсь на форуме
    • Сообщений: 23
    • Спасибо получено: 8
    • Репутация: 2
    Hoksmur пишет:
    Радостные новости.
    TODO:
    • Сделать выдачу html файла - сделано
    • Сделать вставки в html, примерно как здесь: https://github.com/MrAPierce/esp8266/blob/master/Files/init.lua - сделано
    • Попробовать уйти от строковых индексов - хеш-таблицы индексации ощутимо потребляют память. - увеличили память, неактуально. Оставляю в пользу читаемости кода.
    • Набросать жизнеспособный пример.
    • -
    в процессе.
    • + добавить отправку на thingspeak.com
    Тест скриптов в этой версии архива. Будет допиливаться.
    Теперь есть на GitHub. Здесь буду отписываться об изменениях.

    Вложения:
    Последнее редактирование: 10 Янв 2015 11:53 от Hoksmur.
    Администратор запретил публиковать записи гостям.
    Спасибо сказали: lincikg, aaa, ROCSPB
    • Страница:
    • 1
    • 2
    • 3
    Модераторы: FlyRouter
    Время создания страницы: 0.139 секунд

    Home`s Smart © 2013-2016. г.Киров.
    Цитирование материалов возможно только со ссылкой на сайт. Использование фотоматериалов только с разрешения авторов.