|
Как правильно использовать сторожевой таймер с РТОС?, wathdog timer, RTOS |
|
|
|
Feb 18 2018, 11:43
|
Группа: Новичок
Сообщений: 1
Регистрация: 9-03-16
Пользователь №: 90 775

|
Сейчас период таймаута выбран 0,5 сек, обнуление счетчика сторожевого таймера происходит в одной задаче РТОС, которая начинает выполняться только через 1 секунду после подачи питания (такая особенность). Получается сторожевой таймер срабатывает раньше… Где должен обнуляться счетчик сторожевого таймера? Сейчас он обнуляется в одной из задач РТОС, почти безусловно, т.е. контролируется только правильность работы этой задачи. Как контролировать остальные, особенно если они взаимосвязанные (ждут результатов работы других задач)? Или задачи во время своего выполнения сами должны анализировать себя и сигнализировать выше, но если РТОС вытесняющая, то задача может прерваться и анализ оказаться неполным или не быть готовым к моменту принятия решения о сбросе по сторожевому таймеру. Как тут быть? Обязательно ли проводить самодиагностику сторожевого таймера при подаче питания (когда ждем сброса по срабатыванию сторожевого таймера, а после него фиксируем успешность его работы и загружаемся как обычно). Но это ограничивает период таймаута сторожевого таймера, чтобы долго не загружать устройство. Спасибо!
|
|
|
|
|
 |
