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

Баги и недосмотры в sdk от espressif

pvvx

Активный участник сообщества
Для теста немного скорректировал liblwip.a (liblwip_corv1_sdk093.zip). Тестировал на tcp servere, вроде не падает. Всё исправить в espconn_tcp невозможно, как и писал, там неверный алгоритм: очень много обращений с указателем на возможно уже уже закрытую pcb lwip-ом. К примеру, с отложенным пользователем по таймеру передачей данных и т.д....
 

CHERTS

Moderator
Команда форума
Для теста немного скорректировал liblwip.a (liblwip_corv1_sdk093.zip). Тестировал на tcp servere, вроде не падает. Всё исправить в espconn_tcp невозможно, как и писал, там неверный алгоритм: очень много обращений с указателем на возможно уже уже закрытую pcb lwip-ом. К примеру, с отложенным пользователем по таймеру передачей данных и т.д....
А исправленные исходники liblwip можно + Makefile для сборки?

А то я тут выложил у себя https://github.com/CHERTS/esp8266-liblwip, но я не силен в составлении configure.ac для автоматической генерации Makefile и поэтому у меня liblwip состоит из нескольких *.a библиотек, как их слинковать в одну через configure.ac я пока не додумался.
 

pvvx

Активный участник сообщества
Самое простое, если взять исходные Makefile из корневого каталога SDK и поменять там xt-ar, xt-xcc, xt-xxx… на ваши xx:= $(XTENSA_TOOLS_ROOT)/xtensa-lx106-elf-xxx, то всё компилируется вашей сборкой. Я не понимаю, в чем у вас сложности – в настройке Eclipse?
После трансляции проекта IoT_Demo получаете библиотеки.
Исходники недоделанных вещей выкладывать не люблю, а espconn исправить до нормы невозможно :)
Это пока дикий патч, не рабочий вариант. Но если хотите - берите https://yadi.sk/d/xB5K9TKUdNk4x (там ещё мелочь доправил - ver2 так cказать :) ). Там даны отличающиеся от оригинала файлы.
Не ясна ваша цель в требовании исходников - вы работаете на Espressif? Я - нет и не ожидаю от них ничего хорошего (нормального SDK и т.д.) в ближайшие годы.
 

CHERTS

Moderator
Команда форума
Самое простое, если взять исходные Makefile из корневого каталога SDK и поменять там xt-ar, xt-xcc, xt-xxx… на ваши xx:= $(XTENSA_TOOLS_ROOT)/xtensa-lx106-elf-xxx, то всё компилируется вашей сборкой. Я не понимаю, в чем у вас сложности – в настройке Eclipse?
Для меня нет сложности сделать Makefile, но в мире Linux для сложных проектов это не совсем правильный подход, гораздо правильней сделать файл автоматической конфигурации, он будет один под все платформы и ОС, windows или linux и потом с помощью autoconf из этого configure.ac генерируются все Makfile'ы. Рекомендую почитать https://ru.wikipedia.org/wiki/Autoconf и http://squadette.ru/autoconf-ru/autoconf-ru.html для общего развития и понимания тематики, если конечно интересно.

После трансляции проекта IoT_Demo получаете библиотеки.
Исходники недоделанных вещей выкладывать не люблю, а espconn исправить до нормы невозможно :)
Это пока дикий патч, не рабочий вариант. Но если хотите - берите https://yadi.sk/d/xB5K9TKUdNk4x (там ещё мелочь доправил - ver2 так cказать :) ). Там даны отличающиеся от оригинала файлы.
Не ясна ваша цель в требовании исходников - вы работаете на Espressif? Я - нет и не ожидаю от них ничего хорошего (нормального SDK и т.д.) в ближайшие годы.
Да я не требую исходники, а прошу. Просто хочу привлечь Вас к общему делу, по исправлению багов в SDK, если у Вас есть желание исправить эти баги. А исправлять желательно как-то централизованно, чтобы всем было понятно, что исправлено и зачем, пусть это криво, косо и не совсем оптимально, для этого я и сделал репозитарий https://github.com/CHERTS/esp8266-liblwip
P.S. Про то что я работаю на Espressif улыбнуло, нет я с ними не связан никаким образом. Даже NDA не подписывал.
 

