• Система автоматизации с открытым исходным кодом на базе 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 монстра тоже не стоит :) Это же среда для демки, а не спец проект под определенные задачи со всеми корректно разрешаемыми ситуациями для него...
 
Последнее редактирование:
Сверху Снизу