• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

arduino ide watchdog и утечка?

Vitaly

Member
Тестировал получение данных и получил при срабатывании вочдога уменьшение памяти
Канал связи там плохой, предполагаю, что отправка данных при отсутствии связи затупливает и выходит на рестарт

что странно - при каждом рестарте уменьшается ESP.getFreeHeap()
даже с не уменьшением millis() можно жить, но память? :)

arduino 1.6.5 дополнения установлены через board manager - не nightly

Код:
[12/Jul/2015:08:36:09] "GET /data/store.php?i=1A5F&uptime=46842&freeram=26064&28BB4A7606000022=28.12 HTTP/1.0" 200 2 "-" "arduinoESP8266"
[12/Jul/2015:08:41:08] "GET /data/store.php?i=1A5F&uptime=47142&freeram=26064&28BB4A7606000022=28.25 HTTP/1.0" 200 2 "-" "arduinoESP8266"

[12/Jul/2015:08:43:05] "GET /data/store.php?log=init&text=i:1A5F,freeram:26064,locip:192.168.0.100,uptime:47259 HTTP/1.0" 200 1 "-" "arduinoESP8266"
[12/Jul/2015:08:43:41] "GET /data/store.php?log=init&text=i:1A5F,freeram:26064,locip:192.168.0.100,uptime:47294 HTTP/1.0" 200 1 "-" "arduinoESP8266"

[12/Jul/2015:08:46:10] "GET /data/store.php?i=1A5F&uptime=47442&freeram=26064&28BB4A7606000022=28.25 HTTP/1.0" 200 2 "-" "arduinoESP8266"
[12/Jul/2015:08:51:09] "GET /data/store.php?i=1A5F&uptime=47742&freeram=25896&28BB4A7606000022=28.31 HTTP/1.0" 200 2 "-" "arduinoESP8266"
[12/Jul/2015:08:56:09] "GET /data/store.php?i=1A5F&uptime=48042&freeram=25896&28BB4A7606000022=28.44 HTTP/1.0" 200 2 "-" "arduinoESP8266"
[12/Jul/2015:08:56:10] "GET /data/store.php?i=1A5F&uptime=48042&freeram=25896&28BB4A7606000022=28.44 HTTP/1.0" 200 2 "-" "arduinoESP8266"
[12/Jul/2015:09:01:09] "GET /data/store.php?i=1A5F&uptime=48342&freeram=25896&28BB4A7606000022=28.56 HTTP/1.0" 200 2 "-" "arduinoESP8266"
[12/Jul/2015:09:06:09] "GET /data/store.php?i=1A5F&uptime=48642&freeram=25896&28BB4A7606000022=28.50 HTTP/1.0" 200 2 "-" "arduinoESP8266"
[12/Jul/2015:09:16:09] "GET /data/store.php?i=1A5F&uptime=49242&freeram=25896&28BB4A7606000022=28.44 HTTP/1.0" 200 2 "-" "arduinoESP8266"
[12/Jul/2015:09:21:09] "GET /data/store.php?i=1A5F&uptime=49542&freeram=25896&28BB4A7606000022=28.56 HTTP/1.0" 200 2 "-" "arduinoESP8266"

[12/Jul/2015:09:22:19] "GET /data/store.php?log=init&text=i:1A5F,freeram:25896,locip:192.168.0.100,uptime:49612 HTTP/1.0" 200 1 "-" "arduinoESP8266"

[12/Jul/2015:09:26:09] "GET /data/store.php?i=1A5F&uptime=49842&freeram=25896&28BB4A7606000022=28.62 HTTP/1.0" 200 2 "-" "arduinoESP8266"
[12/Jul/2015:09:31:09] "GET /data/store.php?i=1A5F&uptime=50142&freeram=25896&28BB4A7606000022=28.75 HTTP/1.0" 200 2 "-" "arduinoESP8266"

[12/Jul/2015:09:35:32] "GET /data/store.php?log=init&text=i:1A5F,freeram:25896,locip:192.168.0.100,uptime:50405 HTTP/1.0" 200 1 "-" "arduinoESP8266"

