Jack Ganssle
Digi-Key
Сторожевой таймер (WatchDog Timer, WDT) – это аппаратный модуль, который следит за выполнением программного кода и выполняет сброс процессора при зависании программы. На протяжении многих лет в мире встраиваемых систем продолжались яростные дискуссии относительно их важности. Многие инженеры считали, что сторожевые таймеры не нужны, что самым лучшим решением было бы написать надежную программу. Что тут скажешь, совершенство – благородная и заманчивая цель.
Однако немногие продукты когда-либо достигают такого уровня качества. При существующей скорости разрастания объемов программного обеспечения, даже бескомпромиссный акцент на качестве вряд ли приведет к совершенству. Миллион строк программного кода, даже если код корректен на 99.9% (причем это число гораздо выше, чем реально достигнуто подавляющим числом компаний), содержат 100 скрытых ошибок. Любая из них может вызвать сбой в системе, или еще хуже, ввести ее в опасный режим работы. Увы, среднее количество встраиваемых систем поставляется лишь с 95% устраненных ошибок.
Ошибки в программе не единственная проблема. Отлично спроектированное и построенное оборудование, на котором выполняется безупречный код, все равно может работать со сбоями.
Все чаще причиной проблем в цифровых системах становятся космические лучи. Состоящие в основном из протонов высокой энергии, они могут взаимодействовать с транзисторами микросхем и вызывать изменение состояния ячеек памяти. Для самых первых микропроцессоров это представляло меньшую угрозу, чем для современных, так как сегодня геометрические размеры 28 нм уже не редкость, а 45 нм стали нормой.
В 1990 году компания IBM подсчитала, что в типовом компьютере за счет космических лучей возникает одна ошибка в месяц на каждые 256 Мбайт ОЗУ. С тех пор топологические нормы значительно уменьшились и, предположительно, проблема обострилась.
Intel считает, что в будущем космические лучи могут стать источником еще более серьезных компьютерных ошибок. Компания запатентовала технологию (патент 7309866), по которой для обнаружения космических лучей и формирования корректирующих сигналов используется MEMS датчик.
Х. Кабаяши (H. Kobayashi) и др. обнаружили, что ошибок из-за космических лучей и других частиц в два с лишним раза больше в устройствах, выполненных по 180-нм технологии, чем в устройствах с проектными нормами 250 нм.
В 2004 году компания Tezzaron Semiconductor опубликовала результаты исследований, из которых следовало, что наиболее подвержены влиянию космических лучей модули SRAM и логика [5]. По утверждению авторов работы, в системе с 1 Гбайт SRAM ошибки могут возникать каждые две недели, а в Денвере, расположенном на уровне моря, проблема усугубляется в 10 раз.
Удивительно, что частица с ничтожным зарядом 10 фКл (фемтокулон) обладает достаточной энергией для переключения ячейки памяти SRAM. Еще десять лет назад, когда элементы микросхем были крупнее, для этого требовалась энергия в пять раз больше.
Вывод: даже идеально написанный код не в состоянии защитить от сбоя. Только сторожевой таймер может помочь восстановить работу системы.
Основные характеристики сторожевого таймера
Поскольку сторожевой таймер – это последняя «линия обороны», его архитектура должна предвидеть любые сбойные ситуации. Вы спросите, каковы же характеристики сторожевого таймера?
Прежде всего, сторожевой таймер должен быть независимым от процессора. В каком бы режиме не находился процессор, сторожевой таймер должен функционировать. Кроме того, после первоначальной настройки при инициализации процессор не должен иметь никакой возможности отключить или перепрограммировать сторожевой таймер. В противном случае сбой может привести к случайному отключению защитного механизма, что делает его бесполезным.
Сторожевой таймер всегда, при любых условиях, за исключением, возможно, аппаратных сбоев, может вернуть систему к жизни. Это предполагает подачу на процессор аппаратного сброса, и никакой другой способ не гарантирует восстановления работоспособности.
Некоторые сторожевые таймеры вместо сигнала сброса выдают немаскируемое прерывание. Идея состоит в том, что процедура обслуживания немаскируемых прерываний может сохранить содержимое стека и отладочную информацию. Увы, нет оснований полагать, что неправильно функционирующий процессор будет отвечать на любое прерывание. Имеется довольно много задач, которые должны быть выполнены прежде, чем будет вызван обработчик прерывания. На многих процессорах, например, процедура обработки прерывания не запустится, если указатель стека будет нечетным, или будет иметь не выровненные адреса. Более того, процессор может уйти в режим Double-Bus Fault, в котором он отключается, и восстановить работу может только аппаратный сброс.
Тем не менее, подход с немаскируемыми прерываниями интересен. Один из используемых иногда вариантов предполагает запуск таймера одновременно с выдачей немаскируемого прерывания. Через несколько миллисекунд таймер сбросит процессор, а затем обработчик прерывания, если он работает, сохранит отладочную информацию, но неизбежный аппаратный сброс гарантирует восстановление работы процессора.
Особенно важно, чтобы сторожевой таймер, независимо от состояния процессора, переводил систему в безопасное состояние, если она управляет угрожающим здоровью оборудованием. Подвижные части механизмов, источники опасного излучения и т.п. обязательно должны останавливаться или отключаться, так как сброс может не воздействовать на процессор, если процессор поврежден.
Нередко современные встраиваемые системы имеют очень сложные периферийные устройства, которые, в некоторых случаях, могут быть сложнее самого микропроцессора. Сигнал сброса от сторожевого таймера должен гарантировать, что все периферийные устройства и линии ввода/вывода перейдут в известное состояние. Программный сбой может привести к передаче искаженных потоков данных от процессора к периферии. Если архитектура периферийных устройств такова, что процессор не всегда может перевести их в определенное корректное состояние, эти устройства должны иметь возможность аппаратного сброса от сторожевого таймера.
Наконец имеет смысл, если это возможно, оставить отладочную информацию. Примером может служить упомянутая выше ситуация с немаскируемыми прерываниями. Сохранение стека и других критических данных в области энергонезависимой памяти, к которой разработчики могут получить доступ, обычно позволяет выявить источник проблемы. К сожалению, сброс уничтожает всю информацию о состоянии процессора, но зачастую имеются данные приложения, которые могут помочь в диагностике, например, указатели на таблицы состояний машины, которые можно сохранить перед инициализацией после сброса. Если есть часы реального времени, то можно сохранить и время сброса.
Часть 2 - Встроенные в микроконтроллеры и внешние сторожевые таймеры