Обсуждение ESP32 периодически зависает

kochetovvin

New member
Я же говорю - новичок, половину кода вообще не понимаю. Т.е. зависает когда связь теряется? Хотя я проверял, отключал wifi на роутере и в сериал температура шла, часы тоже ходили, после включения wifi заново коннектился.
 
Последнее редактирование:

pvvx

Активный участник сообщества
В отдельном таске на сокете, который не перевел в nonblocking режим, вызываю recv и через некоторое время в уарте вижу ругань от WDT, вот так.
А куда посажен WDT в ESP-32 в конкретной версии Arduino?
Его надо самому пересбрасывать или на Idle?
while(1) {}; не должна вызывать ничего в RTOS. Анализатора что какой-то процесс застрял на одной и той-же команде в ней нет. Можно его грохнуть закрытием данного процесса...
Если выпадает по WDT и не описано, что пользователь должен его сам сбрасывать, то значит такую систему в помойку.
У ТС всё равно производится реконнект через промежуток времени и WDT он не обнаружит в MQTT данных. Ну перезагрузится модуль, переконнектится и отправит данные в MQTT.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Это не глюк, приложение не детектирует отключение устройства и своевременно не закрывает порт, после нового подключения, если повезет, наше устройство уже оказывается на новом порту.
Ну и фиг с данной программой, что файл у неё закрылся. Дрова USB тоже закрылись, дескрипторы сменились с новым включением и возникла новая связка и индексы... Почему тогда новое подключение не отрабатывает в зависимости от дров? На одних отрабатывает, на других - нет. :)

Монитором назвать такое приложение сложно, не понятно по какой причине эти так называемые "мониторы" позволяют вводить только название ком-порта например COM3, а не дают возможность определять порт по описанию драйвера например "Silicon Labs CP210x USB to UART Bridge" или матчить по FriendlyName
Это никому не нужно. Зачем забивать голову пользователю лишней информацией и загромождать дисплей? Это не Linux, тут всё для комфорта работы, а не для времяпровождения в ковырянии потрохов системы для того чтобы что-то запустить. Разные концепции у систем.
Функция получения имени устройства у дров есть, как и встроенная поддержка среды Linux в Win10 в WSL, чего не сказать о Linux :)
 
Последнее редактирование:

pvvx

Активный участник сообщества
Все равно зависает. Может дело все таки в "говнокоде"?
Мой первый проект, скетч собирал с миру по нитке. Вставил вчера вечером ресет по ватчтоду, теперь видно по логу MQTT, что за ночь перезапускалась два раза.
У вас в скетче стоит пересброс на таймере через 30 сек после старта. Почему тогда перезапуск был всего 2 раза? :eek:
Ночь у вас 1 минуту? :)
---
Ага - нет вызова timerStart();
Т.е. всё связанное с таймером - это лишний код, чтобы запутать :)
 
Последнее редактирование:

Алексей.

Active member
А куда посажен WDT в ESP-32 в конкретной версии Arduino?
Вы спрашивали "Какой WDT на RTOS в отдельном потоке (ESP-32)?" я ответил, Как реализовано в ардуино не знаю, не смотрел, должны знать пользователи ардуины :)

Если выпадает по WDT и не описано, что пользователь должен его сам сбрасывать, то значит такую систему в помойку.
Пользователь должен иметь представление что происходит, в выполнил длительную операцию и получил по рукам от wdt, больше так не делаю.

У ТС всё равно производится реконнект через промежуток времени и WDT он не обнаружит в MQTT данных. Ну перезагрузится модуль, переконнектится и отправит данные в MQTT.
В коннесте как то и не подумали про wdt
Код:
int WiFiClient::connect(IPAddress ip, uint16_t port)
{
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        log_e("socket: %d", errno);
        return 0;
    }

    uint32_t ip_addr = ip;
    struct sockaddr_in serveraddr;
    bzero((char *) &serveraddr, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    bcopy((const void *)(&ip_addr), (void *)&serveraddr.sin_addr.s_addr, 4);
    serveraddr.sin_port = htons(port);
    int res = lwip_connect_r(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr));
    if (res < 0) {
        log_e("lwip_connect_r: %d", errno);
        close(sockfd);
        return 0;
    }
    clientSocketHandle.reset(new WiFiClientSocketHandle(sockfd));
    _connected = true;
    return 1;
}

Ну и фиг с данной программой, что файл у неё закрылся. Дрова USB тоже закрылись, дескрипторы сменились
Подскажите как на удобном виндовсе выгрузить (деинсталлировать) юсб-драйвер устройства. Что то порой не получается.

встроенная поддержка среды Linux в Win10 в WSL
Поддержка приложений, не поддержка драйверов ядра, и кому он нужен.
Что то никому в голову не приходит реализовать поддержку виндовса в таких устройствах как юсб-модемы, вифи-роутеры, вифи-камеры. Может он и не нужен этот виндовс в этих устройствах?
Использование wsl обусловлено тем, я думаю, что нужно порой собирать код средствами доступными на никсах, а для чего нужна поддержка виндовса если разработка требуемого ПО с виндовсом совсем не связана, я не знаю.
 

