Зависания и вачдог

Тема в разделе "Микроконтроллеры AVR", создана пользователем ostrov, 23 дек 2018.

  1. Airbus

    Airbus Радиохулиган Модератор

    И все это лечиться Вачдогом?
     
  2. Andycat

    Andycat Нерд

    Все возможно и не лечится ,но в всяком случае мои железки всегда на связи и мне не надо ехать за сто вёрст перезагружать из за какой нибудь фигни
     
  3. Нет, не все. Но какой-то процент внештатных ситуаций лечится. Насколько это сильно поможет самоделке в обсуждении - я не могу знать.
     
  4. SergeiL

    SergeiL Оракул Модератор

    На Leonardo ETH c W5500 на борту, было замечено, что иногда, после заливки кода, у W5500 так съезжала крыша, что устройство не могло получить IP адрес.
    После нажатия на кнопку ресет, - все начинало нормально работать.
    Замечено такое поведение было только после прогрузок, но ситуация как-то напрягала.
    Устройство должно было работать за 70 км от города.

    Внутренний WDT в такой ситуации помочь бы не смог, стал искать внешний.
    Из того, что нашел максимум по времени были на 1,6 секунды.
    С загрузкой через bootloader хотелось что-то, с периодом между сбросами побольше.

    Сделал WatchDog на Тини13. Период 25 секунд. Сигнал с снимал с 13-го выхода, мигание встроенного светодиода - показывает нормальную работу устройства. Если код обнаруживает проблему - блокирует инвертирование выхода, 25 секунд - аппаратный ресет.

    За два года ни разу не срабатывал, но так как то спокойнее. :)
     
  5. Airbus

    Airbus Радиохулиган Модератор

    А если свет рубанут?А если и аккум сядет в это же время?И гопники придут и стырят блок на цветмет?Всё равно ехать?
    Главное быть в сладком неведении уверенным что будет работать вечно не так ли?А как это сделать-каждый решает сам.Я понимаю если кардиостимулятор на Тини-13 там вачдог нужен но и он не спасёт от разряда батарейки.
     
    Последнее редактирование: 23 дек 2018
  6. parovoZZ

    parovoZZ Гуру

    Какое космическое излучение где переворачивает биты? У меня позабытая флешка у одного заказчика пролежала 4 года на даче. Через 4 года забрал оттуда, где и положил))) Рабочая полностью.
    Возвращаясь к миганию светодиодом. В алгоритме клок -> счетчик -> компаратор -> триггер зависать вообще негде.
     
  7. b707

    b707 Гуру

    простите, если у вас в программе такие "ответвления", что ЛУП крутится медленнее периода ватчдога - это говорит только о том, что программа неверно спроектирована и других версий тут быть не может.
    Все "заходы в настройки" и "мигания лампочкой" по уму пишутся так, чтобы они возвращали управление в Луп не реже 100 миллисекунд, иначе ни о какой оперативной работе программы говорить не придется
    Если же все спроектировано правильно и ЛУП оборачивается хотя бы пару раз в секунду - ватчдог достаточно поставить в нем один раз.

    Практический опыт - имею систему, управляющую асинхронными мотором 1.5КВт. тиристорный драйвер смонтирован прямо на моторе, в его клеммной коробке. Управление на основе Атмеги328 - на станине мотора. Наводки - сами понимаете. Поначалу система зависала и перегружалась по ватчдогу 2-3 раза в сутки, добавил пару конденсаторов по 100 мкФ прямо на ножки атмеги - с тех пор за 4 месяца - только два зависания, но благодаря ватчдогу на работу системы они практически не влияют - программа сохраняет все параметры в ЕЕПРОМ и при ресете возобновляет работу с прежними настройками.
     
  8. ostrov

    ostrov Гуру

    Не соглашусь. Бывают программы, которые не вертятся в лупе, а распределяются от туда куда им дальше. Несколько разных задач в одной программе, нафига при настройке в меню тормошить управление двигателем? И наоборот. Есть задачи где произвдительность имеет значение критическое, прерывать ее надо по одному сигналу, а никак не обрабатывая кучу дел. И так далее. Я сделал отключение вачдога на время работы с оператором, а при возвращении в дежурный режим он включается. Считаю, так оптимальнее всего.
     
  9. b707

    b707 Гуру

    не бывает. Это неправильные программы.
    Представьте, что оператор зашел в настройки и тут его отвлекли - что, ваша программа будет "висеть" и ждать, пока он вернется? А если это управление каким-то оборудованием, за параметрами которого надо постоянно следить? - пока оператор вернется, реактор химзавода взлетит на воздух. Для сколько-нибудь оперативного управления ваш подход в принципе не применим, разве что для игрушек

    Любой заход оператора в меню или работа с настройками выражается в каких-то действиях пользователя - нажатии на конопки, кручении энкодера, пролистывание тачскрина. Вот на эти события и надо реагировать. А пока оператор думает, какую следующую кнопку нажать, между событиями - по 10-20 раз в секунду - надо возвращаться в Луп, обрабатывать сигналы с датчиков и обеспечивать работу других ветвей программы.
    У меня сделано так - луп буквально несколько строк, он только в цикле (как можно быстрей) перебирает основные ветви программы. Например:
    Код (C++):
    void loop() {
    menu();
    opros_datchikov();
    Miganie_diodom();
    }
    При заходе в меню мы первым делом проверяем флаги нажатия кнопок и движения энкодера - если что-то нажато - реагируем, если ничего не нажато - сваливаем из функции в следующую
    Код (C++):
    void menu() {
    // если кнопки не нажаты - тут же выходим
    if ( ! ( (buttons_press()) || (encoder_move()))) return;
    // если нажаты - обработка сигналов кнопок и энкодера
    }
    Причем 100мс - это уже много, я стараюсь крутить луп не долше 10мс.
     
    Последнее редактирование: 23 дек 2018
  10. parovoZZ

    parovoZZ Гуру

    у меня такие. У меня даже этой лупы нет.
     
  11. b707

    b707 Гуру

    добавлю практический пример
    имею проект, где на TFT экране 240х320 показывается стрелочный секундомер (то есть раз в секунду перерисовывается стрелка), сверху по экрану скроллится движущаяся строка, внизу экрана тачкнопки настройки - и одновременно с этим система примерно 30 раз в секунду контролирует и, при необходимости, регулирует давление в пневмосистеме.
    Если использовать вашу концепцию с "программами, которые уходят из лупа" - написать такое в принципе невозможно.
     
  12. Неправильная программа это та программа, которая не работает. Уход из лупа это вполне приемлемо для мелких программ, и даже упрощает работу. Но с ростом масштаба начинает создавать всё больше проблем. Так что и тот и тот вариант допустим, но оптимален в разных ситуациях.


    Прерывания по таймеру
     
    Последнее редактирование: 23 дек 2018
  13. SergeiL

    SergeiL Оракул Модератор

    Нет, не согласен.
    Не заход в loop() (main()) - это блокировка для ардуино или нормального кода на Си.
    То же самое, что delay(). Loop может быть пустым, но туда мы должны попадать.
    То есть, в данной ситуации весь основной цикл игнорится, а это не правильно.
    Можно написать так, чтобы не было таких проблем;)
     
    b707 и Airbus нравится это.
  14. Airbus

    Airbus Радиохулиган Модератор

    В Си есть цыкл.Всегда.И в асме тоже.Вот в LUA его нет.От слова совсем.
     
  15. SergeiL

    SergeiL Оракул Модератор

    Да, на ESP8266, с использованием Ардуино ИДЕ и библиотек - это костыль, и с ним приходится мириться.
    На Ардуино, код можно писать так, чтобы не зависать на ожиданиях и сваливаться в loop, работая по флагам.
     
  16. Чего?
     
  17. SergeiL

    SergeiL Оракул Модератор

    Того!
    Что функции реконнекта могут подвисать до 7 секунд.
     
  18. В ардуино-ядре для esp8266? Там реконнект происходит автоматически в фоне.
     
  19. SergeiL

    SergeiL Оракул Модератор

    Ага... Сейчас!

    Вот эти теоретики, что Вы, что @parovoZZ!
    Вы попробуйте, потом говорите! Не путайте людей.

    Когда соединение разваливается, и нет коннекта ни по WiFi ни по MQTT ждем соединения.
    В loop() или в функции под ним, входим в функцию реконнекта и подвисаем там секунд на пять.

    Тут спасает таймер, для событий которые нужно обработать в RT
     
  20. В какую вообще функцию реконнекта? При отвале это происходит автоматически. Вызов reconnect() работает только тогда, когда подключение к точке установлено.