Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

Общие вопросы по Arduino IDE для ESP8266

Тема в разделе "ESP8266 Arduino IDE", создана пользователем Victor, 28 мар 2015.

  1. Sermus

    Sermus Читатель

    Сообщения:
    110
    Симпатии:
    15
    Тогда, я подозреваю, при попытке послать что-нибудь через последовательный интерфейс в направлении ESP с GPIO0 начнут происходить сюрпризы.
     
  2. anakod

    anakod Moderator Команда форума

    Сообщения:
    314
    Симпатии:
    100
    По идее - да, но пока не особо понятна возможная реализация. Дело в том что Sming использует нативный для LWIP подход - асинхронные callback вызовы (но при этом красиво оборачивает их чтобы пользователю не нужно было думать о внутренней части). Ардуино - напротив работает в loop модели с последовательным вводом-выводом.

    Вообще вариант интеграции Sming с данным проектом мог бы быть как раз по линии веб серверы + файловая система. Т.е. если пользователь хочет использовать классические Ардуиновские WEB сервера - пожалуйста, подключает библиотеку, использует. Если хочет большего функционала - подключает Sming библиотеку(библиотеки), получает более полноценный HTTP клиент\сервер с файловым хранилищем и полноценными шаблонами.

    @igrr, какие у Вас есть идеи по этому поводу?
     
    JustACat нравится это.
  3. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.121
    Симпатии:
    1.243
    Ещё не известно, не подхвачена ли в них "зараза" от espconn. Бегло смотрев исходники в данной библиотеке не нашел отличий алгоритмов обращений от espconn - всё те-же самые ошибки: нет проверки закрыто или нет соединение, если, к примеру идет обращение "со стороны" (таймер или ещё чаго) по старому указателю на pcb (которого уже нет или там разместился новый), а не отработка callback вызванной самой LwIP c выданным текущем указателем на pcb. :)
     
  4. anakod

    anakod Moderator Команда форума

    Сообщения:
    314
    Симпатии:
    100
    pvvx, Sming подразумевает что ведущая роль в работе сервера за ним. Т.е. он сам вызывает callback когда ждет фрагмент данных. Более того - сохранять указатель на открытое соединение - явно грубое нарушение, т.к. конечный пользователь ничего о нем не знает и нигде его не имеет/не хранит, кроме момента вызова внутри callback.

    Проще показывать на примере: https://github.com/anakod/Sming/blob/master/HttpServer_Bootstrap/app/application.cpp

    А так - любой код может содержать ошибки, от них никто не застрахован. Хорошо бы иметь UNIT тесты, но как создать тестовую среду? По эмуляторам пока вроде все слабовато..
     
  5. Victor

    Victor Administrator Команда форума

    Сообщения:
    2.203
    Симпатии:
    378
    @igrr , есть вот такая идея реализации прошивки модуля по воздуху.
    А что если для прошивки ESP8266 использовать вторую ESP8266?
    Эту, вторую, условно назовем WiFi программатором. Заливаем в нее специально разработанную прошивку (лучше всего скетч), прописываем пароль домашнего WiFi роутера и поднимаем mDNS, подключаем к ESP8266 (или Arduino), которую надо программировать. Подключаем их друг к другу UARTами, один из GPIO программатора подключаем к RESET жертвы, еще один свободный GPIO программатора к GPIO0. В Arduino IDE выбираем драйвер программатор WiFiProgrammer, он по имени WiFiProg.local подключается к нашему программатору по TCP/IP, и шлет новую прошивку по воздуху. Программатор дергает GPIO0 и RESET жертвы как положено и шьет ее. Далее этот же драйвер программатора (или отдельная утилита) используется как debug терминал, принимая по WiFi данные из UARTа жертвы.
    Можно также реализовать и без домашнего роутера, если настроить в программаторе точку доступа.

    С одной стороны программатор - это лишнее устройство, а с другой - универсальное решение для программирования (и отладки!) чего угодно по WiFi из Arduino IDE.
    Ну и wifio будут брать парами, а не по одной :)
     
  6. aloika

    aloika Активный участник сообщества

    Сообщения:
    366
    Симпатии:
    25
  7. alexhi

    alexhi Читатель

    Сообщения:
    77
    Симпатии:
    15
    Здравствуйте! Запускаю пример на компиляцию и получаю ошибку
    \DOCUME~1\9335~1\LOCALS~1\Temp\build8547920213757854907.tmp\WiFiWebServer.cpp -o C:\DOCUME~1\9335~1\LOCALS~1\Temp\build8547920213757854907.tmp\WiFiWebServer.cpp.o
    c:\projects\Tools\arduino-1.6.1/hardware/tools/esp8266/xtensa-lx106-elf/bin/xtensa-lx106-elf-g++ возвратил 128
    Ошибка компиляции.
    В чем может быть дело ?
     
  8. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.121
    Симпатии:
    1.243
    Значит вы не поняли. callback вызывает LwIP. О вашей передаче данных в pcb LwIP ничего не знает и никак не может вызывать callback c передачей указателя на нужный вам и ещё активный у него pcb :) Он пока не умеет гадать,когда вы соизволите начать отправку. Та-же ошибка жила и в espconn. Но в поздних версиях её устранили, путем предварительного поиска в списках LwIP pcb на необходимое соединение (содрав методу из моего патча для неё), путем сравнения номера порта и ip host и remote, которые были заранее запомнены при открытии соединения. И теперь espconn всегда тупит и ищет pcb, перед почти любым действием... :)
    В Sming, я наблюдал только вызов какой-то post-task в процедуре poll на активный pcb, которую вызывает LwIP. Но она вызывается не часто и между этими вызовами LwIP уже может грохнуть ту pcb, если на него придет FIN, ACK. Стеком TCP не вы управляете, а LwIP и он вызывает callback с указателем на активный pcb, если там что происходит... И при множестве активных соединений там тысячи перестановок в этих pcb в секунду :)
     
    Последнее редактирование: 2 апр 2015
  9. Lazy Fox

    Lazy Fox Новичок

    Сообщения:
    5
    Симпатии:
    1
    Такая же проблема, после распаковки ArduinoIDE любой скетч (даже пустой) компилится так:
    Код (Lua):
    1. void setup() {
    2.   // put your setup code here, to run once:
    3. }
    4. void loop() {
    5.   // put your main code here, to run repeatedly:
    6. }
    ==============================================
    Arduino: 1.6.1 (Windows 7), Плата"Generic ESP8266 board"
    Изменена опция сборки, пересобираем все
    C:\Program Files\Arduino/hardware/tools/esp8266/xtensa-lx106-elf/bin/xtensa-lx106-elf-g++ -D__ets__ -DICACHE_FLASH -IC:\Program Files\Arduino/hardware/tools/esp8266/sdk//include -c -Os -mlongcalls -mtext-section-literals -fno-exceptions -fno-rtti -std=c++11 -MMD -DF_CPU=80000000L -DARDUINO=10601 -DARDUINO_ESP8266_ESP01 -DARDUINO_ARCH_ESP8266 -IC:\Program Files\Arduino\hardware\esp8266com\esp8266\cores\esp8266 -IC:\Program Files\Arduino\hardware\esp8266com\esp8266\variants\esp01 C:\Users\admin\AppData\Local\Temp\build5046200345775703863.tmp\sketch_apr02a.cpp -o C:\Users\admin\AppData\Local\Temp\build5046200345775703863.tmp\sketch_apr02a.cpp.o

    Ошибка компиляции.
    ==============================================

    Подозреваю что кроме распаковки архива с ArduinoIDE в каталог с установленной ардуиной нужно было проделать некие танцы с бубном
     
  10. anakod

    anakod Moderator Команда форума

    Сообщения:
    314
    Симпатии:
    100
    Думаю да мы не совсем поняли друг друга, а если точнее я неудачно выразился. Разумеется не Sming играет ведующую роль (точнее он играет но только по отношению к конечному разработчику), а по факту изначальная инциацива за LWIP. Поэтому отправка происходит только внутри callback вызовов LWIP, соответственно:
    1. Соединение не может быть неверным в момент обратного вызова (не зря же нам LWIP этот хендл передает в функцию). Конечно не считая NULL и т.п. Но я офф.доки внимательно читал, надеюсь что все учел правильно
    2. Мы в начале всегда берем не какой-нибудь наш сохраненный указатель на класс (в котором мог, теоретически, бы быть неверный хендл), а наоборот по хендлу который дал LWIP ищем наш класс
    3. Как только приходит событие о закрытии соединения от внешней стороны (а LWIP нас должен уведомить соответствующим callback) или как только сам пользователь закрывает соединение, хендлу присваивается NULL. Поэтому дальше даже в случае если пользователь каким-то совсем уж диким образом обратиться к объекту, он получит вполне честный exception.
     
    JustACat нравится это.
  11. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.121
    Симпатии:
    1.243
    Тогда верно, но до уровня приоритетов прерываний всей цепочки WiFi-SDK-LwIP-User :)
    А в SDK по данному поводу БЯДА... От туда и возник тот метод патча espconn с поиском pcb. По другому не решалось и дало хоть минимальную стабильность... Если приоритеты починили - тогда будет всё Ok...
     
    Последнее редактирование: 3 апр 2015
  12. anakod

    anakod Moderator Команда форума

    Сообщения:
    314
    Симпатии:
    100
    Да в СДК много бед.. Вы кстати libpp разбирали?

    Что касается похода основанного на callback, это было изначальной архитектурной задумкой чтобы избежать промежуточных буферов и потери памяти.
     
  13. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.121
    Симпатии:
    1.243
    Промежуточные буфера всё равно будут. Копаться в буферах LwIP не гуд. Их сегментированность не дает возможностей применения строковых поисков и т.д.
    libpp - частично. Смотрел, но не разгребал.
    Пока стоит задача с libmain.a - она не дает работать в режиме малого потребления и всё остальное уже мелочи, т.к. одна из главных задач на модуле (из-за неё и её стартовых процедур) не решается.
     
    Последнее редактирование: 3 апр 2015
  14. anakod

    anakod Moderator Команда форума

    Сообщения:
    314
    Симпатии:
    100
    В Sming я реализовал специальные функции для строкого поиска/сравнения/копирования в цепочке буферов lwip. Но в других местах все равно конечно кок-какие буферы заводить пришлось, без них не удобно уже конечному пользователю (но они обычно поменьше чем для входных данных).

    Про декомпиляцию - не поделитесь ли методикой? А то я в соседней ветке мучаюсь :(
     
  15. AnonymUser

    AnonymUser Новичок

    Сообщения:
    27
    Симпатии:
    2
    было аналогично, проблема описанная с библиотекой не решила проблему
    скачали отсюда https://github.com/esp8266/Arduino и норм компилит
     
    Victor нравится это.
  16. igrr

    igrr Moderator Команда форума

    Сообщения:
    70
    Симпатии:
    23
    @lazy-fox
    @alexhi
    С компиляцией под windows проблема в криво собранном тулчейне — gcc зависит от libiconv, который прилинковался динамически. Нужно пересобрать, чтобы не требовалась дополнительная dll-ка.
     
  17. Victor

    Victor Administrator Команда форума

    Сообщения:
    2.203
    Симпатии:
    378
    igrr, не все могут пересобрать Arduino IDE
    Lazy Fox и @alexhi , пока воспользуйтесь вот этим советом:
    скопируйте файл libiconv-2.dll из arduino-1.6.1\hardware\tools\avr\libexec\gcc\avr\4.8.1 в arduino-1.6.1
     
    alexhi и Lazy Fox нравится это.
  18. igrr

    igrr Moderator Команда форума

    Сообщения:
    70
    Симпатии:
    23
    Собственно я тоже не могу пересобрать правильно тулчейн, иначе уже давно бы починил :) И винды у меня вообще нет.
    Если кто-нибдуь знает, как его правильно пересобрать под win x32, или где взять работающую сборку — welcome.
     
  19. jcmvbkbc

    jcmvbkbc Читатель

    Сообщения:
    179
    Симпатии:
    17
    https://gist.github.com/fpoussin/7ae55b5a5bd9a28ce21d не?
     
  20. igrr

    igrr Moderator Команда форума

    Сообщения:
    70
    Симпатии:
    23
    Его и использовал, получается зависимость на libiconv-2.dll.
    Говорят, нужно снести libiconv, установленный вместе с mingw, и собрать его самостоятельно, -static. Если кто-нибудь может это попробовать на локальной машине, буду признателен — на билд-сервере очень неудобно экспериментировать.
     

Поделиться этой страницей