Ответов
|
Mar 4 2018, 04:23
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
О, про WWDT я и забыл, а когда видел, путал с AWD, где задается окно ADC. Выходит, WWDT подходит именно для программы, работающей периодично. Планировщик задачи - самое то. Сбрасывать сторожевой таймер в низкоприоритетном процессе - это хорошо, но как быть, когда высшие задачи забрали все время? Можно создать задачу с высоким приоритетом, которая только и сбрасывает таймер. Все остальные зависания задач разруливать средствами ОС.
|
|
|
|
|
Mar 4 2018, 08:08
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(ViKo @ Mar 4 2018, 07:23)  Выходит, WWDT подходит именно для программы, работающей периодично. Нет, он создан для любых программ. Причем WWDT значительно упрощает прохождение тестов на безопасность приложения (медицина, космос и т. п.). Цитата Планировщик задачи - самое то. Нет, т.к. планировщик будет вызван в любом случае, ведь системный таймер работает всегда (речь про вытесняющую многозадачность). Цитата Сбрасывать сторожевой таймер в низкоприоритетном процессе - это хорошо, но как быть, когда высшие задачи забрали все время? Вот тут я расписал самый на мой взгляд простейши способ применения WWDT: https://electronix.ru/forum/index.php?showt...p;#entry1549577Сложные (правильные) способы подразумевают связь остальных задач с этой задачей WWDT. Тогда она превращается в некую deamon-задачу, которая умеет мониторить сбои в других задачах. Так сделано в embOS. Сложные ситуации могут состоять не из одной сторожевой задачи, а из как минимум двух - в одной низкоприоритетной работает WWDT, в другой - высокоприоритетной - контроль зависания задач.Цитата(ViKo) Можно создать задачу с высоким приоритетом, которая только и сбрасывает таймер. Все остальные зависания задач разруливать средствами ОС. Цитата(jcxz) Лучше наоборот - с самым высоким. Или в прерывании. В таких случаях WDT становится бесполезным - ему ничто не мешает быть сброшенным. "The watchdog should never be kicked from an interrupt routine” ( MISRA Report 3, p. 38) Вот вам немного литературы для "подумать": https://barrgroup.com/Embedded-Systems/How-...hdog-Timer-TipsУ большинства коммерческих RTOS существуют даже целые API для правильного применения WDT в критичных приложениях. https://blog.segger.com/using-a-watchdog-in...os-environment/
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Mar 4 2018, 11:18
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Forger @ Mar 4 2018, 10:08)  В таких случаях WDT становится бесполезным - ему ничто не мешает быть сброшенным. В смысле - ничего? Вы безусловно что-ли генерите WDI? Естественно так делать не надо. Как я писал выше - у меня задача WDT (или это может быть и ISR) контролирует все прочие задачи, формируя WDI только когда очередная контролируемая задача ответила. Т.е. - когда очередная задача сказала что она жива. Ещё раз (для непонятливых): очередная контролируемая задача ответила на запрос задачи WDT (ISR-а WDT) - задача WDT формирует WDI и переходит к следующей контролируемой задаче (посылает ей запрос). Пока контролируемая задача не ответила - никаких WDI не формируется и через некоторое время будет сброс по WDT. И так - по кольцу все контролируемые задачи. Под "контролируемыми задачами" я понимаю не только собственно некие задачи ОС, а вообще некие циклические процессы, которые периодически проходят через начальное состояние. Это может быть служба вообще не имеющая задач ОС, а состоящая из машины состояний переключающейся по множеству разных прерываний/событий. Задача WDT должна быть предельно простой, чтобы минимизировать возможность зависания её самой из-за программного бага в ней. Задача WDT при переходе к контролю очередного процесса, перед посылкой запроса к нему, записывает в некую переменную информацию о стадии контроля. Эта информация должна сохраниться в ОЗУ при reset-е МК и будет записана в энергонезависимый журнал событий при старте ПО (если при старте ПО будет выявлено, что причина данного старта ПО - предыдущее срабатывание WDT). Таким образом позже можно будет проанализировать какие случаи зависаний возникают и в каких задачах. Именно поэтому задача WDT (или ISR WDT) должны быть самыми высокоприоритетными, чтобы какой-то зависший процесс не привёл к её блокировке и формированию ложной информации о причине сброса по WDT. Что именно "не мешает быть сброшенным" WDT в этом алгоритме? Цитата(Forger @ Mar 4 2018, 10:08)  "The watchdog should never be kicked from an interrupt routine” (MISRA Report 3, p. 38) "На каждую хитрую гайку - найдется свой болт с резьбой"... Вот Вам выдержка из user manual на XMC4500 касательно режима Pre-warning Mode WDT: While in pre-warning mode the effect of the overflow event is different with and without pre-warning enabled. The first crossing of the upper bound triggers the outgoing alarm signal wdt_alarm when pre-warning is enabled. Only the next overflow results a reset request. The alarm status is shown via register WDTSTS and can be cleared via register WDTCLR. A clear of the alarm status will bring the WDT back to normal state. The alarm signal is routed as request to the SCU, where it can be promoted to NMI.Т.е. - Infineon специально заложил в свои МК такую возможность - при наступлении WDT-таймаута не генерить тупо сброс, а активизировать прерывание, в котором ПО должно сделать какие-то проверки и, если всё ок, то сбросить WDT. Заметьте - сбросить внутри ISR!!! И такие возможности есть и в других МК. Так что оставьте свои религиозные убеждения " не употреблять некошерную пищу не сбрасывать WDT в прерываниях" - при себе. У нас тут вроде пока ещё светский форум
|
|
|
|
|
Mar 4 2018, 11:26
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(jcxz @ Mar 4 2018, 13:52)  Вы безусловно что-ли генерите WDI? В моем примере - да, безусловно. Поэтому приоритет самый низкий. Это - лишь часть необходимой сложной зашиты приложения. Но в простых проектах даже этого бывает вполне достаточно. Цитата Естественно так делать не надо. Тогда мы говорим о немного разных вещах (не в первый раз кстати  . В вашем случае сброс можно формировать из без WDT - просто ждать ответа очередной задачи по таймауту средствами RTOS. Не успела ответить - пишем событие в журнал, сбрасываем проц любым способом. Хотя это можно делать и через WDT. Я же предпочитаю WDT использовать чуть иначе: в сложных проектах помимо низкоприоритетной задачи с WWDT, я использую саму высокоприоритетную задачу, в которой контроллируются остальные задачи по подобному принципу, как у вас, но уже средствами самой RTOS. Такой же самый функционал в нормальных коммерческих RTOS встроен прямо в шедулер. Цитата У нас тут вроде пока ещё светский форум Если вы умеете готовить применять WDT, это еще не значит, что это умеют остальные  Поэтому, "давая" остальным возможность втупую сбрасывать WDT в прерываниях, вы тем самым открываете им "ящик пандоры". Очень хорошо, что по ходу дискуссии возникают подробности тех или иных применений WDT, разумных и оправданных применений с конкретными примерами. Плохо, что не сразу эти подробности появляются и потому возникают недопонимания, и порой эти подробности приходится "выдирать клещами"  зы. самый лучший WDT - внешний, в идеале со своим источником питания.
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Mar 4 2018, 12:24
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Forger @ Mar 4 2018, 13:26)  В вашем случае сброс можно формировать из без WDT - просто ждать ответа очередной задачи по таймауту средствами RTOS. Не успела ответить - пишем событие в журнал, сбрасываем проц любым способом. Хотя это можно делать и через WDT. Лучше это делать через WDT. Во-первых: Зачем плодить лишние сущности (высокоприоритетная задача для контроля + низкоприоритетная) если можно всё сделать в одном месте? Во-вторых: А если нужна длительная работа некоей задачи по длительной циклической обработке неких данных "как можно быстрее всё обработать, но реал-тайм не нужен - как всё закончили так закончили"? Тогда помещаем её на самый нижний приоритет и она там колбасит со 100%-ной загрузкой CPU. При этом отвечая на периодические запросы о живости от WDT-задачи. Вот у меня был проект, где нужно было быстро излучить некий зондирующий импульс (УЗ), захватить эхо-отклик на него, затем сделать его тяжёлую обработку, а потом - отобразить данные (или отправить их в интерфейс). Я сделал излучение/захват на высоком приоритете, потом - понижение приоритета задачи до минимального, чуть выше Idle (чтоб не мешала остальным работающим в это время реал-тайм задачам), длительная обработка на минимальном приоритете, после завершения - опять повышение приоритета задачи. При этом некоторое время процессор МК был загружен на 100%, и если-б контролировал WDT в самой низкоприоритетной задаче, то не успел бы завершить тяжёлую обработку из-за его срабатывания. Цитата(Forger @ Mar 4 2018, 13:26)  Поэтому, "давая" остальным возможность втупую сбрасывать WDT в прерываниях, вы тем самым открываете им "ящик пандоры". Я нигде не советовал "сбрасывать втупую в прерываниях". Это мне кажется самоочевидным. Это как с рекурсией - мне кажется само собой очевидным, что в рекурсии должна быть условная ветка, завершающая дальнейшее углубление. Так и тут. Цитата(Forger @ Mar 4 2018, 13:26)  зы. самый лучший WDT - внешний, в идеале со своим источником питания. Это не самый лучший - он просто обязателен. У меня во всех серьёзных проектах обязательно есть внешний WDT. И тот алгоритм контроля, что я описал, он в реале работает с парой: внутренний WDT + внешний WDT. Стараюсь везде так и строить работу: внутренний WDT + внешний WDT. Естественно - время таймаута внутреннего при этом чуть меньше таймаута внешнего WDT.
|
|
|
|
Сообщений в этой теме
Abcde Как правильно использовать сторожевой таймер с РТОС? Feb 18 2018, 11:43 Den64 Бывает что процессы зависают из-за ошибки алгоритм... Feb 18 2018, 12:02 jcxz Цитата(Abcde @ Feb 18 2018, 13:43) Где до... Feb 18 2018, 13:29 Baser Обычно период сторожевика выбирают от внешних усло... Feb 18 2018, 13:31 jcxz Цитата(Baser @ Feb 18 2018, 15:31) Нерегу... Feb 19 2018, 05:57  Arlleex Цитата(jcxz @ Feb 19 2018, 08:57) Контрол... Mar 1 2018, 19:03   jcxz Цитата(Arlleex @ Mar 1 2018, 21:03) Ну не... Mar 1 2018, 20:37 HardEgor Цитата(Abcde @ Feb 18 2018, 18:43) Где до... Feb 18 2018, 13:41 haker_fox QUOTE (Abcde @ Feb 18 2018, 19:43) Где до... Feb 19 2018, 00:44 Forger Цитата(Abcde @ Feb 18 2018, 14:43) Как пр... Mar 3 2018, 17:53 ViKo 1. Впервые слышу про сторожевой таймер в МК, котор... Mar 3 2018, 18:33 Forger Цитата(ViKo @ Mar 3 2018, 21:33) 1. Вперв... Mar 3 2018, 18:44 jcxz Цитата(ViKo @ Mar 3 2018, 20:33) 4. Сбрас... Mar 4 2018, 01:49 Den64 У меня в домашней автоматике, периодически, зависа... Mar 3 2018, 19:53 Forger Цитата(Den64 @ Mar 3 2018, 22:53) У меня ... Mar 3 2018, 21:26  Den64 Цитата(Forger @ Mar 4 2018, 00:26) В моме... Mar 3 2018, 22:31   Forger Цитата(Den64 @ Mar 4 2018, 01:31) Как пом... Mar 3 2018, 23:25    Den64 Цитата(Forger @ Mar 4 2018, 02:25) Вы в у... Mar 3 2018, 23:36     Forger Цитата(Den64 @ Mar 4 2018, 02:36) Это Вы ... Mar 3 2018, 23:41    Den64 Цитата(Forger @ Mar 4 2018, 02:25) В ваше... Mar 3 2018, 23:45     Forger Цитата(Den64 @ Mar 4 2018, 02:41) С чего ... Mar 3 2018, 23:58 Den64 Цитата(Forger @ Mar 4 2018, 02:58) Ваши с... Mar 4 2018, 00:12 Forger Цитата(Den64 @ Mar 4 2018, 03:12) Вытесня... Mar 4 2018, 00:17  Den64 Цитата(Forger @ Mar 4 2018, 03:17) Неважн... Mar 4 2018, 00:28   Forger Цитата(Den64 @ Mar 4 2018, 03:28) Согласе... Mar 4 2018, 00:32    Den64 Цитата(Forger @ Mar 4 2018, 03:32) Квант ... Mar 4 2018, 00:40     Forger Цитата(jcxz @ Mar 4 2018, 15:24) Лучше эт... Mar 4 2018, 12:59
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|