реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как использовать Watchdog-таймер в RTOS, Ведь для многопоточных задач есть специфика
Дон Амброзио
сообщение Feb 11 2008, 18:10
Сообщение #1


Местный
***

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



Как использовать Watchdog-таймер в вытесняющей RTOS? Ведь там трудно просчитать в какой момент какой сегмент кода будет работать. Всё зависит от потока событий


--------------------
После устранения бага в программе она стала работать....хуже
Go to the top of the page
 
+Quote Post
jasper
сообщение Feb 11 2008, 18:38
Сообщение #2


Народный чинитель
***

Группа: Участник
Сообщений: 415
Регистрация: 15-07-05
Пользователь №: 6 811



Поместить WDR в прерывание системного таймера. unsure.gif
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Feb 11 2008, 18:41
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



to jasper - Вы серьезно?
Ведь даже если контроллер начнет работать неверно, высока вероятность, что прерывания таймера будут продолжать исполняться...
По-идее, надо каким-то способом контролировать "правильность" поведения оборудования, а как в общем случае это сделать - хз...
Go to the top of the page
 
+Quote Post
Дон Амброзио
сообщение Feb 11 2008, 18:47
Сообщение #4


Местный
***

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



Цитата(jasper @ Feb 11 2008, 21:38) *
Поместить WDR в прерывание системного таймера. unsure.gif

Так и делаю: сбрасываю Watchdog в хадлере системного таймера каждые N тиков.
Т.е. получается, что у меня Watchdog контролирует не зависания программы, а корректность работы системного таймера (что тоже неплохо ибо если сбойнёт системный таймер и этого "не заметить" вся система рухнет как карточный домик). А для приложений у меня создаются виртуальные Watchdog-таймеры


--------------------
После устранения бага в программе она стала работать....хуже
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 11 2008, 19:03
Сообщение #5


Гуру
******

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



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

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Дон Амброзио
сообщение Feb 12 2008, 04:55
Сообщение #6


Местный
***

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



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


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

А чем запуск этой "периодической задачи" менее "груб" чем сброс WDT в хандлере? Ведь она (эта задача) запускается всё равно по системному таймеру.
Кстати, у меня так и сделано. Хандлер через определённые промежутки времени переводит в ready-состояние некий приодический поток. А уж он обслуживает WDT и прочие периодические проверки


--------------------
После устранения бага в программе она стала работать....хуже
Go to the top of the page
 
+Quote Post
Alex B._
сообщение Feb 12 2008, 07:38
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 943
Регистрация: 6-07-04
Из: Санкт-Петербург
Пользователь №: 274



Цитата(Дон Амброзио @ Feb 12 2008, 07:55) *
Ведь она (эта задача) запускается всё равно по системному таймеру.

Эта задача может тупо не запуститься, переполнение стека у вас, например, адрес возврата в контекст потерся... А системный таймер все равно будет тикать. Система не работоспособна а watchdog нормально сбрасывается...
Go to the top of the page
 
+Quote Post
Дон Амброзио
сообщение Feb 12 2008, 11:50
Сообщение #8


Местный
***

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



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

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


--------------------
После устранения бага в программе она стала работать....хуже
Go to the top of the page
 
+Quote Post
Cosmojam
сообщение Feb 5 2012, 17:52
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 311
Регистрация: 12-01-11
Из: Калининград (Koenigsberg)
Пользователь №: 62 182



Сории за некропостинг, не хочу плодить новых тем

Насколько правильно кормить (или всё же пинать?) дога в idle task ? По идее если всё работает исправно, то никакой процесс (процессы) не займёт процессор настолько долго чтобы idle не был вызван в течение таймаута вотчдога, а если это произошло - значит что-то не так


--------------------
typedef enum { no, yes, maybe } bool; | блог тут
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 5 2012, 18:28
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 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 так не организовать (или можно? зависит от цпу), нужно сильней изголятся.
Go to the top of the page
 
+Quote Post
maksimp
сообщение Feb 5 2012, 18:41
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023



Каждая задача кроме одной выставляет время от времени свой флаг о том что она работают верно. Последняя задача, если она тоже работает верно, проверяет все эти флаги и если все они стоят то дёргает таймер, и сбрасывает все эти флаги.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 5 2012, 18:50
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 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) *
если все они стоят то дёргает таймер, и сбрасывает все эти флаги.

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


Go to the top of the page
 
+Quote Post
sla000
сообщение Feb 6 2012, 02:21
Сообщение #13


Участник
*

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



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

+1
Go to the top of the page
 
+Quote Post
maksimp
сообщение Feb 6 2012, 02:55
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023



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

Такого не имел в виду. Просто последняя по порядку изложения мысли, та самая одна кроме которой.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 08:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.01602 секунд с 7
ELECTRONIX ©2004-2016