|
|
  |
Как использовать Watchdog-таймер в RTOS, Ведь для многопоточных задач есть специфика |
|
|
|
Feb 11 2008, 18:47
|

Местный
  
Группа: Участник*
Сообщений: 323
Регистрация: 11-02-08
Пользователь №: 34 947

|
Цитата(jasper @ Feb 11 2008, 21:38)  Поместить WDR в прерывание системного таймера.  Так и делаю: сбрасываю Watchdog в хадлере системного таймера каждые N тиков. Т.е. получается, что у меня Watchdog контролирует не зависания программы, а корректность работы системного таймера (что тоже неплохо ибо если сбойнёт системный таймер и этого "не заметить" вся система рухнет как карточный домик). А для приложений у меня создаются виртуальные Watchdog-таймеры
--------------------
После устранения бага в программе она стала работать....хуже
|
|
|
|
|
Feb 11 2008, 19:03
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Непомнящий Евгений @ Feb 11 2008, 21:41)  По-идее, надо каким-то способом контролировать "правильность" поведения оборудования, а как в общем случае это сделать - хз... Ну в общем-то как раз и просто. Watcdog сбрасывает самая неприоритетная (можно специально созданная), но периодически запускаемая задача, она-же анализирует некотрые статистические параметры работы оборудования. Ну а в системном таймере сбрасывать, это, конечно, очень грубо.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Feb 12 2008, 04:55
|

Местный
  
Группа: Участник*
Сообщений: 323
Регистрация: 11-02-08
Пользователь №: 34 947

|
Цитата(zltigo @ Feb 11 2008, 22:03)  Watcdog сбрасывает самая неприоритетная (можно специально созданная), но периодически запускаемая задача. Ну а в системном таймере сбрасывать, это, конечно, очень грубо. Цитата(zltigo @ Feb 11 2008, 22:03)  Ну а в системном таймере сбрасывать, это, конечно, очень грубо. А чем запуск этой "периодической задачи" менее "груб" чем сброс WDT в хандлере? Ведь она (эта задача) запускается всё равно по системному таймеру. Кстати, у меня так и сделано. Хандлер через определённые промежутки времени переводит в ready-состояние некий приодический поток. А уж он обслуживает WDT и прочие периодические проверки
--------------------
После устранения бага в программе она стала работать....хуже
|
|
|
|
|
Feb 12 2008, 11:50
|

Местный
  
Группа: Участник*
Сообщений: 323
Регистрация: 11-02-08
Пользователь №: 34 947

|
Цитата(Alex B._ @ Feb 12 2008, 10:38)  Эта задача может тупо не запуститься, переполнение стека у вас, например, адрес возврата в контекст потерся... А системный таймер все равно будет тикать. Система не работоспособна а watchdog нормально сбрасывается... Согласен.. Правильный совет... Так как при сбое проги проц может и не достаться потоку, сбрасывющему WDT.. Благо я так и сделал("Кстати, у меня так и сделано. Хандлер через определённые промежутки времени переводит в ready-состояние некий приодический поток. А уж он обслуживает WDT и прочие периодические проверки")
--------------------
После устранения бага в программе она стала работать....хуже
|
|
|
|
|
Feb 5 2012, 18:28
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(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 так не организовать (или можно? зависит от цпу), нужно сильней изголятся.
|
|
|
|
|
Feb 5 2012, 18:50
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(maksimp @ Feb 5 2012, 20:41)  Последняя задача, если она тоже работает верно, проверяет все эти флаги и если все они стоят то дёргает таймер, и сбрасывает все эти флаги. Последняя == последняя по приритету? Не согласен (пока). Цитата(maksimp @ Feb 5 2012, 20:41)  проверяет все эти флаги и если все они стоят то дёргает таймер, и сбрасывает все эти флаги. насчёт проверяет-сбрасывает флаги-дёргает таймер - согласен. Цитата(maksimp @ Feb 5 2012, 20:41)  если все они стоят то дёргает таймер, и сбрасывает все эти флаги. насчёт все. А такой случай: задача ушла в ожидание события (или просто спит - потому что так надо и спит десятки секунд/минут/часов)? Лучше вести таймеры-счётчики с разными значениями для разных задач и при переполнении одного из них запрещать сброс собаки.
|
|
|
|
|
Feb 6 2012, 02:21
|

Участник

Группа: Участник
Сообщений: 20
Регистрация: 25-06-07
Из: Томск
Пользователь №: 28 670

|
Цитата(maksimp @ Feb 6 2012, 01:41)  Каждая задача кроме одной выставляет время от времени свой флаг о том что она работают верно. Последняя задача, если она тоже работает верно, проверяет все эти флаги и если все они стоят то дёргает таймер, и сбрасывает все эти флаги. +1
|
|
|
|
|
Feb 6 2012, 02:55
|
Местный
  
Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023

|
Цитата(_Артём_ @ Feb 5 2012, 22:50)  Последняя == последняя по приритету? Такого не имел в виду. Просто последняя по порядку изложения мысли, та самая одна кроме которой.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|