Всегда ли WDT перезагружает контроллер.

SAB
Offline
Зарегистрирован: 27.12.2016

Всем привет. Прошу поделиться опытом. Были ли у вас ситуации, когда собака не перезагружала контроллер. И он снова начинал работать только после выкл. / вкл. И ваши мысли почему это может происходить? Как избежать в дальнейшем жесткой перезагрузки.

SAB
Offline
Зарегистрирован: 27.12.2016
#include <avr/wdt.h>
 void setup(){
 wdt_disable(); // запретили как можно скорее собаку, что-бы не уйти в бесконечный ребут
..........................................................
..........................................................
wdt_enable(WDTO_2S); // активировали таймер, каждые 2 секунды его нужно сбрасывать

}//END SETUP

void loop(){
wdt_reset(); // говорим собаке что "В Багдаде все спокойно", начинается очередной отсчет 2-х секунд.
.........................................................
..........................................................
}//END LOOP



 

-NMi-
Offline
Зарегистрирован: 20.08.2018

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

SAB
Offline
Зарегистрирован: 27.12.2016

Программно пробовал, перегружает. У меня этот контроллер работает в условиях индустриальных  и больших электромагнитных  помех. Хотел, чтобы при зависании не надо было ездить на объект хардово перезагружать. Но что то не получается с первого раза. Опыта нет работы с WDT, вот и решил спросить. Да, забыл сказать, что галочка на WDTON на прямых фьюзах в дудке стоит. Может надо её наоборот снять (просто не пробовал это делать - контроллер опять завис)?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

SAB пишет:

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


Нет,не бывает! Чудо ;)

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Какой МК? Какой загрузчик? Или загружаете через spi?

SAB
Offline
Зарегистрирован: 27.12.2016

Да загружаю всегда дудкой через  spi. Проц Atmega 328p. В данном проекте флешка забита под завязку (32750) Озушки используется процентов 75.

Green
Offline
Зарегистрирован: 01.10.2015

SAB пишет:

Да, забыл сказать, что галочка на WDTON на прямых фьюзах в дудке стоит. Может надо её наоборот снять (просто не пробовал это делать - контроллер опять завис)?


В avrdude нет никаких "галочек". Надо просто понимать что вы делаете!

Pyotr
Offline
Зарегистрирован: 12.03.2014

Девайс на atmega328 DIP 16 МГц отработал 3 года 24/7 без зависаний. Теперь бывает раз в неделю по ночам зависает. В конце сетап() пищалка включается на 30 мс. WDT не включал.

Так вот добавил WDT, и теперь при зависании пищалка начинает 4-6 раз в сек срабатывать. МК перезагружается снова  и снова. Загрузчика нет, скетч загружаю USBASP. Причину не установил.

SAB
Offline
Зарегистрирован: 27.12.2016

https://i.ibb.co/XDqKg5n/image.jpg

Вот такие фьюзы  Эта картинка к тому,  для GREEN В avrdude нет никаких "галочек". -- Вы пользуетесь дудкой то.

sadman41
Offline
Зарегистрирован: 19.10.2016

"Программа AVRDUDE_PROG - GUI avrdude"

Сама дудка - это CLI-утилита и "галочек" в ней нет.

SAB
Offline
Зарегистрирован: 27.12.2016

Я, говоря о галочках подразумевал, что все понимают по умолчанию, что речь естественно идёт об AVRDUDE_PROG. А так да, в IDE нет ни каких галочек.:))

Green
Offline
Зарегистрирован: 01.10.2015

И это "естественно" говорит позиционирующий себя как якобы высококвалифицированный программист. Ужос.(

SAB
Offline
Зарегистрирован: 27.12.2016

Я себя ни когда ни где не позиционировал, и не собираюсь этим заниматься. Да, естественно, когда в предложении звучат 2 слова дудка и галочки. Вы Green позиционируете себя как великий программист и не смогли логически сложить эти 2 слова и понять о чем речь, вот это для меня ужос. Давайте впредь не переходить на личности, а решать проблемы возникающие в аппаратных вопросах. Если по существу нечего сказать, то лучше пройдите мимо. Ок!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Девочки, не ссорьтесь. :) 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