[12/Jul/2015:09:36:13] "GET /data/store.php?i=1A5F&uptime=50442&freeram=25704&28BB4A7606000022=28.94 HTTP/1.0" 200 2 "-" "arduinoESP8266"
[12/Jul/2015:09:41:14] "GET /data/store.php?i=1A5F&uptime=50742&freeram=25536&28BB4A7606000022=29.12 HTTP/1.0" 200 2 "-" "arduinoESP8266"
[12/Jul/2015:10:01:09] "GET /data/store.php?i=1A5F&uptime=51942&freeram=25536&28BB4A7606000022=29.31 HTTP/1.0" 200 2 "-" "arduinoESP8266"

[12/Jul/2015:10:02:58] "GET /data/store.php?log=init&text=i:1A5F,freeram:25536,locip:192.168.0.100,uptime:52051 HTTP/1.0" 200 1 "-" "arduinoESP8266"
[12/Jul/2015:10:03:46] "GET /data/store.php?log=init&text=i:1A5F,freeram:25352,locip:192.168.0.100,uptime:52099 HTTP/1.0" 200 1 "-" "arduinoESP8266"
[12/Jul/2015:10:04:54] "GET /data/store.php?log=init&text=i:1A5F,freeram:25352,locip:192.168.0.100,uptime:52167 HTTP/1.0" 200 1 "-" "arduinoESP8266"

[12/Jul/2015:10:06:09] "GET /data/store.php?i=1A5F&uptime=52242&freeram=25352&28BB4A7606000022=29.25 HTTP/1.0" 200 2 "-" "arduinoESP8266"

[12/Jul/2015:10:06:54] "GET /data/store.php?log=init&text=i:1A5F,freeram:25352,locip:192.168.0.100,uptime:52287 HTTP/1.0" 200 1 "-" "arduinoESP8266"

[12/Jul/2015:10:11:09] "GET /data/store.php?i=1A5F&uptime=52542&freeram=25168&28BB4A7606000022=29.12 HTTP/1.0" 200 2 "-" "arduinoESP8266"
[12/Jul/2015:10:41:09] "GET /data/store.php?i=1A5F&uptime=54342&freeram=25168&28BB4A7606000022=28.62 HTTP/1.0" 200 2 "-" "arduinoESP8266"
[12/Jul/2015:10:46:11] "GET /data/store.php?i=1A5F&uptime=54642&freeram=25168&28BB4A7606000022=28.50 HTTP/1.0" 200 2 "-" "arduinoESP8266"
[12/Jul/2015:10:51:09] "GET /data/store.php?i=1A5F&uptime=54942&freeram=25000&28BB4A7606000022=28.25 HTTP/1.0" 200 2 "-" "arduinoESP8266"
[12/Jul/2015:10:56:09] "GET /data/store.php?i=1A5F&uptime=55242&freeram=25000&28BB4A7606000022=28.19 HTTP/1.0" 200 2 "-" "arduinoESP8266"
[12/Jul/2015:11:01:11] "GET /data/store.php?i=1A5F&uptime=55542&freeram=25000&28BB4A7606000022=28.19 HTTP/1.0" 200 2 "-" "arduinoESP8266"
[12/Jul/2015:11:11:09] "GET /data/store.php?i=1A5F&uptime=56142&freeram=25000&28BB4A7606000022=28.25 HTTP/1.0" 200 2 "-" "arduinoESP8266"

[12/Jul/2015:11:15:44] "GET /data/store.php?log=init&text=i:1A5F,freeram:25000,locip:192.168.0.100,uptime:56417 HTTP/1.0" 200 1 "-" "arduinoESP8266"

[12/Jul/2015:11:21:09] "GET /data/store.php?i=1A5F&uptime=56742&freeram=25000&28BB4A7606000022=27.94 HTTP/1.0" 200 2 "-" "arduinoESP8266"
[12/Jul/2015:11:26:10] "GET /data/store.php?i=1A5F&uptime=57042&freeram=25000&28BB4A7606000022=27.94 HTTP/1.0" 200 2 "-" "arduinoESP8266"
 
