23
Сторожевой таймер
Допустим, в нашей системе есть некий процесс, выполняющий какую-либо
полезную задачу. Назовем его прикладным или наблюдаемым процессом. Если
процесс выполняет важную целевую функцию, то прекращение его
деятельности может привести к остановке работы всей встроенной системы, то
есть к сбою. Если не принять особых мер по обнаружению
таких ситуаций,
встроенная система может работать некорректно в течении достаточно долгого
времени. Для вывода систем из сбойного состояния и приведения её в
нормальный режим функционирования обычно используют сторожевой таймер.
Таким образом, сторожевой таймер является механизмом защиты системы
от сбоев.
Рассмотрим работу сторожевого таймера подробнее. В работе участвуют
три процесса: наблюдаемый прикладной
процесс, процесс сторожевого таймера
и служебный процесс, реализующий механизм защиты системы от аварийных
ситуаций. Суть механизма сторожевого таймера состоит в проверке критерия,
по которому можно определить, что наблюдаемый процесс работает нормально.
Если сторожевой таймер обнаруживает, что с наблюдаемым процессом все в
порядке, то ничего не происходит. Если сторожевой таймер определил,
что с
наблюдаемым процессом что-то не так, происходит передача информации
системе разрешения аварийных ситуаций, которая, в свою очередь, принимает
решение о дальнейшей судьбе наблюдаемого процесса.
В самом примитивном варианте в качестве сторожевого таймера выступает
обычный вычитающий счетчик. Во время инициализации в счетчик
записывается какое-либо значение. Если в процессе работы
в счетчик
эпизодически вносится новая константа, то ничего не происходит. Если же
прикладной процесс не успевает записать константу, и счетчик успевает
досчитать до нуля, вырабатывается сигнал аппаратного рестарта и процессор
перезапускается. Естественно, простой вариант реализации сторожевого
таймера не является 100% гарантией от выхода системы из сбойного состояния.
Рассмотрим типичную ошибку, допускаемую
программистами при
использовании простого сторожевого таймера. Для того, чтобы
контролируемый процесс прекратил работу, достаточно вставить код
обновления счетчика сторожевого таймера внутрь цикла проверки, который
будет всегда давать ложное значение из-за какой-либо ошибки (в аппаратуре
или программе).
while( device_ready() == 0 ) reset_watchdog_timer();
Если функция devive_ready всегда будет возвращать ноль, то мы
бесконечное время будем сбрасывать сторожевой таймер и система будет всегда