KEEN SIDE успешно заменяет аналогичные продукты таких известных брендов, как Phoenix Contact, Weidmueller, Degson, Winstar, Hsuan Mao, KLS, G-NOR, Mean Well и др.
РадиоЛоцман - Все об электронике

Руководство для разработчика по сторожевым таймерам. Часть 2 - Встроенные в микроконтроллеры и внешние сторожевые таймеры

Журнал РАДИОЛОЦМАН, август 2012

Jack Ganssle

Digi-Key

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Часть 1 - Общие сведения и назначение

Встроенные сторожевые таймеры

Сторожевые таймеры можно разделить на две основные группы: встроенные в процессор и внешние, добавляемые разработчиком аппаратной части. В большинстве микроконтроллеров имеется встроенные сторожевые таймеры, но их эффективность варьируется в широких пределах.

В качестве примера можно привести микроконтроллеры компании Maxim (ранее Dallas) DS80C320/DS80C323 – варианты микроконтроллера 8031, существующего уже достаточно давно. Сторожевой таймер этих микроконтроллеров имеет две особенности. Во-первых, его можно запрограммировать таким образом, чтобы он генерировал прерывания, но спустя 512 циклов сбрасывал микроконтроллер. Эта возможность очень упрощает сохранение отладочной информации. Во-вторых, можно ограничить доступ к регистрам сторожевого таймера, для чего достаточно выполнить две специфические парные инструкции перемещения, после чего открывается окно в три цикла, когда доступ к сторожевому таймеру становится возможным. Благодаря этому существенно снижается риск случайного отключения защитного механизма. Однако возникает вопрос, что произойдет, если между этими инструкциями произойдет прерывание. По-видимому, доступ к регистрам сторожевого таймера останется закрытым, и его включение станет невозможным. Очевидно, что программист должен запрещать прерывания на время выполнения инструкций, разрешающих доступ к сторожевому таймеру.

32-разрядные микроконтроллеры Freescale серии MCF520x существенно отличаются от DS80C320/DS80C323. Для обращения к сторожевому таймеру нужно выполнить две записи в его служебный регистр, но в промежутке между обращениями к регистру может выполниться любое количество инструкций. Это может стать причиной неработоспособности защитного механизма, если процессор работает неверно и выполняет случайный код. С другой стороны, регистр состояния сброса указывает, откуда поступил сигнала сброса: извне или от сторожевого таймера, а это хороший способ регистрации ошибок после перезагрузки. Можно запрограммировать сторожевой таймер на формирование либо только сигнала сброса, либо прерывания, но последний вариант очень плох. Если указатель стека станет нечетным, – в связи со сбоем или выполнением случайного кода, – система войдет в состояние Double-Bus Fault. Тогда прерывание от сторожевого таймера станет бесполезным, и для восстановления работы потребуется аппаратный сброс.

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

Интересно, что некоторые из микроконтроллеров имеют своего рода аналоговый сторожевой таймер, который срабатывает при превышении запрограммированного порога на входе АЦП. Благодаря такой функции можно контролировать напряжение питания и кратковременные провалы напряжения. Для систем, управляющих опасными механизмами, это особенно важно, и такой сторожевой таймер может использоваться для перевода устройства в безопасное состояние до того, как питание выйдет за установленные пределы.

Многие микроконтроллеры Microchip серии PIC24F, а также микроконтроллеров LPC18XX и LPC43XX компании NXP имеют оконные сторожевые таймеры. Они могут быть сконфигурированы так, что однократно включенные, в дальнейшем не смогут быть выключены программным способом, что обеспечивает более надежную защиту от исполнения случайного кода.

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

Внешние сторожевые таймеры

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

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

На рынке представлено множество микросхем сторожевых таймеров. В целом их работа программным обеспечением не контролируется, поэтому сбой микропроцессора повлиять на работу внешнего сторожевого таймера никак не может. Обычно эти микросхемы имеют дополнительную функцию сброса при подаче питания, что позволяет сократить количество внешних компонентов.

Одно из таких устройств выпускается компанией Maxim (Рисунок 1). Времена тайм-аута оконного сторожевого таймера MAX6751 задаются с помощью двух конденсаторов.

Время тайм-аута оконного сторожевого таймера MAX6751 устанавливается двумя конденсаторами
Рисунок 1. Время тайм-аута оконного сторожевого таймера MAX6751 устанавливается двумя конденсаторами.

Микросхема TPS3126 компании Texas Instruments, если не принимать во внимание незначительные отличия, похожа на оконный сторожевой таймер. Недорогой прибор в корпусе SOT-23 предлагается во множестве вариантов, различающихся диапазонами напряжений и времени задержки (Рисунок 2).