pvvx

Активный участник сообщества
Вы спрашивали "Какой WDT на RTOS в отдельном потоке (ESP-32)?" я ответил, Как реализовано в ардуино не знаю, не смотрел, должны знать пользователи ардуины :)
Для ESP-32 несколько вариантов Arduino. ТС не указал какой использован им.
Пользователь должен иметь представление что происходит, в выполнил длительную операцию и получил по рукам от wdt, больше так не делаю.
Это ошибочное мнение. Может я хочу исполнять while(1); для нагрева чипа.
Описание у WDT на IDF есть и там описано что надо сделать, чтобы он возник. Ваша ситуация не при этих делах. Она не останавливает переключатель задач в RTOS на время более WDT и других ситуаций не происходит, типа while(1); в аппаратном прерывании.
Т.е., если судить по описанию, то WDT у TC происходит по причине корявости самих библиотек - скорее всего конфликтов на низком уровне связанных с двумя ядрами.
В коде ТС есть повторные вхождения в некоторые процедуры, но неизвестно, стоит ли проверка в них самих с высвобождением старых ресурсов и ковыряться нет желания, т.к. сама система на ESP-32 ещё не отработана. Вообще не понятно зачем там второе ядро, если не может обслуживать WiFi и системные запросы... Какая-то уродливость.
Подскажите как на удобном виндовсе выгрузить (деинсталлировать) юсб-драйвер устройства. Что то порой не получается.
В каком windows и на каком уровне? В консоле или ?
Это устроит Удаление пакета драйверов из хранилища драйверов :)
Сами пользоваться поиском в инет не умеете? :)
Поддержка приложений, не поддержка драйверов ядра, и кому он нужен.
Всем, кому надо :)
Что то никому в голову не приходит реализовать поддержку виндовса в таких устройствах как юсб-модемы, вифи-роутеры, вифи-камеры. Может он и не нужен этот виндовс в этих устройствах?
Скорее всего он не нужен там, как и Linux со своим нагромождением 99% лишнего кода, совершенно не нужного в данных устройствах. Наверно по этому и возник OpenWRT, как урезанная система для таких устройств. Но Win10 имеет и вариант для таких устройств. Это им в голову пришло и давно реализовано.
Использование wsl обусловлено тем, я думаю, что нужно порой собирать код средствами доступными на никсах, а для чего нужна поддержка виндовса если разработка требуемого ПО с виндовсом совсем не связана, я не знаю.
Примерно для этого и сделано. Не ждать же когда писатели Linux купят/получат NDA на новое оборудование и напишут что для него. Как пример с "ошибкой" в GCC у "новых" процессоров AMD (новых уже более года, где только в Linux наблюдаются ошибки :) В вынь писали сразу по документации, а не по наитию :)).
PS: я не играю в святые войны "вынь вс пингвин", т.к. у каждой оси своё предназначение и концепция. Вынь - реализация того что есть и можно сделать счас, для работы, а nix - для копания в ней до "красных глазок" и только после этого можно приступить уже к работе...
 
Последнее редактирование:

kochetovvin

New member
нет вызова timerStart();
у меня
timer = timerBegin(0, 80, true); из примера встроенного
поставил модуль в подвал с тем же кодом, перезагружается минут через пять.
Arduino 1.8.5
И датчики половину не видит, те которые в комнатах с минусовой температурой, показывают 4086 градусов.
 

Алексей.

Active member
В каком windows и на каком уровне? В консоле или ?
Да где угодно, есть драйвер работающий криво, который нужно выкинуть из памяти, Вы меня направляете в микрософт
Удаление пакета драйвера устройства из хранилища не ведет удалению работающих в настоящий момент устройств, которые использует этот драйвер
и толку то!
 

pvvx

Активный участник сообщества
у меня
timer = timerBegin(0, 80, true); из примера встроенного
поставил модуль в подвал с тем же кодом, перезагружается минут через пять.
Почему тогда не перезагружается каждые 30 сек?
Это номер оболочки, а не реализации самой Arduino для ESP-32.
И датчики половину не видит, те которые в комнатах с минусовой температурой, показывают 4086 градусов.
Тогда вам в другой раздел - Предложения о выполнении проектов на заказ
 

pvvx

Активный участник сообщества
Да где угодно, есть драйвер работающий криво, который нужно выкинуть из памяти, Вы меня направляете в микрософт
Удаление пакета драйвера устройства из хранилища не ведет удалению работающих в настоящий момент устройств, которые использует этот драйвер
и толку то!
Вам найти как отключить драйвер и удалить его из памяти?
Опять-же - в каком виде - в приложении на CИ, в консоле или? :)
 

kochetovvin

New member
не перезагружается каждые 30 сек
const int wdtTimeout = 30000; //time in ms to trigger the watchdog
Я думал эта строка задает время через которое срабатывает таймер после зависания.
А раз в две минуты вроде только проверка соединения, или нет?
Отрицательная температура - что то с типами переменных напутал?
Чисто символически отблагодарить всегда готов, форум немного задонатил. А заказывать полный проект денег нет сейчас, я фермер, межсезонье, да и привык все что можно сам делать, дом 500 квадратов почти один построил, теплицы 6 соток...
 
