Независимый сторожевой таймер (IWDG) или оконный сторожевой таймер (WWDG)?


15

Я все еще ищу, чтобы найти ответ на этот вопрос:

Почему, хотя микроконтроллеры stm32 имеют идеальный сторожевой таймер (я имею в виду сторожевой таймер Window (WWDG)), существует простой сторожевой таймер (Independent watchdog (IWDG))?

Я нашел эту страницу , которая сказала:

ST Microelectronics имеет линейку устройств Cortex-M3. M3 стал чрезвычайно популярным для встраиваемых устройств более низкого уровня, и STM32F от ST представляет эти части (хотя WDT является надстройкой ST и не обязательно отражает реализации других производителей). STM32F имеет два разных защитных механизма. "Independent Watchdog" - это довольно ванильный дизайн, которому мало что нужно, кроме простоты использования. Но их Window Watchdog предлагает более надежную защиту. Когда таймер обратного отсчета истекает, генерируется сброс, который может быть затруднен путем перезагрузки таймера. Ничего особенного там нет. Но если перезагрузка происходит слишком быстро, система также будет сброшена. В этом случае «слишком быстро» определяется значением одной программы в регистре управления.

Еще одна интересная особенность: он может генерировать прерывание непосредственно перед сбросом. Напишите немного кода, чтобы поймать прерывание, и вы можете предпринять некоторые действия, например, чтобы перевести систему в безопасное состояние или сделать снимок данных для целей отладки. ST предлагает использовать ISR для перезагрузки сторожевого таймера, то есть пнуть собаку, чтобы сброс не происходил. Не прислушивайся к их советам. В случае сбоя программы обработчики прерываний вполне могут продолжать нормально функционировать. И использование ISR для перезагрузки WDT делает недействительной всю причину сторожевого устройства окна.

и это :

Новая серия процессоров STM32F4 Cortex ™ -M4 от STMicroelectronics имеет два независимых сторожевых таймера. Один работает от собственного внутреннего RC генератора. Это означает, что в процессоре может произойти сбой всевозможных вещей, и WDT все равно будет срабатывать. Существует также «оконный сторожевой таймер» (WWDT), который требует, чтобы код вызывал его часто, но не слишком часто. Это очень эффективный способ гарантировать, что сбойный код, который случайным образом записывает в механизм защиты, не вызывает щекотку WDT, и WWDT может генерировать прерывание незадолго до того, как произойдет сброс.

хорошо, давайте посмотрим в справочном руководстве :

STM32F10xxx имеет две встроенные сторожевые периферийные устройства, которые обеспечивают сочетание высокого уровня безопасности, точности синхронизации и гибкости использования. Обе сторожевые периферийные устройства (независимая и оконная) служат для обнаружения и устранения неисправностей из-за сбоя программного обеспечения, а также для запуска сброса системы или прерывания (только сторожевая программа окна), когда счетчик достигает заданного значения времени ожидания. Независимый сторожевой таймер (IWDG) синхронизируется с помощью своих собственных выделенных низкоскоростных тактовых импульсов (LSI) и, таким образом, остается активным даже в случае отказа основных тактовых импульсов. Часы сторожевого устройства окна (WWDG) предварительно масштабируются из часов APB1 и имеют настраиваемое временное окно, которое может быть запрограммировано для обнаружения аномально позднего или раннего поведения приложения. IWDG лучше всего подходит для приложений, которые требуют, чтобы сторожевой таймер работал как полностью независимый процесс вне основного приложения, но имеют более низкие ограничения точности синхронизации. WWDG лучше всего подходит для приложений, требующих, чтобы сторожевой таймер реагировал в пределах точного временного интервала.

Оконный сторожевой таймер используется для обнаружения сбоя программного обеспечения, обычно вызванного внешними помехами или непредвиденными логическими условиями, которые заставляют прикладную программу отказаться от своей нормальной последовательности. Схема сторожевого устройства генерирует сброс MCU по истечении запрограммированного периода времени, если только программа не обновляет содержимое счетчика вниз до того, как бит T6 станет очищенным. Сброс MCU также генерируется, если 7-разрядное значение обратного счетчика (в регистре управления) обновляется до того, как обратный счетчик достигнет значения регистра окна. Это означает, что счетчик должен обновляться в ограниченном окне.