Микросхема Texas Instruments TPS3126 одновременно выполняет функции монитора напряжения питания и сторожевого таймера
Рисунок 2. Микросхема Texas Instruments TPS3126 одновременно выполняет функции монитора напряжения питания и сторожевого таймера.

Кроме того, у Texas Instruments есть целое семейство устройств, включая TPS386000, которые могут контролировать четыре шины питания и содержат сторожевой таймер с фиксированной задержкой. Причем один из каналов микросхемы рассчитан на отрицательное входное напряжение. Если на входе любого канала фиксируется недопустимое напряжение, активируется индивидуальный сигнал сброса. Весьма удобно, что выходы сброса имеют открытый сток и допускают соединение друг с другом. Эти выходы также можно подключить к входам микропроцессора, что позволит определить, в каком из источников возникли неполадки и принять соответствующие меры.

Функции сторожевого таймера и контроля напряжения одного источника питания выполняет простая микросхема ADM699 производства компании Analog Devices (Рисунок 3).

Микросхема Analog Devices ADM699 имеет очень простую и понятную архитектуру
Рисунок 3. Микросхема Analog Devices ADM699 имеет очень простую и понятную архитектуру.

Входы сброса некоторых современных микропроцессоров не допускают подачу сигналов с медленно нарастающими фронтами. Открытый сток транзистора отвечает этим требованиям только в случае использования подтягивающего резистора с малым сопротивлением, что значительно увеличивает энергопотребление. Для таких случаев Analog Devices выпускает несколько устройств, в частности, микросхему ADM6316 (Рисунок 4), имеющих двухтактный выход.

Микросхема сторожевого таймера Analog Devices ADM6316 имеет двухтактный выход
Рисунок 4. Микросхема сторожевого таймера Analog Devices ADM6316 имеет двухтактный выход.

Рекомендации по разработке программ

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

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

В однопоточных приложениях необходимо использовать архитектуру подобную конечному автомату. Примеры кода приведены в Листинге 1.

Листинг 1. Код обращения к сторожевому таймеру в однопоточном приложении.

main(){
   state=0x5555;
   wdt_a{);
   .
   .
   .
   .
   state+=0x2222;
   wdt b();
}

wdt_a(){
   if (state!= 0x5555) halt;
   state+=0x1111;
}

wdt_b(){
   if (state!= 0x8888) halt;
   kick dog;
   state=0;
}

В начале основного цикла программы переменной state присваивается значение 0x5555. Затем вызывается функция wdt_a(), в которой проверяется, является ли это значение правильным. Если нет, то происходит остановка и сторожевой таймер сбрасывает систему. В противном случае значение переменной state изменяется путем добавления смещения. Отметим, что в этом случае обращения к сторожевому таймеру нет.

В конце основного цикла (выполнен весь программный код) переменной state присваивается новое значение, и вызывается функция wdt_b(). Теперь, если значение переменной не соответствует ожидаемому (а это означает, что не весь основной цикл был пройден), выполнение кода останавливается и происходит сброс микропроцессора. Если же основной цикл был пройден полностью, и значение state корректно, сторожевой таймер сбрасывается и переменной state присваивается значение 0. Заметьте, что если произойдет программный сбой и произойдет вызов функции wdt_b(), значение переменной state будет неверным, и произойдет сброс.

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

Если возможны исключительные ситуации, при которых невозможно восстановление или продолжение выполнения кода, что может произойти вследствие деления на ноль или ошибки функции malloc(), необходимо написать обработчик, который будет запрещать прерывания и остановы. Сторожевой таймер в таком случае сможет вернуть систему к жизни.

Выводы

Сторожевой таймер является последней линией обороны от программных сбоев, и поэтому должен быть разработан и реализован очень тщательно. Многие современные микроконтроллеры имеют встроенные сторожевые таймеры, которые очень сложны и устойчивы к программным сбоям. Альтернативно возможно использование внешних сторожевых таймеров, и, вероятно, лучшим выбором будет таймер, поддерживающий «оконный» режим. Также следует уделить пристальное внимание структуре программы, чтобы неправильно выполняющийся код не влиял на обращения к сторожевому таймеру, и не препятствовал выполнению его основной функции – сбросу процессора.

digikey.com

Перевод: Vadim по заказу РадиоЛоцман

На английском языке: A Designer's Guide to Watchdog Timers. Part 2 -Internal and External WDTs, Software considerations

Электронные компоненты. Бесплатная доставка по России
Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться.
Имя
Фрагменты обсуждения:Полный вариант обсуждения »
  • У меня некоторые программы не работали с включенным сторожевым таймером(не было перехода к обработке прерывания). Стоит его("собаку") отключить, все работает как задумано. Сделал вывод, - внимательнее относиться к коду и аппаратной части устройств... И во многих случаях можно обойтись без "собак"....