• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 не имели дело - там не бывает миллионов либов.
 
Последнее редактирование:
Сверху Снизу