Последнее редактирование:

pvvx

Активный участник сообщества
что странно - при каждом рестарте уменьшается ESP.getFreeHeap()
На структуру PCB. См. TIME_WAIT
и поиск "TIME_WAIT" по форуму. Надо правильно работать с TCP, не нарушая стандартов. У каждого третьего, если сообщение про TCP одно и то-же...
И WDT тут при чем? В SDK 1.2.0 есть системная команда отключения WDT, что есть плохой вариант - для чего тогда он служит? В других SDK c 1.0.x до 1.2.0 WDT отключить нельзя и в Arduino работа с WDT сделана некорректно. Т.е., на сегодня, трогать WDT в Arduino на ESP8266 нельзя. Если он срабатывает - меняйте алгоритм и решайте задачу по событиям: отработали событие и вышли, без всяких циклов "маин" и особенно delay(). Вместо delay() есть таймер...
 
Последнее редактирование:

Vitaly

Member
в "скетче" 3шт delay - 100ms, 20ms и 20ms

вся "работа" с tcp взята из примера
Код:
void sendURL(String url) {

  WiFiClient client;

  if (!client.connect(URL_HOST, URL_PORT)) {
    Serial.println("connection failed");
    return;
  }

  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + URL_HOST + "\r\n" +
               "Connection: close\r\n" +
               "User-Agent: arduinoESP8266\r\n" +
               "\r\n");
  delay(20);

  while (client.available()) {
    String line = client.readStringUntil('\r');
    //Serial.print(line);
  }

}
какие таймауты tcp можно менять для работы в arduino ide?
 

pvvx

Активный участник сообщества
в "скетче" 3шт delay - 100ms, 20ms и 20ms

вся "работа" с tcp взята из примера
...
какие таймауты tcp можно менять для работы в arduino ide?
А пинг у модуля менее 5 ms. И пакеты идут при нормальной работе с интервалами в пару ms (трансфер по TCP у модуля ESP8266 более 1.2 мегабайта в секунду).
Интервал WDT до 1.6 секунды (SDK > 1.0.0). Система тоже должна работать.
Каждое закрытое соединения TCP первым, по вашей инициативе, требует пару сотен байт в heap на 60 секунд.
Реализация "client.xx" годиться только для 1 запроса в одну минуту.
Вот основные условия. Не нравится - пишите на SDK, а не Arduino или требуйте исправления её реализации у авторов.
 

Vitaly

Member
А пинг у модуля менее 5 ms. И пакеты идут при нормальной работе с интервалами в пару ms (трансфер по TCP у модуля ESP8266 более 1.2 мегабайта в секунду).
Интервал WDT до 1.6 секунды (SDK > 1.0.0). Система тоже должна работать.
Каждое закрытое соединения TCP первым, по вашей инициативе, требует пару сотен байт в heap на 60 секунд.
Вот основные условия.
Соединение происходит 1 (одно) каждые 5 минут, delay уменьшу или уберу. Проблема не в нем, проблема в связи. Есть ли в arduino возможность что-то настраивать в tcp для плохих условий связи.

Почему при срабатывании WDT и рестарте что-то остается занято? Разве ресет не ведет к инициализации всего?

опять же крутить ручку pcb_time_wait_free в ардуине никак не получится?
 

pvvx

Активный участник сообщества
Соединение происходит 1 (одно) каждые 5 минут, delay уменьшу или уберу. Проблема не в нем, проблема в связи. Есть ли в arduino возможность что-то настраивать в tcp для плохих условий связи.
Вроде нет. И что можно настроить, если к примеру, большое кол-во потерянных пакетов? Но проблема наверняка не в том, а в том что соединения "бросаются" на произвол и сторонняя часть (+ роутеры на пути) на другом конце сети в "шоке" от таких действий. И как работать другим, если у вас пакеты обслуживаются только через паузу в сотни ms?
Почему при срабатывании WDT и рестарте что-то остается занято? Разве ресет не ведет к инициализации всего?
Может вы что сохраняете в какой ресурс и этот ресурс используется при последующем старте (грузиться в память)?