Как вы можете видеть, ни один из них не сказал , что почему есть два сторожевые. если я спрошу, каковы различия между обеими сторожевыми системами, вы подсчитаете все функции, которые вы видите в приведенном выше, и если вы захотите сравнить обе функции, очевидно, сторожевая программа Window (WWDG) станет победителем! тогда зачем два сторожа?

Я хочу знать, когда я должен использовать IWDG, а когда WWDG?

и есть ли причина, которая говорит нам Почему они называют вторые часы этим именем -> «Сторожевой таймер»?

Ответы:


23

Обычные сторожевые таймеры должны быть сброшены за некоторое время до истечения времени ожидания. Если у вас есть 100 мс WDT, вы можете сбросить его каждые 99,9 мс или каждые 10 мкс, и он никогда не истечет.

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

Цель, если это не очевидно, состоит в том, чтобы помочь гарантировать, что код, сбрасывающий WDT, является предполагаемым кодом, работающим по назначению. Некоторая непредвиденная ситуация, которая приводит к высокочастотному сбросу WDT, не помешает перезагрузке системы.

Запуск WDT от системных часов может быть проблемой - если часы не работают и если нет независимой схемы контроля часов, могут произойти плохие вещи. Независимые часы для WDT означают, что если вещь по какой-то причине начнет работать на 1/10 скорости, WDT будет сброшен (но окно WDT не будет).

Используйте оба, если можете.

Как говорится на странице, сброс WDT с помощью ISR, как правило, плохой, но может быть приемлемым, если ISR проверяет, что сброс встроенного программного обеспечения функционирует перед сбросом таймера).


Неужели возможно, что системные часы не работают? если это произойдет, тогда мы сможем это понять. таким образом, WDT не полезен, я прав? тогда почему это будет беспокоить?
Ро

1
Если независимые часы WDT переводят MCU в состояние сброса (и это состояние является безопасным), то, возможно, можно предотвратить аварию. Короткий кристалл MCU в первые дни стал причиной серьезной аварии (BART, IIRC).
Спехро Пефхани

1
@Roh: Я действительно видел, как системные часы не возвращаются после перехода в спящий режим на этом самом процессоре (ну, STM32 F0, который является M0). Оказывается, что когда вы делаете определенные вещи в определенное время, часы PLL могут не запуститься, и все это работает с 1/6 скорости.
Натон

@ Натон Спасибо. интересный. полностью ненавижу серию M0. Похоже, что каждая серия STM имеет проблемы.
Ро

7

Текст, который вы вставили в вопрос, дает ответы, которые вам нужны.

  1. IWDG используется, когда вам нужен простой сторожевой таймер или когда вам нужен полностью независимый сторожевой таймер - у IWDG есть свои собственные часы, WWDG получает свои часы от одного из шинных часов - если он выходит из строя или ваше программное обеспечение отключает его, то сторожевой таймер умирает.
  2. Вы используете WWDG, когда вам нужен сторожевой таймер, который можно сбросить только в течение определенного промежутка времени (окна). Если ваше программное обеспечение сбрасывает WWDG слишком поздно, тогда WWDG отключит перезагрузку процессора. Если ваше программное обеспечение сбрасывает WWDG слишком рано, то это также приведет к перезагрузке процессора.

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

Оба выполняют одинаковую работу, но делают их по-разному. То, что вам нужно, зависит от требований, которым вы должны соответствовать.


Пожалуйста, прочитайте мой комментарий к Spehro Pefhany.
Ро

1
Таймер, который использует WWDG, является программируемым - вы можете изменить его скорость с помощью вашего программного обеспечения. Если ваше программное обеспечение выходит из-под контроля и изменяет частоту APB1, то временное окно будет неправильным, и сторожевой таймер будет постоянно перезагружать ваш процессор - ваш сторожевой таймер никогда (или только по стечению обстоятельств) не ударит сторожевой таймер в нужное время. Ваша программа может также быть в состоянии полностью отключить часы APB1 или таймер WWDG, и в этом случае она никогда не перезагрузит ваш процессор.
JRE

5