pvvx

Активный участник сообщества
....
хочу привлечь Вас к общему делу, по исправлению багов в SDK, если у Вас есть желание исправить эти баги.
Честно - этим некогда заниматься, т.к. нет никакой цели в этом - невозможно исправить неверный выбранный базовый алгоритм работы espconn.
Espconn меня не интересует - я её давно не использую из-за глючности и чрезмерно большому расходу памяти на свои дела и эти патчи делал только для устранения особой глючности ваших проектов.
Ими сейчас устранены ошибки связанные с потерей события disconnect с внешней стороны и закрытия соединения lwip-ом. Без этого, espconn "вечно закрывает" соединение по таймеру и такие соединения, закрытые с внешней стороны, часто висят вечно, расходуя ресурс таймеров и т.д. не вызывая callback disconnect или callback recv.
Особо часто проявляется, к примеру, когда сервер отослал данные и получатель закрыл соединение, выдав [FIN, ACK] (нормальный конец передачи данных от сервера клиенту в HTTP при указании "Connection: close"). Стек Lwip подтверждает конец соединения и закрывает сокет (pcb), а Espconn про это не знает (Espconn poll каждую секунду при этом на то соединение Lwip уже вызывает - его же уже нет!). Espconn имеет указатель на старый pcb и по следующим командам пользователя пытается дальше работать по нему (к примеру закрыть соединение по команде пользователя или что-то ещё), что и вызывает вечный цикл закрытия потерянного соединения у Espconn по таймеру (и ... закрытие новых соединений по совпавшему указателю в памяти стека lwip :) ). Теперь, после патча, он сразу вываливается с ошибкой -11 - нет соединения, уведомляя пользователя в процедуре callback recv о закрытии соединения.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Рекомендую почитать https://ru.wikipedia.org/wiki/Autoconf и http://squadette.ru/autoconf-ru/autoconf-ru.html для общего развития и понимания тематики, если конечно интересно.
Всё это понятно, но попробуйте объяснить это армии пользователей :)
И я вам писал - я не проф.програмист и на всё никогда не хватит времени. Пока у меня есть конкретная цель - создание нормального web сервера, позволяющего управлять модулем простым броузером, без всяких Lua и других "глюк" наворотов на глюках от Espressif :)
Когда доделаю до версии, хоть как-то рабочей, с возможностью использовать и модифицировать толпой пользователей без особых знаний программирования (предел - java и оформление html страничек), то выложу необходимые ингредиенты. Если пойдет - то будут и исходники.
 

CHERTS

Moderator
Команда форума
@CHERTS - вы пишите в ESP8266 LwIP library
]Сборка под Windows:
...
5. Запускаем консоль C:\MinGW\msys\1.0\msys.bat
6. В консоле выполните:
cd /c/Espressif/examples
git clone https://github.com/CHERTS/esp8266-liblwip.gitp

А разве git входит в MinGW ?
Нет, не входит, подразумевается что он есть в системе раз вы скачиваете исходники с github. Сейчас подправлю доку.
 

CHERTS

Moderator
Команда форума
В моей сборке https://github.com/CHERTS/esp8266-liblwip есть одно НО, библиотека liblwip.a не соберется, т.к. я не допилил скрипт configure.ac, в результате на выходе получается build\api\liblwipapi.a + build\app\liblwipapp.a + build\core\liblwipcore.a + build\netif\liblwipnetif.a, а как их собрать в liblwip.a я пока не понял. вернее я не понял какие дерективы нужно внести в configure.ac, чтобы при генерации makefile и дальнейшей сборки все собралось как нужно.
 