По существу похоже на проблему в скетче, который никто не видел
Я например использую этот тест
http://arduino.ru/forum/apparatnye-voprosy/arduino-nano-i-wdt-taimer#com...
Если работает - проблема явно в вашей программе

SAB
Offline
Зарегистрирован: 27.12.2016

Мне кажется или это верно, - WDT перегружает процессор только если есть программа загрузчика? А так он уходит в бесконечный ребут? У меня загрузчика нет, потому как нет под него места. Если мои предположения верны, то придется тогда самому через 

void(* resetFunc) (void) = 0;

переписывать код. А жаль, было всё так просто.:))

-NMi-
Offline
Зарегистрирован: 20.08.2018

Нет, не верно. Есть загрузчик или нет пофигдым. Всё зависит от кода.

SAB
Offline
Зарегистрирован: 27.12.2016

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

rkit
Offline
Зарегистрирован: 23.11.2016

Привести код в порядок - не судьба, видимо. Лучше будем тратить энергию на перезагрузку через жопу.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

SAB пишет:

Я, говоря о галочках подразумевал, что все понимают по умолчанию, что речь естественно идёт об AVRDUDE_PROG. А так да, в IDE нет ни каких галочек.:))

avrdude - консольная программа, как всё AVR-GCC окружение - изначально сделанная под Линукс. Впоследствии "прибита кривыми гвоздями" к окружению Виндоус.

Графическая оболочка под винду - реально мало используемый софт. При необходимости используется avrdude в чистом виде, из командной строки. Так что "естественность" - ну никак не к месту. Использование всяких костылей - личный выбор каждого, только растягивать свои пристрастия на всех - не логично. ;))

=========================================

Про вочдог - все написано в ДШ. Есть режим прерывания или ресета - устнавливается во фьюзах и потом в регистре.

При разрешении работы и установке таймера, вочдог, после истечения времени таймера, либо перезагрузит МК либо вызовет прерывание. Подтверждение "не зависания" в этом случае выглядит как постоянный сброс таймера вочдога. Например в первой строке loop(), который должен быть спроектирован  так, что всегда уложится в отведенное время.

Загрузчик к вочдогу не имеет никакого значения. Его отсутствие только на пользу. Тут имеет место "эхо прошлого". Загрузчик старой нанки не предусматривал сброс WDT и при неаккуратном включении вочдога, ардуинка падала в бесконечную перезагрузку.

=============================

Ну и присоединюсь к Грину. На фоне "плача о покраденном злым начальником коде" детский вопрос выглядит как-то не очень! ;)))) Сорри.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Есть такая weak функция initVariant(), если её определить в своём коде, а в ей прописать отключение WDT, то в большинстве случаев это помогает при bootloop-е Нанки. 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

DetSimen пишет:

Есть такая weak функция initVariant(), если её определить в своём коде, а в ей прописать отключение WDT, то в большинстве случаев это помогает при bootloop-е Нанки. 

ДЕт! Для системы с бутлоадером и вд-таймере на 15 мс - не помогает ;)). А без бутлоадера  - нормально, но есть ысчо 100500 вариантов отресетить WDT до того, как он нагадит.

Из ДШ вариант:

#include <stdint.h>
#include <avr/wdt.h>
uint8_t mcusr_mirror __attribute__ ((section (".noinit")));
void get_mcusr(void) \
  __attribute__((naked)) \
  __attribute__((section(".init3")));
void get_mcusr(void)
{
  mcusr_mirror = MCUSR;
  MCUSR = 0;
  wdt_disable();
}

 

SAB
Offline
Зарегистрирован: 27.12.2016