Есть и другая причина использования сторожевого устройства окна, либо вместо, либо в дополнение к независимому сторожевому устройству. У WWDG есть прерывание, которое вы можете перехватить. Это означает, что, если код попал в петлю или фугу, вы можете установить точку останова в ISD WWDG и работать в обратном направлении, чтобы выяснить, что делала прошивка, когда собака лаяла.

Вы не можете сделать это с IWDG. Как следует из названия, это не зависит от процессора. Вместо того, чтобы вызывать прерывание, оно просто утверждает и сбрасывает / СБРОС - что не дает вам много подсказок о том, почему оно лает. Я настоятельно рекомендую установить WWDG в пределах ваших нормальных рабочих параметров, плюс IWDG на гораздо более длительный период, возможно, максимум 2 * WWDG. Создайте функцию кик-дога, которая пинает обоих. Таким образом, IWDG лает только тогда, когда WWDG блокируется, как окончательное резервное копирование.


1

Мой взгляд на это:

Используйте оба одновременно, потому что они ищут разные условия отказа:

В таймер Independent Watchdog (IWDG) должен быть сброшен постоянно перед ним раз вне. На практике вы можете просто добавить код сброса везде, где у вас есть допустимое состояние программы, или один раз в основной цикл, если у вас есть основной цикл, который должен выполняться часто без каких-либо серьезных задержек. Таким образом, если ваш призыв сбросить таймер (это иногда называется «петтинг», «щекотка» или «сброс» «сторожа») не происходит во времени, это означает, что ваш код А) случайно застрял где-то, чего вы не предвидели - какое-то непредвиденное состояние типа бесконечного цикла, или B) намеренно застряло там, где вы принудительно применяетеassert()вызов функции со встроенным бесконечным циклом, в который вы хотите, чтобы код выполнялся всякий раз, когда какое-либо важное условие не выполняется . Итак, теперь, когда ваше условие утверждения ложно, ваш код намеренно застревает в бесконечном цикле, и сторожевой таймер сбрасывает микроконтроллер, чтобы вернуть его в правильное состояние. Обратите также внимание на то, что «независимый сторожевой таймер (IWDG) синхронизируется своими собственными выделенными низкоскоростными часами (LSI) и, таким образом, остается активным даже в случае сбоя основных часов» (см. Справочное руководство ST RM0008, стр . 493 ).

Однако мне кажется, что таймер Window Watchdog (WWDG) предназначен не для случаев, описанных выше (где ваш код непреднамеренно или преднамеренно [через утверждение) где-то «застревает»), а более конкретно для случая, когда А) ваш код НЕ выполняет то, что должен . Другими словами, он имеет ошибку, которая заставляет его основной цикл или другой подраздел кода выполняться слишком быстро (или быть пропущенным полностью), поэтому вы слишком быстро сбрасываете сторожевой таймер за пределами его окна, и mcu получает сброс. Или, б)другое условие, которое он может обнаружить, - неудачная установка таймера. Возможно, вы сбрасываете его через фиксированный интервал, но ваш таймер, использованный для создания этого интервала, либо случайно изменяет свои конфигурации там, где его не должно быть, либо вы вначале неверно конфигурируете его, затем временной интервал будет отключен, ваш фиксированный Сброс временного интервала сбросит WWDG за пределы своего окна (либо слишком рано, либо слишком поздно), а mcu будет сброшен, чтобы уведомить вас и / или исправить состояние.

Это мое мнение. Мысли или отзывы приветствуются.


0

«оконный» сторожевой таймер является обычным сторожевым таймером, который защищает некоторых от еще худших практик программирования. Как говорили другие, у вас есть «временные рамки», которые обычно настраиваются там, где должен быть указан ваш «корм».

Ни один из них не является пуленепробиваемым, если ваш код может войти в автоматически поддерживаемый цикл. Например. Если вы планируете «кормить» на основе IRQ, связанных с таймером, это может быть очень плохой практикой, поскольку ваш код может застрять в некоторых действиях / в потоке почты, в то время как прерывания могут по-прежнему кормить ваш WWDT в правильной последовательности.

На самом деле, вы можете использовать прерывания для подачи в WWDT, если вы можете снизить приоритет IRQ при нормальном коде выполнения, как вы можете это сделать в MIPS (Microchip).

Если ваш код жизненно важен, важен и т. Д., Просто отбросьте их все и используйте внешний WDT (предпочтительно на основе вопросов и ответов).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.