опять же крутить ручку pcb_time_wait_free в ардуине никак не получится?
В китай-SDK есть китай-метод убивать TIME_WAIT. Но это приведет к бедам в сети...

PS: Иногда примеры кода дают не для повтора и использования в реальных проектах, а для демонстрации набора команд.
 
Последнее редактирование:

Vitaly

Member
Вроде нет. И что можно настроить, если к примеру, большое кол-во потерянных пакетов? Но проблема наверняка не в том, а в том что соединения "бросаются" на произвол и сторонняя часть (+ роутеры на пути) на другом конце сети в "шоке" от таких действий.
Там 3г модем по дороге, вот на нем иногда связи просто нет. Предполагаю в момент реконнекта модема соединение подвисает до срабатывания wdt.

В коде соединение закрывается по выходу из функции, WiFiClient client; объявлен прямо в ней.

Может вы что сохраняете в какой ресурс и этот ресурс используется при последующем старте (грузиться в память)?
никаких ресурсов расти не может, обычный же ресет начинает с нормального значения памяти

только срабатывание wdt и (предположительно) ESP.reset() не скидывает счетчики millis и что-то в памяти


В китай-SDK есть китай-метод убивать TIME_WAIT. Но это приведет к бедам в сети...
это про него писалось? "Espressif в своем SDK сделало опцию в esp_conn - убийства TIME_WAIT. Но это подходит только игрушкам, т.к. является нарушением спецификации TCP"
 

pvvx

Активный участник сообщества
Там 3г модем по дороге, вот на нем иногда связи просто нет. Предполагаю в момент реконнекта модема соединение подвисает до срабатывания wdt.
Дык в приведенном примере возможен вечный цикл. На нем и WDT. Не вызывайте никаких процедур в Arduino связанных с WDT - пока они некорректны на новых SDK и ведут к "фиг знает чему" с последствиями в самом SDK.
никаких ресурсов расти не может, обычный же ресет начинает с нормального значения памяти
только срабатывание wdt и (предположительно) ESP.reset() не скидывает счетчики millis и что-то в памяти
Тогда это что-то из области фантастики :)
это про него писалось? "Espressif в своем SDK сделало опцию в esp_conn - убийства TIME_WAIT. Но это подходит только игрушкам, т.к. является нарушением спецификации TCP"
Да :) Иногда приходится идти на это, когда масса ограничений и на пути сети кривой proxy, который не любит брать на себя "TIME_WAIT" :)
 

Vitaly

Member
Дык в приведенном примере возможен вечный цикл. На нем и WDT.
оу, попробую поменять
Не вызывайте никаких процедур в Arduino связанных с WDT - пока они некорректны на новых SDK и ведут к "фиг знает чему" с последствиями в самом SDK.
Так я и не вызывал, он по дефолту включен и сам срабатывает.
Тогда это что-то из области фантастики :)
По факту есть две проблемы :)

1. в коде - подумаю, переделаю
2. в процедуре софт ресета arduino esp, что-то недочищается

Из ардуины все равно недоступно?
 

pvvx

Активный участник сообщества
Из ардуины все равно недоступно?
Почему? Всегда можно найти указатель на pcb в LwIP от соединения и есл он переведен в режим time_wait - грохнуть его средствами LwIP.
У вас ещё возможны повторные пакеты, пытающиеся восстановить прерванное соединение, после некорректного завершения. После рестарта модуля они тоже могут приходить и LwIP закрывает такие соединения - начинается "пляска с бубуном" в сети, т.к. отправивший не согласен с "abort" соединения по TCP, т.к. LwIP и не знает, после перезагрузки что это было его предыдущее установленное соединение и т.д.. Надо ставить логер типа Wireshark на соединение.
Основная причина "плохого соединения" у ESP8266 в режиме клиента - не полная поддержка 802.11n. Ставьте стандарт ниже в WiFi (опция phy ESP8266)...
Но делать из Arduino монстра тоже не стоит :) Это же среда для демки, а не спец проект под определенные задачи со всеми корректно разрешаемыми ситуациями для него...
 
Последнее редактирование:
Сверху Снизу