To wdrakula - вы ошибаетесь если приняли мой пост о злом начальнике за плач. Это ваши фантазии, такие же как и то, что ни кто не пользуется программатором дудкой для прошивки кода. И в данном случае это не детский, как мне кажется вопрос, если я привел код выше, и ни кто пока не дал конкретный ответ на него, почему контроллер зависает. Что делается не правильно, что влияет в основном коде, что WDT не перегружает контроллер, а происходит зависание. Я привел картинку по установленным фьюзам. Что ещё надо, чтобы мой вопрос как то решить положительно? Или все обиделись, что я хотел  обидеть типа начальника и теперь вам в падлу делится инфой. Ну тогда прямо кто нибудь скажите в глаза - пошел вон с форума, ты гипотетически обидел наших работодателей, и теперь мы будем и тебя за это посылать в игнор. Я надеюсь, что это не так, и всё же надеюсь разобраться с вашей помощью в данном вопросе. Спасибо

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

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

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

DetSimen пишет:

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

Дет! Родное сердце! Ты очень удивишься. но это кусок прямо в инклюде avr/wdt.h в комментах приведен! ;)))))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Я очень удивилса. До изумления. 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

SAB пишет:

To wdrakula - вы ошибаетесь что ни кто не пользуется программатором дудкой для прошивки кода.

Ты читать разучился? Что я написал, точно процитируй, плз.

Пользуют avrdude, а не графическую херню к ней.

-------------------------

По вочдогу. Я же написал, как его использовать, что конкретно тебе не понятно? Задавай вопрос, поясню.

А "губки надувать"... типа ахтунг, ящетаю. ;)))) Или ты девачко, но скрываешь это? ;))

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

SAB , уж давно на форуме, к чему все эти разговоры ни о чем....
Код целиковый так никто и не увидел, подсказок/вариантов выше ужа дали, с чего вы взяли что МК зависает?, нужен пример конечного кода - пожалуйста, моя поделка из последнего:

-
http://arduino.ru/forum/proekty/ocherednaya-temperaturnaya-signalizatsiy...

- в начале прописываем это

uint8_t mcusr_mirror __attribute__ ((section (".noinit")));
void get_mcusr(void) \
__attribute__((naked)) \
__attribute__((used)) \
__attribute__((section(".init3")));
void get_mcusr(void)
{
  mcusr_mirror = MCUSR;
  MCUSR = 0;
  wdt_disable();
}

- в setup это

void setup() {
  MCUSR = 0; // отключение WDT
  wdt_disable(); // отключение WDT
  // put your setup code here, to run once:
  // тут свои действия
  wdt_enable(WDTO_8S); // включение WDT
}

- в loop это

  wdt_reset(); // сброс WDT
  //delay(10000); // test WDT // раскоменнтировать строку для проверки WDT , МК будет перезагружаться каждые 10 секунд

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

По вочдогу. В схеме кода из №1 вся логика написана правильно. Твоя любимая "галочка" в ГУИ для дудки - заставляет ВДТ всегда работать на перезагрузку, вне зависимости от установки бит в регистре.

Попробуй вочдог на простом коде... ну к примеру бесконечно моргаешь диодиком и смотришь на моментом перезагрузки. Давай есть слона по частям, ОК?

SAB
Offline
Зарегистрирован: 27.12.2016

Я рад что нашел понимания. Буду пробовать. Отпишусь. Спасибо. 

SAB
Offline
Зарегистрирован: 27.12.2016

Спасибо всем, кто принял участие в обсуждении данной проблемы. Особенно моя благодарность andycat за #28 пост. Всё заработало как надо. Приношу свои извинения, если кого то обидел своим недопониманием своими высказываниями. Надеюсь на дальнейшее сотрудничество и взаимопонимание. Всем удачи.

Гриша
Offline
Зарегистрирован: 27.04.2014

до кучи закину старые темы по данной проблеме:

http://arduino.ru/forum/apparatnye-voprosy/ne-mogu-vylechit-vatchdog-na-goloi-atmege328r-s-vnutr-taktirovaniem-8-mgts 

