Перейти к содержанию
    

ESP32 намертво зависает

Всем привет!

Устройство на ESP32 WROOM спонтанно намертво зависает. Прям колом. При этом может зависнуть сразу, а может через месяц работы.
Прошивка написана с применением  esp-idf, ессестно с FreeRTOS. Сразу скажу, что тему про утечку памяти я уже прошунтировал вдоль и поперёк. Свободного стека всегда более 130кБ и он не движется вверх, колеблется около этой цифры.

Основной причиной зависания считаю прерывание по смене уровня на GPIO. Там иногда ОЧЕНЬ частые прерывания от звона контактов. Решить этот вопрос на железе пока не представляется возможным.

Основные вопросы:

1. Можно как-то избежать зависания если оно из-за GPIO? Приоритеты прерываний (не нашёл есть ли они в ESP32)? Какие нить костыли? Как у ESP32 обстоят дела со "вложенными" прерываниями? Что будет  если придёт прерывание пока мы не вышли из предыдущего? Можно это предотвратить как-то?

2. Что с WDT? Почему он не ресетит проц при зависании? Если верить мануалу на esp-idf активно аж 2 типа WDT, один следит за TickTimer самой FreeRTOS, второй за работой потоков. Штатно активны 2 таймера на потоки IDLE каждого ядра, так же я активирую ещё 2 монитора на свои потоки. Но проц зависает и его никто не ресетит....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

29 минут назад, Spider сказал:

Основной причиной зависания считаю прерывание по смене уровня на GPIO. Там иногда ОЧЕНЬ частые прерывания от звона контактов. Решить этот вопрос на железе пока не представляется возможным.

Это элементарно решается программно - грамотной обработкой этих прерываний: в ISR запрещаем прерывание от ноги; запускаем таймер на выдержку интервала гашения дребезга (с прерыванием в конце); в ISR таймерного прерывания выключаем таймер и заново разрешаем прерывание от ноги. Всё.

И без всяких аппаратных костылей.

Про работу NVIC - читайте мануал на ядро Cortex-M.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Spider said:

2. Что с WDT? Почему он не ресетит проц при зависании? Если верить мануалу на esp-idf активно аж 2 типа WDT, один следит за TickTimer самой FreeRTOS, второй за работой потоков. Штатно активны 2 таймера на потоки IDLE каждого ядра, так же я активирую ещё 2 монитора на свои потоки. Но проц зависает и его никто не ресетит....

Если завес получился в коде, содержащем WDT_ReGo() то оно и не отработает. Поставьте в эту ф-ию тестовый LED (toggle/XOR) и убедитесь, что эта процедура при завесе не вызывается. "Штатные" сработки WDT тестировали, все Ok ? 

Quote

Устройство на ESP32 WROOM спонтанно намертво зависает. Прям колом. При этом может зависнуть сразу, а может через месяц работы.

Соберите статистику, например 10 циклов включил, поработало 1 минуту - выключил. Выключение должно быть с полным снятием питания и временем на "остывание-рассасывание".

 

ps На этапе startup-code (до запуска ОС) тоже бывает очень полезен светодиод (индикация рестарта).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, jcxz сказал:

Про работу NVIC - читайте мануал на ядро Cortex-M.

В ESP32 процессор Xtensa. Так что чтение мануалов кортекса поможет примерно так же как штудирование тиражей Спортлото за 1976 год.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 hours ago, jcxz said:

Это элементарно решается программно - грамотной обработкой этих прерываний: в ISR запрещаем прерывание от ноги; запускаем таймер на выдержку интервала гашения дребезга (с прерыванием в конце); в ISR таймерного прерывания выключаем таймер и заново разрешаем прерывание от ноги. Всё.

Сейчас так и есть. т.к. переодичность сигнала достаточно редка (реже 1мс), то я так и делаю, на входе в прерывание запрещаю его и запускаю таймер, который через 1 ms уже снова включит прерывание, конечно же сбросив флаг предварительно. Но всё равно как оказалось виснет.

8 hours ago, k155la3 said:

Если завес получился в коде, содержащем WDT_ReGo() то оно и не отработает. Поставьте в эту ф-ию тестовый LED (toggle/XOR) и убедитесь, что эта процедура при завесе не вызывается. "Штатные" сработки WDT тестировали, все Ok ? 

Сложно, на столе добиться зависания очень сложно, близко к невозможному, а вреальных условиях железяки не доступны кроме как напрошивку...
"Штатные" работают, если убрать сброс таймера, проц паникует и ресетится.

8 hours ago, k155la3 said:

Соберите статистику, например 10 циклов включил, поработало 1 минуту - выключил. Выключение должно быть с полным снятием питания и временем на "остывание-рассасывание".

Не допонимаю цели...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 hours ago, Spider said:

Устройство на ESP32 WROOM спонтанно намертво зависает.

А какие признаки зависания? На пин EN реагирует? Что выдает в UART?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, Spider сказал:

Сейчас так и есть. т.к. переодичность сигнала достаточно редка (реже 1мс), то я так и делаю, на входе в прерывание запрещаю его и запускаю таймер, который через 1 ms уже снова включит прерывание, конечно же сбросив флаг предварительно. Но всё равно как оказалось виснет.

Ну значит - проблема не из-за "слишком частых GPIO-прерываний", а в чём-то другом.

2 часа назад, Spider сказал:

Сложно, на столе добиться зависания очень сложно, близко к невозможному, а вреальных условиях железяки не доступны кроме как напрошивку...
"Штатные" работают, если убрать сброс таймера, проц паникует и ресетится.

WDT не спасёт от программных багов. Он главным образом для тех случаев, когда какое-то внешнее воздействие (помеха) привела к порче содержимого памяти/регистров и соответственно - нарушению хода программы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, Linker said:

А какие признаки зависания? На пин EN реагирует? Что выдает в UART?

К сожалению устройство без UART. Уж таким досталось... Перестаёт реагировать на весь програмный ввод. Отваливается от Wifi со стороны роутера виден дисконнект. Перестаёт мигать светодиод (раз в секунду мигающий). Так же там есть LCD дисплей - перестаёт отрисовывать. Помогает только RESET кнопка на плате, ну или снятие питания.

10 minutes ago, jcxz said:

WDT не спасёт от программных багов.

Теоретически должен спасать. т.к. есть поток моргающий диодом и он же сбрасывающий WDT, но диод перестаёт мигать, значит и WDT сбрасываться перестаёт, а вот перезагрузка не наступает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 минут назад, Spider сказал:

Теоретически должен спасать. т.к. есть поток моргающий диодом и он же сбрасывающий WDT, но диод перестаёт мигать, значит и WDT сбрасываться перестаёт, а вот перезагрузка не наступает.

Не факт. Диод может "перестать мигать" например из-за того, что длительность импульса сильно уменьшилась и Вы глазом его уже не видите, а для сброса WDT - вполне хватает.

Или из-за того, что что-то случилось в вашей программе, она стала выдавать импульс сброса WDT в другом месте (где нет зажигания диода).

Или (не знаю про какой WDT речь - внешний или внутренний), но внутренний WDT - опять же может быть или отключен программой (если есть такая возможность) или не включен при старте (если был сброс, а потом сразу зависание, ещё до момента запуска WDT).

Если же речь про внешний WDT, отключаемый высокоомным состоянием на WDI, то возможно программа перевела пин в Z-состояние, а в схеме нет внешней подтяжки к "0" или "1".

Или ещё 100500 причин....

 

В серьёзных устройствах обязательно ставят внешний WDT (не отключаемый) + внутренний. Плюс - желательно оконные (с контролем процедуры/сигнала сброса). У Вас так сделано? Или только внутренний?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сказал же сразу, что WDT средствами esp-idf включены оба. Отключение их не происходит да и если верить мануалу, это невозможно после запуска с запретом остановки (там у esp не всё так просто). Диод не моргает 100% ибо это проверялось осцилом на зависшей. Сброс таймера и мырг в соседних строках, сложно представить ситуацию в которой одно бы выполнялось, а другое нет.

т.к. выше уже говорил, что работа wdt на столе проверялась принципиально, то делаю вывод, что он работает как-то как ожидалось от документации. Но как выяснилось бесполезен :))

Увы внешнего нет, но это как я уже опять же говорил выше, таким мне досталось и пока нет возможности как-то что-то изменить. Нужно костылить программно по возможности.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 минут назад, Spider сказал:

Увы внешнего нет, но это как я уже опять же говорил выше, таким мне досталось и пока нет возможности как-то что-то изменить. Нужно костылить программно по возможности.

Если зависание происходит не из-за программного бага, а например - из-за помехи, и внутренний WDT не спасает (по каким-то причинам), то программно тут ничего не исправить, как ни костыльте. Тут только - исправлять схемотехнику платы (устойчивость к помехам) + ставить внешний WDT.

А если зависание - из-за программного бага, то не костылить надо, а этот самый баг искать и исправлять.  :unknw:

9 минут назад, Spider сказал:

WDT средствами esp-idf

И как дополнительный пункт: нормально разобраться как именно функционирует встроенный WDT. Найти и почитать мануал на МК. А не полагаться на "средства esp-idf".

Возможно, что может быть можно изменить источник тактирования WDT (если есть возможность) или ещё какие опции его работы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 минуты назад, jcxz сказал:

а например - из-за помехи, и внутренний WDT не спасает (по каким-то причинам), то программно тут ничего не исправить, как ни костыльте.

Такое впечатление, если ТС все правильно пересказал, так и есть, нужно смотреть качество питания и ЭМС воздействия...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

26 минут назад, Spider сказал:

Диод не моргает 100% ибо это проверялось осцилом на зависшей. Сброс таймера и мырг в соседних строках, сложно представить ситуацию в которой одно бы выполнялось, а другое нет.

Вам - сложно, мне - нет.  Диод не моргать может например по той причине, что где-то в ПО (из-за бага) нога, управляющая этим диодом, была переведена в состояние INPUT или OK (если зажигание диода происходит 0). Тогда сброс WDT будет происходить, а мырг - нет.  :unknw:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ладно, понятно. Понеслось разглогольсвование кабы да если бы....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 minutes ago, Spider said:

Ладно, понятно. Понеслось разглогольсвование кабы да если бы....

А что Вы хотите исходя из предоставленной информации ? Схемы нет, софта нет, статистики нет, ничего нет кроме 10 строк с вопросами. Если надо "задавить" проблему - ставьте внешний WD или просто таймер, который будет раз в сутки ресетить девайс.

Пока не возьмете "на стол" подопытного кролика и не начнете целенаправленно искать причину завеса с разных сторон, обсуждать это бесполезно, тут я с Вами согласен.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...