pvvx

Активный участник сообщества
В моей сборке https://github.com/CHERTS/esp8266-liblwip есть одно НО, библиотека liblwip.a не соберется, т.к. я не допилил скрипт configure.ac, в результате на выходе получается build\api\liblwipapi.a + build\app\liblwipapp.a + build\core\liblwipcore.a + build\netif\liblwipnetif.a, а как их собрать в liblwip.a я пока не понял. вернее я не понял какие дерективы нужно внести в configure.ac, чтобы при генерации makefile и дальнейшей сборки все собралось как нужно.
Может это поможет: http://h-wrt.com/ru/mini-how-to/autotoolsSimpleLib
 

pvvx

Активный участник сообщества
lib_LIBRARIES = liblwip.a

liblwip_a_LIBADD = \
api/liblwipapi.a \
app/liblwipapp.a \
core/liblwipcore.a \
core/ipv4/liblwipipv4.a \
netif/liblwipnetif.a

Возможно так? (я авто-конфигами не пользовался)
 
Последнее редактирование:

CHERTS

Moderator
Команда форума
lib_LIBRARIES = liblwip.a

liblwip_a_LIBADD = \
api/liblwipapi.a \
app/liblwipapp.a \
core/liblwipcore.a \
core/ipv4/liblwipipv4.a \
netif/liblwipnetif.a

Возможно так? (я авто-конфигами не пользовался)
Так я пробовал, не собирается. :( Можно конечно в лоб поступить и сгрузить все *.c в одну папку и сделать

lib_LIBRARIES = liblwip.a

liblwip_a_SOURCES = \
api_lib.c \
api_msg.c \
autoip.c \
def.c \
dhcp.c \
dhcpserver.c \
dns.c \
err.c \
espconn.c \
espconn_tcp.c \
espconn_udp.c \
etharp.c \
icmp.c \
igmp.c \
inet.c \
inet_chksum.c \
init.c \
ip.c \
ip_addr.c \
ip_frag.c \
mem.c \
memp.c \
netbuf.c \
netdb.c \
netif.c \
netifapi.c \
netio.c \
pbuf.c \
ping.c \
raw.c \
sockets.c \
stats.c \
sys.c \
sys_arch.c \
tcp.c \
tcpip.c \
tcp_in.c \
tcp_out.c \
timers.c \
udp.c
но в результате liblwip.a получается какая-то кривая и прошивка с ней улетает в циклический ребут :(

pvvx а скинь пожалуйста свой makefile для сборки liblwip или весь проект, если не жалко.
 

pvvx

Активный участник сообщества
Берёте базовый SDK и транслируете, как писал:

Самое простое, если взять исходные Makefile из корневого каталога SDK и поменять там xt-ar, xt-xcc, xt-xxx… на ваши xx:= $(XTENSA_TOOLS_ROOT)/xtensa-lx106-elf-xxx, то всё компилируется вашей сборкой. Я не понимаю, в чем у вас сложности – в настройке Eclipse?
После трансляции проекта IoT_Demo получаете библиотеки.
Специально для вас, с вашим компилятором (xt-... заменено на C:/Espressif/xtensa-lx106-elf/bin/xtensa-lx106-elf) https://yadi.sk/d/1u00kbM8dPGdY
Проверяйте - мог чего напутать и лишнего накидать :)
 

CHERTS

Moderator
Команда форума
Берёте базовый SDK и транслируете, как писал:
Специально для вас, с вашим компилятором (xt-... заменено на C:/Espressif/xtensa-lx106-elf/bin/xtensa-lx106-elf) https://yadi.sk/d/1u00kbM8dPGdY
Проверяйте - мог чего напутать и лишнего накидать :)
Спасибо огромное, в принципе я разобрался с configure.ac, поступил проще, сложил все исходники в один каталог, и все нормально собралось и работает. Изменения уже в репозитарии https://github.com/CHERTS/esp8266-liblwip
 