http://arduino.ru/forum/apparatnye-voprosy/watchdog-ili-kak-podruzhit-arduino-so-storozhevym-psom

в них как обычно много воды но есть чего почитать....

на пример :

DetSimen пишет:

bwn пишет:

еще спецмикрухи имеются. 

Одна из, везде леплю, где нужна, MAX813L

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

SAB пишет:

что галочка на WDTON на прямых фьюзах в дудке стоит. Может надо её наоборот снять 

Забей на эти определения: "прямые" или "обратные" (инверсные) фьюзы, всё равно постоянно будешь путать и не запомнишь.

Вместо этого всегда ориентируйся по фьюзам SPIEN и RSTDISBL.
SPIEN всегда включён, а RSTDISBL всегда выключен.

Если надо включить какой-то фьюз - ставь так, как выставлен SPIEN.
Если надо выключить какой-то фьюз - ставь так, как выставлен RSTDISBL. 

А теперь посмотри на свой скриншот и подумай, включен или выключен у тебя фьюз WDTON.

vanila
Offline
Зарегистрирован: 25.08.2015

Немного не то конечно, но часто видел в ответственных устройствах, где на программный вочдог надеяться мало, ставят отдельный слабенький мк, который общается с главным и если не получает в определенный момент ответа, дергает ему резет. 

Green
Offline
Зарегистрирован: 01.10.2015

А на слабенький ставят ещё один слабенький мк и т.д...) Если уж хочется надёжности, то есть аппаратные WDT, в т.ч. и с контролем питания.

vanila
Offline
Зарегистрирован: 25.08.2015

Green пишет:

А на слабенький ставят ещё один слабенький мк и т.д...) Если уж хочется надёжности, то есть аппаратные WDT и даже с контролем питания.

Это уже зависит от уровня ответственности) в конечно итоге можно и закольцевать)

Green
Offline
Зарегистрирован: 01.10.2015

vanila пишет:

Это уже зависит от уровня ответственности) в конечно итоге можно и закольцевать)


Геморой.) Софт для одного, для другого, "протокол"...)
Вообще, в случаях когда участвуют двое и более, пишу одну программу для всех, выбирая либо аппаратно, либо программно. Иначе, крайне неудобно.

SLKH
Offline
Зарегистрирован: 17.08.2015

Green пишет:

А на слабенький ставят ещё один слабенький мк и т.д...) 

ещё один не нужен: рабочий и дополнительный сигналят друг другу, что работают. кто затих - получает пинок.

SLKH
Offline
Зарегистрирован: 17.08.2015

Green пишет:

vanila пишет:

Это уже зависит от уровня ответственности) в конечно итоге можно и закольцевать)


Геморой.) Софт для одного, для другого, "протокол"...)
Вообще, в случаях когда участвуют двое и более, пишу одну программу для всех, выбирая либо аппаратно, либо программно. Иначе, крайне неудобно.

там доп. софта всего ничего.

Green
Offline
Зарегистрирован: 01.10.2015

SLKH пишет:

там доп. софта всего ничего.


В данном случае да. Но, захотели мы изменить период срабатывания WDT, или, к примеру, вид запроса... И уже нужно править и в одном софте, и в другом, со всеми вытекающими. А если так многократно... К чему эти доп. телодвижения.)

SLKH
Offline
Зарегистрирован: 17.08.2015

Green пишет:

SLKH пишет:

там доп. софта всего ничего.


В данном случае да. Но, захотели мы изменить период срабатывания WDT, или, к примеру, вид запроса... 

тогда нужно лезть в программу и править её. 

Цитата:
А если так многократно...
на хера? Например, задача "при зависании контроллера > 5 секунд перезагрузить" - что в ней нуждается в многократной правке?

Green
Offline
Зарегистрирован: 01.10.2015

