Jump to content

    

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

Recommended Posts

Spider

Всем привет!

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites

k155la3
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 (до запуска ОС) тоже бывает очень полезен светодиод (индикация рестарта).

 

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

Spider
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 минуту - выключил. Выключение должно быть с полным снятием питания и временем на "остывание-рассасывание".

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

Share this post


Link to post
Share on other sites

Linker
10 hours ago, Spider said:

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

Spider
2 hours ago, Linker said:

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

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

10 minutes ago, jcxz said:

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

 

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

Share this post


Link to post
Share on other sites

Spider

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

k155la3
14 minutes ago, Spider said:

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

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

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

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.