Jump to content

    

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
19 minutes ago, jcxz said:

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

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

Edited by simark1979

Share this post


Link to post
Share on other sites
51 minutes ago, simark1979 said:

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

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

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

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

 

Share this post


Link to post
Share on other sites
27 minutes ago, Forger said:

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

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

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

 

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

 

Share this post


Link to post
Share on other sites
3 minutes ago, simark1979 said:

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

 

33 minutes ago, Forger said:

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

 

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

 

 

3 minutes ago, simark1979 said:

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

 

 

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

 

 

Share this post


Link to post
Share on other sites
1 minute ago, Forger said:

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

 

 

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

Share this post


Link to post
Share on other sites
8 minutes ago, simark1979 said:

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

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

 

41 minutes ago, Forger said:

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

 

 

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites
21 minutes ago, simark1979 said:

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

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

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

 

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

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

 

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

 

Share this post


Link to post
Share on other sites
2 часа назад, simark1979 сказал:

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

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

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

Цитата

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

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

Share this post


Link to post
Share on other sites
4 hours ago, simark1979 said:

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

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

Share this post


Link to post
Share on other sites
13 hours ago, Forger said:

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

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

 

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

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

 

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

 

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

Edited by simark1979

Share this post


Link to post
Share on other sites
12 hours ago, jcxz said:

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

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

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

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

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

Edited by simark1979

Share this post


Link to post
Share on other sites
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 перестаёт.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now