Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как использовать Watchdog-таймер в RTOS
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Дон Амброзио
Как использовать Watchdog-таймер в вытесняющей RTOS? Ведь там трудно просчитать в какой момент какой сегмент кода будет работать. Всё зависит от потока событий
jasper
Поместить WDR в прерывание системного таймера. unsure.gif
Непомнящий Евгений
to jasper - Вы серьезно?
Ведь даже если контроллер начнет работать неверно, высока вероятность, что прерывания таймера будут продолжать исполняться...
По-идее, надо каким-то способом контролировать "правильность" поведения оборудования, а как в общем случае это сделать - хз...
Дон Амброзио
Цитата(jasper @ Feb 11 2008, 21:38) *
Поместить WDR в прерывание системного таймера. unsure.gif

Так и делаю: сбрасываю Watchdog в хадлере системного таймера каждые N тиков.
Т.е. получается, что у меня Watchdog контролирует не зависания программы, а корректность работы системного таймера (что тоже неплохо ибо если сбойнёт системный таймер и этого "не заметить" вся система рухнет как карточный домик). А для приложений у меня создаются виртуальные Watchdog-таймеры
zltigo
Цитата(Непомнящий Евгений @ Feb 11 2008, 21:41) *
По-идее, надо каким-то способом контролировать "правильность" поведения оборудования, а как в общем случае это сделать - хз...

Ну в общем-то как раз и просто. Watcdog сбрасывает самая неприоритетная (можно специально созданная), но периодически запускаемая задача, она-же анализирует некотрые статистические параметры работы оборудования. Ну а в системном таймере сбрасывать, это, конечно, очень грубо.
Дон Амброзио
Цитата(zltigo @ Feb 11 2008, 22:03) *
Watcdog сбрасывает самая неприоритетная (можно специально созданная), но периодически запускаемая задача. Ну а в системном таймере сбрасывать, это, конечно, очень грубо.


Цитата(zltigo @ Feb 11 2008, 22:03) *
Ну а в системном таймере сбрасывать, это, конечно, очень грубо.

А чем запуск этой "периодической задачи" менее "груб" чем сброс WDT в хандлере? Ведь она (эта задача) запускается всё равно по системному таймеру.
Кстати, у меня так и сделано. Хандлер через определённые промежутки времени переводит в ready-состояние некий приодический поток. А уж он обслуживает WDT и прочие периодические проверки
Alex B._
Цитата(Дон Амброзио @ Feb 12 2008, 07:55) *
Ведь она (эта задача) запускается всё равно по системному таймеру.

Эта задача может тупо не запуститься, переполнение стека у вас, например, адрес возврата в контекст потерся... А системный таймер все равно будет тикать. Система не работоспособна а watchdog нормально сбрасывается...
Дон Амброзио
Цитата(Alex B._ @ Feb 12 2008, 10:38) *
Эта задача может тупо не запуститься, переполнение стека у вас, например, адрес возврата в контекст потерся... А системный таймер все равно будет тикать. Система не работоспособна а watchdog нормально сбрасывается...

Согласен.. Правильный совет... Так как при сбое проги проц может и не достаться потоку, сбрасывющему WDT.. Благо я так и сделал("Кстати, у меня так и сделано. Хандлер через определённые промежутки времени переводит в ready-состояние некий приодический поток. А уж он обслуживает WDT и прочие периодические проверки")
Cosmojam
Сории за некропостинг, не хочу плодить новых тем

Насколько правильно кормить (или всё же пинать?) дога в idle task ? По идее если всё работает исправно, то никакой процесс (процессы) не займёт процессор настолько долго чтобы idle не был вызван в течение таймаута вотчдога, а если это произошло - значит что-то не так
_Артём_
Цитата(Cosmojam @ Feb 5 2012, 19:52) *
кормить (или всё же пинать?)

Пожалуй, правильно кормить.
Пинать он сам будет, если не покормить.


Цитата(Cosmojam @ Feb 5 2012, 19:52) *
кормить (или всё же пинать?) дога в idle task ?

Имхо, правильней в прерывании, работающем с высокой частотой.
На не тупо watchdog_reset(), что нынче с watchdog-ами с оконным режимом бессмысленно, а по критериям/флагам зависящим от конкретной программы. Или в процессе с высоким приоритетом (если можно гарантировать регулярность активизации процесса).
Сброс в IdleTask, выходит что - совершенно не правильный метод, который иногда пригоден (например в megaavr, где собака примитивная), но в общем случает совершенно нельзя предсказать когда IdleTask получит управление и как регулярно он будет его получать(если программа не представляет собой моргание светодиодом в одном-двух процессах).

IdleTask больше подходит для организации энергосбережения:
Код
volatile unsigned char SleepEnabled=0;
void OS::IdleProcessUserHook()
{
        cli();
        unsigned char sleep_enabled=SleepEnabled;
        sei();
        if (sleep_enabled) {
            sleep_enable();
            sleep_cpu();
        }
}


B то глубокий sleep так не организовать (или можно? зависит от цпу), нужно сильней изголятся.
maksimp
Каждая задача кроме одной выставляет время от времени свой флаг о том что она работают верно. Последняя задача, если она тоже работает верно, проверяет все эти флаги и если все они стоят то дёргает таймер, и сбрасывает все эти флаги.
_Артём_
Цитата(maksimp @ Feb 5 2012, 20:41) *
Последняя задача, если она тоже работает верно, проверяет все эти флаги и если все они стоят то дёргает таймер, и сбрасывает все эти флаги.

Последняя == последняя по приритету?
Не согласен (пока).

Цитата(maksimp @ Feb 5 2012, 20:41) *
проверяет все эти флаги и если все они стоят то дёргает таймер, и сбрасывает все эти флаги.

насчёт проверяет-сбрасывает флаги-дёргает таймер - согласен.

Цитата(maksimp @ Feb 5 2012, 20:41) *
если все они стоят то дёргает таймер, и сбрасывает все эти флаги.

насчёт все.
А такой случай: задача ушла в ожидание события (или просто спит - потому что так надо и спит десятки секунд/минут/часов)?
Лучше вести таймеры-счётчики с разными значениями для разных задач и при переполнении одного из них запрещать сброс собаки.


sla000
Цитата(maksimp @ Feb 6 2012, 01:41) *
Каждая задача кроме одной выставляет время от времени свой флаг о том что она работают верно. Последняя задача, если она тоже работает верно, проверяет все эти флаги и если все они стоят то дёргает таймер, и сбрасывает все эти флаги.

+1
maksimp
Цитата(_Артём_ @ Feb 5 2012, 22:50) *
Последняя == последняя по приритету?

Такого не имел в виду. Просто последняя по порядку изложения мысли, та самая одна кроме которой.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.