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

Концепция сброса сторожевого таймера во FreeRTOS

Прошивка написана под управлением FreeRTOS.
Подскажите как правильно организовать сброс сторожевика?
На эту тему информации маловато.

Изменено пользователем haker_fox
Добавил теги к популярной теме.

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


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

19 minutes ago, jcxz said:

Взять и сбросить. Не понятно о чём вопрос....

Интересная концепция)
Сброс таймера в отдельном потоке, это достаточно просто, но читая материал на эту тему, сделал вывод, что это не спасёт, если застрянет или пойдет по ложному пути другая часть программы

Изменено пользователем simark1979

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


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

51 minutes ago, simark1979 said:

Прошивка написана под управлением FreeRTOS.
Подскажите как правильно организовать сброс сторожевика?
На эту тему информации маловато.

Использую такое решение:

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

Поторопился сбросить - ресет, завис в другой задаче - ресет.

 

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


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

27 minutes ago, Forger said:

Использую такое решение:

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

Поторопился сбросить - ресет, завис в другой задаче - ресет.

 

А если заткнется другая задача?
ИМХО это не спасет от косяков в ПО

 

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


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

3 minutes ago, simark1979 said:

А если заткнется другая задача?

 

33 minutes ago, Forger said:

завис в другой задаче - ресет.

 

В чем проблема?

 

 

3 minutes ago, simark1979 said:

ИМХО это не спасет от косяков в ПО

 

 

Искать 100% панацею в вотчдоге - это уже "тревожный звоночек" :dirol:

 

 

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


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

1 minute ago, Forger said:

Тогда вочдог сбросит проц. В чем проблема?

 

 

С чего вдруг он сбросит?
Задача сбрасывающая вотчдог продолжит работу. и ничего об это не узнает

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


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

8 minutes ago, simark1979 said:

С чего вдруг он сбросит?
Задача сбрасывающая вотчдог продолжит работу. и ничего об это не узнает

Читайте внимательно: 

 

41 minutes ago, Forger said:

отдельная задача с минимальным приоритетом

 

 

От "косяков в ПО" может спасти, например, замена программиста на другого, более опытного :buba:

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


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

У меня ПО работает вроде надежно, сомнений пока не имею.

но зарекаться не буду)

читал https://barrgroup.com/Embedded-Systems/How-To/Advanced-Watchdog-Timer-Tips

с чего решил, что контролировать вотчдог с одного потока не достаточно надежно

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


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

21 minutes ago, simark1979 said:

с чего решил, что контролировать вотчдог с одного потока не достаточно надежно

Изначально вопрос звучал совсем другой: 

Подскажите как правильно организовать сброс сторожевика?

 

Теперь оказывает вам нужно совсем другое: контролировать вотчдог (из кода), хотя по логике все должно происходить с точность наоборот.

Определитесь уже :)

 

Кстати, в статье по ссылке все расписано вполне доступно.

 

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


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

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

А если заткнется другая задача?

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

И приоритет её не важен, лишь бы только она не тормозилась свыше допустимого другими задачами.

Цитата

ИМХО это не спасет от косяков в ПО

Сторожевик ещё никого от багов в ПО не спасал. Так как пока не придумали сторожевиков, умеющих искать баги в коде.

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


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

4 hours ago, simark1979 said:

Прошивка написана под управлением FreeRTOS.
Подскажите как правильно организовать сброс сторожевика?
На эту тему информации маловато.

Я разрешил хук от задачи IDLE, в этом хуке сбрасываю псину. Минус такого решения, что иногда высокоприоритетные задачи не дают управления IDLE, и происходит ложные сброс системы. Решается либо увеличением таймаута таймера (если допустимо), либо сбросом собаки в высокоприоритетных задачх.

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


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

13 hours ago, Forger said:

Изначально вопрос звучал совсем другой: 

Подскажите как правильно организовать сброс сторожевика?

 

Теперь оказывает вам нужно совсем другое: контролировать вотчдог (из кода), хотя по логике все должно происходить с точность наоборот.

Определитесь уже :)

 

Кстати, в статье по ссылке все расписано вполне доступно.

 

Да, наверное не совсем точно сформулировал вопрос.
Интересует конечно, как контролировать собаку из кода
В статье расписано, но хотел бы узнать, кто и как это делает, может есть другие подходы.

Изменено пользователем simark1979

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


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

12 hours ago, jcxz said:

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

И приоритет её не важен, лишь бы только она не тормозилась свыше допустимого другими задачами.

Сторожевик ещё никого от багов в ПО не спасал. Так как пока не придумали сторожевиков, умеющих искать баги в коде.

А что вы понимаете под пингованием задачи? И как вы это делаете?

Разумеется, собака не для поиска багов, но может спасти...всё-таки не случайно родились трейсеры для RTOS, иногда баги бывают крайне сложные и неочевидные, редко проявляющиеся.
Еще слышал, что программа может сбиться в результате влияния электромагнитных помех на RAM и "ходить" по ложному пути, хотел бы узнать, есть ли такая опасность или выдумки?

Изменено пользователем simark1979

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


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

13 минут назад, simark1979 сказал:

А что вы понимаете под пингованием задачи? И как вы это делаете?

Любая задача ОС у меня это: цикл в котором ждётся какой-то объект синхронизации ядра (мэйлбокс, семафор, ...), когда он переходит в сигнальное состояние (получает событие или я называю "пинг"), он обрабатывает это событие (опрашивает очереди данных и другие входные переменные), записывает результаты своей работы и опять возвращается к ожиданию этого мэйлбокса. Так вот - после каждого выхода из ожидания мэйлбокса, я проверяю - не проверяет ли нас сейчас WDT-задача и, если да - проснувшаяся задача посылает её уведомление "я жива". А потом продолжает делать свои дела.

Подобно:

while (1) {
  MboxPend(japiMbox, ms2tkt(100));
  jtaskReq = 0;
  ILivePing(ILIVE_JAPI); //сообщаем WDT-задаче что мы живы
  ... //делаем полезные дела
}    

static u8 volatile iliveFaza = ILIVE_START * 2;
void ILivePing(int sender)
{
  uint i;
  if ((i = iliveFaza) != sender * 2 + 1) return; //WDT-задача проверяет нас?
  iliveFaza = i + 1; //сообщаем WDT-задаче что мы живы
}

А WDT-задача проходит по списку всех задач, проверяя так каждую, потом начинает сначала. Для каждой задачи в списке WDT-задача знает максимальное время реакции задачи на пинг и ждёт, дёргая WDI, не более этого времени. Потом дёргать WDI перестаёт.

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


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

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

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

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

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

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

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

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

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

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