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

Решено Не получается собрать проекты от pvvx под Linux

Alexander

Member
После исправления путей к компилятору, питону и esptool.py компиляция идет нормально, но возникает затык Mekefile на elf2image.
Код:
$(BINODIR)/%.bin: $(IMAGEODIR)/%.out
    @echo "------------------------------------------------------------------------------"
    @mkdir -p ../$(FIRMWAREDIR)
    @$(ESPTOOL) elf2image -o ../$(FIRMWAREDIR)/ $(flashimageoptions) $<
Ну и вот такая в итоге ругань
Код:
Traceback (most recent call last):
  File "/home/alexander/esp-open-sdk/xtensa-lx106-elf/bin/esptool.py", line 733, in <module>
    main()
  File "/home/alexander/esp-open-sdk/xtensa-lx106-elf/bin/esptool.py", line 700, in main
    data = e.load_section(section)
  File "/home/alexander/esp-open-sdk/xtensa-lx106-elf/bin/esptool.py", line 445, in load_section
    os.remove(tmpsection)
OSError: [Errno 2] No such file or directory: '/tmp/tmp8pb6zB.section'
Сборка завершилась с ошибкой.
make[1]: Выход из каталога `/home/Share/проекты/ESP8266/examples/MinEspSDKLib-master/app'
make[1]: *** [.output/eagle/bin/eagle.app.v6.bin] Ошибка 1
make: *** [.subdirs] Ошибка 2
Не могу понять, что не так.
 

Alexander

Member
Заработало.
Изменил в Makefile путь к esptool.py, который лежит в папке проекта, в самом esptool.py исправил пути.
 

pvvx

Активный участник сообщества
Заработало.
Изменил в Makefile путь к esptool.py, который лежит в папке проекта, в самом esptool.py исправил пути.
Кунулись бы исправленным Makefile с рекомендациями под Linux, а то я не часто работаю в Linux, а этот проект и не думал под него...
 

Alexander

Member
Предполагается, что gcc и все сопутствующее уже установлено.
Установить тулчейн в соответствии с хауту.
cd в директорию, куда хотим ставить, я ставил в свою домашнюю директорию /home/alexander и под это правил файлы.
Код:
cd ~
git clone --recursive https://github.com/pfalcon/esp-open-sdk
make STANDALONE=y |& tee make0.log
export PATH="$HOME/esp-open-sdk/xtensa-lx106-elf/bin/:$PATH"
alias xgcc="xtensa-lx106-elf-gcc"
Скачать zip архив и распаковать в место с проектами. У меня это /home/Share/проекты/ESP8266/examples. Можно использовать git, но мне так было проще. Файлы проекта после распаковки окажутся в /home/Share/проекты/ESP8266/examples/MinEspSDKLib-master.
Меняются строки.
В Makefile
Код:
# Base directory for the compiler
XTENSA_TOOLS_ROOT ?= /home/alexander/esp-open-sdk/xtensa-lx106-elf/bin

ESPTOOL        ?= python /home/Share/проекты/ESP8266/examples/MinEspSDKLib-master/esptool.py
В esptool.py нужно найти все строки с указанием на исполняемые файлы (по маске ".exe") и заменить пути вот так
Код:
tool_nm = "/home/alexander/esp-open-sdk/xtensa-lx106-elf/bin/xtensa-lx106-elf-nm"

tool_objcopy = "/home/alexander/esp-open-sdk/xtensa-lx106-elf/bin/xtensa-lx106-elf-objcopy"
Пожалуй, проще было бы скопировать esptool.py из проекта куда-нибудь в пупку тулчейна и один раз поправить Makefile, потом копировать только его в разные проекты. Не стал так делать потому, что еще не до конца разобрался с компиляцией других проектов, использующих SDK. В моем примере придется для каждого проекта править Makefile и esptool.py, впрочем, последний как раз можно просто копировать из проекта в проект, в нем пути не меняются.
Можно было бы все это сделать аккуратней и оптимальней, но у меня была задача добиться компиляции проекта, я не думал, что меня попросят все это выложить на общее обозрение. :oops:

PS если вдруг кто-нибудь сочтет Eclipse громоздким и совершенно случайно захочет пользоваться, как и я Geany - в меню "Сборка / Установить_Команды_Сборки / Независимые_Команды" удобно сделать команды:
Код:
"Собрать" make
"Собрать заданную цель" make
"Собрать WEBfiles" ./WEBFS22.exe -h "*.htm, *.html, *.cgi, *.xml, *.bin, *.txt, *.wav" -z "*.inc, *.ini, snmp.bib" WEBFiles webbin WEBFiles.bin
"Прошить" python esptool.py --port /dev/ttyUSB0 write_flash 0x00000 bin/0x00000.bin 0x07000 bin/0x07000.bin 0x79000 bin/clear_eep.bin 0x7C000 bin/esp_init_data_default.bin 0x7E000 bin/blank.bin 0x80000 webbin/WEBFiles.bin
"Собрать заданную цель" предлагает ввести цель, например, clean.
Для сборки вэб файлов понадобится алкоголь, в смысле, Wine. Надеюсь в будущем от этого костыля избавиться.

PPS Может кто-нибудь поможет старому балбесу реализовать в сем чудном проекте пару счетчиков? Надобны пара переменных, наращиваемых по прерываниям от GPIO и выводимых на вэб страничке. В общем, холодную и горячую воду считать не таская провода по квартире. Я уж как-нибудь потом постараюсь разобраться, как их сохранять в EEPROM через, например 10 или 100, чтобы не терять все при отключении питания.
 

Вложения

pvvx

Активный участник сообщества
PPS Надобны пара переменных, наращиваемых по прерываниям от GPIO и выводимых на вэб страничке. В общем, холодную и горячую воду считать не таская провода по квартире. Я уж как-нибудь потом постараюсь разобраться, как их сохранять в EEPROM через, например 10 или 100, чтобы не терять все при отключении питания.
По конкретнее опишите, а то в общих словах сложно. Прерывания у GPIO по фронтам или по уровню и т.д. Там писать нечего. Опишите примерно - пример и кину - думаю доделаете и разберетесь...
 

Alexander

Member
Забыл написать, что для команд Geany нужно обязательно задать рабочий каталог. Нужно вписать директорий проекта, где лежит Makefile. В моем примере это /home/Share/проекты/ESP8266/examples/esp8266web. Это обязательно, иначе команды работать не будут.

Прерывания у GPIO по фронтам или по уровню и т.д.
По фронту лучше, т.к. проще - не нужно запрещать прерывание.
Код:
 Counter1 и Counter2 доступны, как вэб переменные

При старте считать Counter1 и Counter2 из EEPROM.
Приаттачить прерывание на GPIO 4
Приаттачить прерывание на GPIO 5

Обработчик прерывания по фронту на GPIO 4
     Count1++;
     if (Count1 == 10) {
         Count1=0;
         Counter1++;
         Сохранить значение Counter1 в EEPROM;
      }

Обработчик прерывания по фронту на GPIO 5
     Count2++;
     if (Count2 == 10) {
         Count2=0;
         Counter2++;
         Сохранить значение Counter2 в EEPROM;
      }
В общем-то большой необходимости писать в эти переменные через вэб интерфейс нет, но было бы удобно.
В таком случае при изменении сразу и запись в EEPROM.
 

pvvx

Активный участник сообщества
Всё скинуто прямо в проект web-свалки:
Переменные счетчиков хранятся в ~sys_ucnst_1~ и ~sys_ucnst_2~ Это переменные "пользователя".
В user_config.h добавлено:
Код:
#define USE_GPIOs_intr // включение примера с счетчиками срабатывания прерываний на GPOIs (использует ~sys_ucnst_1~ и ~sys_ucnst_2~ для сохранения в flash)
                        // смотреть переменные ~count1~, ~count2~, ~sys_ucnst_1~, ~sys_ucnst_2~  и их запись...
                        // файлы: \app\web\gpios_intr.c \app\include\gpios_intr.h
но это всё временное - через пару недель или ранее удалю.
GPIOs_intr.gif
Ужасно - трогаю вывод проводком - сотня сохранений, т.к. дребезг в тысячи...
https://github.com/pvvx/esp8266web/blob/master/app/web/gpios_intr.c
https://github.com/pvvx/esp8266web/blob/master/app/include/gpios_intr.h
добавки:
https://github.com/pvvx/esp8266web/blob/master/app/web/web_int_callbacks.c#L974
https://github.com/pvvx/esp8266web/blob/master/app/web/web_int_vars.c#L662
https://github.com/pvvx/esp8266web/blob/master/app/web/web_int_vars.c#L34
https://github.com/pvvx/esp8266web/blob/master/app/user/user_main.c#L62
 
Последнее редактирование:

Alexander

Member
pvvx, спасибо, буду разбираться.
Дребезг не сложно удалить аппаратно, а в моем случае его не должно быть, т.к. в счетчике воды геркон. Счетчик медленный и можно еще RC фильтр навесить. В электрических счетчиках и вовсе оптрон. Там частота повыше, но все равно можно навесить RC с постоянной времени меньшей, чем минимальный период.
 

pvvx

Активный участник сообщества
Дребезг не сложно удалить аппаратно,
...
Программно проще, быстрее и надежнее для всего устройства в целом. По вашей задаче надо просто ограничить кол-во срабатываний за определенный промежуток времени. Срабатывает прерывание, его запрещаем и ставим хоть таймер. По истечению таймера разрешаем возможность следующего прерывания. Такую тупую систему не перегрузить срабатываниями и она жрет мало процессорного времени.
 

alexsmd

New member
Программно проще, быстрее и надежнее для всего устройства в целом. По вашей задаче надо просто ограничить кол-во срабатываний за определенный промежуток времени. Срабатывает прерывание, его запрещаем и ставим хоть таймер. По истечению таймера разрешаем возможность следующего прерывания. Такую тупую систему не перегрузить срабатываниями и она жрет мало процессорного времени.
Не проще ли сделать как в примере UDK gpio16_led & key там сделано что по прерыванию, отключается прерывание на пине, делается задача а потом снова включается прерывание...
 

Alexander

Member
Не проще ли сделать как в примере UDK gpio16_led & key там сделано что по прерыванию, отключается прерывание на пине, делается задача а потом снова включается прерывание...
Может и проще, но незначительно и малополезно. Какая разница, отключено или нет прерывание на время наращивания счетчика? Для подавления дребезга требуется куда большая задержка.
 

alexsmd

New member
Какая разница, отключено или нет прерывание на время наращивания счетчика?
Хмм... Для инкрементного счетчика согласен, писал для более общего случая. Просто использовать дополнительный таймер в силу ограниченности ресурсов не желательно...
 
Сверху Снизу