Последнее редактирование:

pvvx

Активный участник сообщества
const int wdtTimeout = 30000; //time in ms to trigger the watchdog
я думал эта строка задает время через которое срабатывает таймер после зависания
Watchdogs — ESP32 Programming Guide 1.0 documentation

А тут c таймером по другому, с timerStart().
Can't use two timer in code · Issue #420 · espressif/arduino-esp32 · GitHub
Кому верить? :)
 
Последнее редактирование:

Алексей.

Active member
Вам найти как отключить драйвер и удалить его из памяти?
Опять-же - в каком виде - в приложении на CИ, в консоле или?
И в консоли и в СИ ;) На вин10

На икс-пи приложению если не хватало прав, прям из кода устанавливал уровень привилегий отладчика и можно было убивать практически любые процессы, на вин7 такая халява не получалась (на 10-ке не пробовал уже), подписанный драйвер имеет очень высокий уровень приоритета, фактически часть ОС и как его убить я не знаю.

Скорее всего он не нужен там, как и Linux со своим нагромождением 99% лишнего кода, совершенно не нужного в данных устройствах.
Требуется закрыть канальный уровень L2, просто требования такие, причем ГОСТ-ом 2015-м, 2012-й уж устарел давно и не разрешен для использования в новых разработках, забудем теперь про линукс на роутерах и вифи-камерах, для каждого вендора свою поддержку держать или платить им за каждую доработку, так что-ли.
 

pvvx

Активный участник сообщества
И в консоли и в СИ ;) На вин10
На икс-пи приложению если не хватало прав, прям из кода устанавливал уровень привилегий отладчика и можно было убивать практически любые процессы, на вин7 такая халява не получалась (на 10-ке не пробовал уже), подписанный драйвер имеет очень высокий уровень приоритета, фактически часть ОС и как его убить я не знаю.
Поискать действительно? Это точно есть, т.к. нечто подобное уже делал когда-то.
Никто не мешает и подписать и "расписать" дрова в win10, как и её активацию... :)
Требуется закрыть канальный уровень L2, просто требования такие, причем ГОСТ-ом 2015-м, 2012-й уж устарел давно и не разрешен для использования в новых разработках, забудем теперь про линукс на роутерах и вифи-камерах, для каждого вендора свою поддержку держать или платить им за каждую доработку, так что-ли.
Ну как-то местных это мало касается. Та и у всех свои задачи.
 

pvvx

Активный участник сообщества
SDK version: v3.1-dev-239-g1c3dd23f-dirty
Это?
Я дописал уже:
А тут c таймером по другому, с timerStart().
Can't use two timer in code · Issue #420 · espressif/arduino-esp32 · GitHub
Кому верить? :)
Проверьте сами, что будет если дописать команду старта таймера...

Так-же я не хочу проверять что будет если в цикле постоянно крутить:
(это сокращенная версия вашего кода : )
Код:
while(1) {
 if (WiFi.status() != WL_CONNECTED) WiFi.begin(ssid, password);
 if (!client.connected() && WiFi.status() == WL_CONNECTED)
   if (client.connect("ESP32PodvalClient"))  client.publish("PODVAL/YKtempNagOFF", StrtempOFFrele1);
}
когда клиент ещё находиться в состоянии предыдущей связи...
 
Последнее редактирование:

kochetovvin

New member
timer start вставил во вторую есп, дома на столе без датчиков, 20 минут пока не перегружается.
Публикация уставок происходит только при перезагрузки или после реконекта после потери связи.
 

pvvx

Активный участник сообщества
timer start вставил во вторую есп, дома на столе без датчиков, 20 минут пока не перегружается.
Т.е. таймер не работает?
Публикация уставок происходит только при перезагрузки или после реконекта после потери связи.
При чем тут публикация?
На чем и когда заканчивается соединение client.connect()? Предположим, что связь плохая. Когда будет следующее соединение?
Хватит ли до таймера в 30 секунд, вызывающего пересброс?
esp_restart_noos -> esp-idf/esp_system.h at master · espressif/esp-idf · GitHub
esp-idf/system_api.c at master · espressif/esp-idf · GitHub

Есть ещё масса вопросов. Таких как:
Зачем стоит randomSeed(micros()); ? Она всё равно дает одно и то-же значение начальной последовательности random, т.к. синхронизация произойдет по delay(10000); и соединение с AP часто происходит одинаковое время до ms. Это значит:
Как среагирует сервер на повторное оборванное по перезагрузке TCP соединение по тому-же адресу и порту, если стандартный TIME_WAIT от 60 до 120 секунд? В Wireshark получим простыню помеченных красным пакетов? :) Кто кого победит? Внешний сервер все-таки уговорит закрыть это соединение или LwIP...?
 
Последнее редактирование:
Сверху Снизу