ESP-8266: азы программирования Lua NodeMCU.

Тема в разделе "Флудилка", создана пользователем ИгорьК, 25 июл 2017.

  1. SergeiL

    SergeiL Гик

    Так и я Вас не упрекаю! Нравится Вам так, ну и хорошо. Будет же работать!
    Я же про себя и написал.
     
  2. AlexU

    AlexU Гуру

    правильно или так:
    Код (C++):
    p=&buff[0];
    или более лаконичнее:
    Код (C++):
    p=buff;
     
  3. Igor68

    Igor68 Гик

    Код (C++):

    &p[0]; //адрес размещение первого(нулевого) элемента массива
    //именно адрес размещения физический и никаких имён
    *pp=&p[0]; //указатель и тоже никаких имён, а тоже самое
    //если функция хочет
    int Func(char * par);
    //то я и вызываю так
    int res = Func(&p[0]);
    //или так
    int res = Func(pp);
    //мне так легче читается
     
     
  4. Igor68

    Igor68 Гик

    Пардон! Похоже устал... и смотреть более не могу.
    Код (C++):

    #include <stdio.h>

    char dd[32];

    int main(int argc, char **argv)
    {
       char *p = &dd[0];
       sprintf(p, "car", 3);
       p[2] = 'd';
       printf("string:\"%s\"\n", p);
       return 0;
    }
     
    Вот работает и всё!

    А это для контроллера ADuC7024:
    Код (C++):
    #include <stdio.h>
    #include <ADuC7024.h>

    char dd[32];

    int main(int argc, char **argv)
    {
       char *p = &dd[0];
       sprintf(p, "car", 3);
       p[2] = 'd';
       //printf("string:\"%s\"\n", p);
        while(1)
        {
        }
       return 0;
    }
     
    Понятное дело вся работа только в симуляторе или JTAG+ADuC7024... никакого ввода-вывода в консоль и наблюдения чисто в массиве в ОЗУ
     
    Последнее редактирование: 3 авг 2017
  5. ИгорьК

    ИгорьК Победитель модулей

    sys нравится это.
  6. ИгорьК

    ИгорьК Победитель модулей

    Приемы работы с памятью и модулем.
    Еще немного о блинке. На его примере разберемся с загрузкой и выгрузкой модулей, кое что узнаем о таблицах и уничтожении таймеров.

    Загружаем в память модуля файл blinkmodandremove.lua:
    Код (Lua):
    do
    -- локальная переменная mm таким образом ловит
    -- собственное название модуля для дальнейшей выгрузки
    local mm = ...
    print(mm)
    local M = {}
    M.pinsintervals = {}

    -- добавляем к функции, что изучали раньше, ссылку на внешнюю таблицу blinkstb
    function M.makeblinkandtimer(pin, interval, blinkstb)
        gpio.mode(pin, gpio.OUTPUT)
        local ligth = 1
        local function blink()
            gpio.write(pin, ligth)
            print("Writе  to "..pin.." "..ligth)
            -- за одно будем смотреть свободную память
            print("Heap = "..node.heap())
            ligth = (ligth == 0) and 1 or 0
        end
        local function maketimer()
            -- поскольку нам нужны зацепки за таймер
            -- создаем его через переменную
            local ltmr = tmr.create()
            -- запускаем таймер
            ltmr:alarm(interval, tmr.ALARM_AUTO, blink)
            -- и помещаем ссылку на него в глобальную таблицу
            table.insert(blinkstb, ltmr)
        end
        return maketimer()
    end

    function M.make(t, blinkstb, call)
        M.pinsintervals = t
        for _, v in pairs(M.pinsintervals) do
             M.makeblinkandtimer(v[1], v[2], blinkstb)
        end
        -- call - callback функция, будет исполнена в завершение
        -- работы модуля
        if call then
            -- вызов callback функции
            call()
            -- уничтожение самого загруженного модуля
            package.loaded[mm] = nil
        end
    end
    return M
    end
    Вызываем модуль следующим образом:
    Код (Lua):
    do
    -- глобальная таблица - склад таймеров-блинков
    blinkstb = {}

    pinsintervals = {
        {1, 5000},
        {2, 3000}
    }

    -- callback функция:
    -- уничтожаем в памяти следы
    -- загрузки модуля и глобальной
    -- таблицыс ногами и интервалами

    function killmod()
        pinsintervals = nil
        bl = nil
    end

    -- грузим модуль
    bl = require('blinkmodandremove')
    -- передаем в него данные о ногах и интервалах,
    -- о таблице - складе таймеров-блинков
    -- о функции, которая очистит память от лишнего

    bl.make(pinsintervals, blinkstb, killmod)

    -- через 10 секунд таймер уничтожит все блинки
    tmr.create():alarm(10000, 0, function(t)
        print("Stop And Kill Blinks!")
        ---[[
        tmr.stop(blinkstb[1])
        tmr.stop(blinkstb[2])
        tmr.unregister(blinkstb[1])
        tmr.unregister(blinkstb[2])
        blinkstb[1] = nil
        blinkstb[2] = nil
        blinkstb = nil
        -- и уничтожит сам себя
        t = nil
       --]]
       --[[ и то же самое компактно
        -- для любого количества блинкеров
        for _, v in pairs(blinkstb) do
              tmr.stop(v)
              tmr.unregister(v)
         end
         blinkstb = nil
         t = nil
        --]]


    end)
    end
    Идем дальше.
     
    Последнее редактирование: 11 авг 2017
  7. Securbond

    Securbond Гик

    Почитал "тему". Вот не думал, что два взрослых, вполне самодостаточных человека, опустятся до такого холивара. Как результат из неплохой задумки получилась флудильная какашка. Одного не понимаю, здесь кто то заставляет кого-то изучать lua насильно? Напоминает спор apple vs android. Видимо мужской климакс или ПМС это уж кому как нравится.
     
  8. ИгорьК

    ИгорьК Победитель модулей

    :) Вы ошибаетесь - раньше тема называлась что-то типа "Троллим Си", все нормально :)

    Это я слегка прошелся по особенностям Сей - люди обиделись. Скоре это я виноват. Больше не буду.

    Тут во время Вашего отпуска была тема одного ненормального товарища про эфироны и ее долго не удаляли. Народ решил что "хуже быть не может", а я доказал что может - создал эту и спросил почему в Сях библиотека из двух файлов и зачем ";" в конце каждой строки.

    И началось... :) Поэтому все в контексте. Вопросам Lua это не мешает - я даю ссылки.
     
    Последнее редактирование: 9 авг 2017
  9. И каков ответ? И не каждая строчка заканчивается точкой с запятой.

    Дизайн си содержит множество дефектов, но как-то так получилось, что очень многое на нем написано.
     
  10. ИгорьК

    ИгорьК Победитель модулей

    Думаю, ответ в том, что тот кто придумал Си был с огромным чувством юмора.
     
  11. b707

    b707 Гик

    если серьезно, точка с запятой стоит не в конце строки, а в конце оператора. Операторов на одной строке может быть несколько, так же как один оператор может растянуться на много строк.
    Это если без троллинга :)
    Считаю такой синтаксис более логичным, чем разделение пробелами. Лунный синтаксис у меня вызывает вопрос. что за идиоты это придумали :)
     
  12. issaom

    issaom Гик

    Юмористы есть в любом языке программирования тот же делфи с его бесконечными бигин енд. Мне кажется важен не сам инструмент, а то как им владеешь и споры что лучше вообще бессмысленны ))) (можно ещё lisp из автокада вспомнить или язык 1с где вся программа как один комментарий читается)
     
  13. Как разобрать такое, если нет точки с запятой?
    Код (C++):
    a = b + c * d = e
    Я не готов утверждать, что это невозможно в принципе, но просмотром единственного лишнего символа справа обойтись не удастся точно.
     
  14. ИгорьК

    ИгорьК Победитель модулей

    Луа придумал один парень из католического университета.
    И он решил так: если много операторов на строке - ставь ";" , а если один или конец строки - и без него сгодится.
    Парень был прост и подошел к делу экономно.
     
  15. ИгорьК

    ИгорьК Победитель модулей

    Да, а вот еще серьезнее - в Луа нет оператора switch. Прикиньте как без него жить то вообще можно :)
     
  16. b707

    b707 Гик

    А если оператор на 5 строк, тогда как?

    switch - это куча последовательных или вложенных if. обойтись без него несложно
     
  17. ИгорьК

    ИгорьК Победитель модулей

    Это к тому кто такие операторы пишет :)
     
    Последнее редактирование: 10 авг 2017
  18. ИгорьК

    ИгорьК Победитель модулей

    Это не куча, а икона программиста на Си :)
     
    Последнее редактирование: 10 авг 2017
  19. Ну вот еще одно чюдо - наслаждайтесь:
    Код (C++):
    void f(int i)
    {
      switch (i)
      {
        case 1:
          ...
          break;

        case 2:
          ...
          break;

        defualt:
          ...
          break;
      }
    }
     
  20. Neu

    Neu Нерд

    ИгорьК, есть у меня ESP8266 (точнее, WeMOS D1), мучаю сейчас ее Ардуйной ИДЭ.
    Тема с Lua показалась занимательной, для расширения кругозора в т.ч... Ну и сам событийный подход, конечно, привлекает... Не помогли бы вы парой советов, с какого боку подойти, чтобы начать программировать эту ESP с помощью Луа? Нужно наверное, перепрошить ее как минимум, плюс среда разработки иная и т.д.?