На хера? Тогда не надо.
Или у вас всегда всё работает с первого раза? У меня нет.(
Но даже в простейшем случае, типа WDT, я делаю как уже сказал.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Зачитай чонить за Max813L

Green
Offline
Зарегистрирован: 01.10.2015

Дет, жиф! Рад за тебя!
Я зачитай? Именно подобное и рекомендую, а не порнографию с МК.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Green пишет:

Я зачитай?

Да ты то причем, ты это и так знаешь. А вот тот, кто рекомендует парнографию с МК, тот пусь и зачитает.

толстый
Offline
Зарегистрирован: 10.02.2020

Всем трям. Вопрос как и название темы, но с уточнением - именно ПЕРЕЗАГРУЖАЕТ? Собака настроена на 8 сек. и эмуляция зависания за счёт бесконечного цикла на while. Когда происходит "зависание", сторожевой гарантированно срабатывает(видно по прекрашению работы ШИМ на выводах, и последуюшему переходу в Z-состояние, НО программа не запускается - контроллер  остается в таком состоянии. Вернуть к жизни можно хард ресетом или снятием питания. Странность в том, что это зависит от размера скетча(именно размера, потому как добавляемые или отключаемые  блоки программы содержат туже математику и работу с портами, что и в основной программе) Т.е. программа занимающая во флеше 95% отрабатывает "зависание" нормально, а 94% и 96% не запускаются после срабатывания собаки.

Плата - Мега2560  с перешитым загрузчиком от IDE 1.8.12(но и старый нормально отрабатывал тест)   Пробовал и IDE 1.8.19

Организация вачдога стандартная типа

#include <stdint.h>
#include <avr/wdt.h>

void setup() {
  wdt_disable(); // бесполезная строка до которой не доходит выполнение при bootloop
  Serial.begin(9600);
  Serial.println("Setup..");
  
  Serial.println("Wait 5 sec..");
  delay(5000); // Задержка, чтобы было время перепрошить устройство в случае bootloop
  wdt_enable (WDTO_8S); // Для тестов не рекомендуется устанавливать значение менее 8 сек.
  Serial.println("Watchdog enabled.");
}

int timer = 0;

void loop(){
  // Каждую секунду мигаем светодиодом и значение счетчика пишем в Serial
  if(!(millis()%1000)){
    timer++;
    Serial.println(timer);
    digitalWrite(13, digitalRead(13)==1?0:1); delay(1);
  }
//  wdt_reset();
}

Пробовал и по примеру Графа из даташита, с отключением в начале сетапа и включением в конце. Компиляция и заливка через родную среду и USB.

Предвижу вопросы по РЕАЛЬЕОМУ скетчу и объвязке, но 250кБ текста ну никто не захочет изучать, подключение с вачдогом ну никак не связано. Можно было бы грешить на библиотеки, но собака вроде аппаратная и испортить её нельзя.

Основной вопрос: что может мешать перезапустить контроллер? Именно перезапустить, т.к. срабатывание собаки гарантированно есть, а вот перехода на нулевой адрес, походу, не происходит. Может бесконечный цикл это плохая эмуляция зависания и при реальном зависании перезапуск произойдёт?

b707
Offline
Зарегистрирован: 26.05.2017

что ж такое можно запихать в скетч для АВР (который в принципе не генерит большого кода) , чтобы он получился 250к?

просто интересно? Роман "Анна каренина" в прогмеме сохранен?

толстый
Offline
Зарегистрирован: 10.02.2020

Ну, пусть будет пивоварня :) А так там TFT дисплей с тачем, и только работа с ним и картинки с текстом занимают 3/4 памяти наверное.

Green
Offline
Зарегистрирован: 01.10.2015

b707 пишет:

что ж такое можно запихать в скетч для АВР...


Не знаю сколько можно запихать, но знаю что у людей в цикле иногда не хватает 2 сек на WDT, приходится ставить 4. При том, что delay-ев в коде не видно. Естественно, это зависит от того куда пихать WDT.
Ответ - было бы желание.) Ну и от ситуации конечно. В моём случае были ответы от модема.

rkit
Offline
Зарегистрирован: 23.11.2016

Читай про пробелмы с загрузчиком