CHERTS

Moderator
Команда форума
Это несерьезно :(
Нет времени ковырять configure.ac с тем чтобы он нормально собирал библиотеку если она разбита на кучу каталогов, может на неделе поковыряю еще если получится в любом случае исходники выложу на github, а пока все собирается и работает. Сегодня может разберусь с IoT_Demo, чтобы там все нормально собиралось, хотя опять же, зачем если можно собрать отдельно libjson и liblwip, закинуть их в SDK и собирать IoT_Demo с библами из SDK.
 

pvvx

Активный участник сообщества
хотя опять же, зачем если можно собрать отдельно libjson и liblwip, закинуть их в SDK и собирать IoT_Demo с библами из SDK.
Это не оптимально для отладки сложных проектов совместно с изменениями в либах.
Простейший пример - надо вставить отладочную инфу для вывода в консоль, в библиотечную функцию. Придется менять либу в SDK. Но это можно забыть там, собирая другой проект. Ну и т.д.
Тем более ни у кого не возникает проблемм с имеющимися makefile в SDK. Зачем их переписывать - с одной целью, чтобы добавить свои ошибки? :)
 

CHERTS

Moderator
Команда форума
Это не оптимально для отладки сложных проектов совместно с изменениями в либах.
Простейший пример - надо вставить отладочную инфу для вывода в консоль, в библиотечную функцию. Придется менять либу в SDK. Но это можно забыть там, собирая другой проект. Ну и т.д.
Тем более ни у кого не возникает проблемм с имеющимися makefile в SDK. Зачем их переписывать - с одной целью, чтобы добавить свои ошибки? :)
Сложные проекты отлаживают совершенно по другому. Как правило, для отладки либо собирается отдельная версия библиотеки с включением вывода отладочной информации на консоль или в файл, то есть библиотека изначально проектируется и пишется с таким расчетом, либо в библиотеке есть некая функция, которая отвечает за уровень вывода детализации в лог. Если liblwip состоит из примерно 40 файлов и собирается за 10-15 сек, то есть библиотеки на сборку которых уходят по 2-3 часа и даже больше (попробуйте собрать OpenOffice из исходников, Вы сильно удивитесь как долго он собирается) и если бы в ник применялась Ваша методика, то разработчики бы вечно писали и компилировали эти библиотеки и не достигли результата. Так что добавлять исходники библиотек в свой проект, когда они есть уже заранее собранные - это плохая идея, нужно правильно проектировать библиотеки.
 

pvvx

Активный участник сообщества
Сложные проекты отлаживают совершенно по другому. Как правило, для отладки либо собирается отдельная версия библиотеки с включением вывода отладочной информации на консоль или в файл, то есть библиотека изначально проектируется и пишется с таким расчетом, либо в библиотеке есть некая функция, которая отвечает за уровень вывода детализации в лог. Если liblwip состоит из примерно 40 файлов и собирается за 10-15 сек, то есть библиотеки на сборку которых уходят по 2-3 часа и даже больше (попробуйте собрать OpenOffice из исходников, Вы сильно удивитесь как долго он собирается) и если бы в ник применялась Ваша методика, то разработчики бы вечно писали и компилировали эти библиотеки и не достигли результата. Так что добавлять исходники библиотек в свой проект, когда они есть уже заранее собранные - это плохая идея, нужно правильно проектировать библиотеки.
Вам про это и написал - если меняете что-то в одной из либов, то другие не собираются (учитесь писать маке). Во вторых - читать логи с выводом миллионов сообщений от всех функций - это абсурд. В третьих у многих MCU, как и у данного ESP8266 нету памяти для вывода всех отладочных соо, да падает производительность до нерабочего состояния. :p Видно что с MCU не имели дело - там не бывает миллионов либов.
 
Последнее редактирование:
Сверху Снизу