В критическом участке кода ставится счетчик прохода через него, и он сбрасывается в каждом проходе, а обработчик прерывания упорно пытается этот счетчик нарастить, если не было долго проходов, т.е. программа где то застряла в боковой ветви, обработчик прерывания увидит это и уже сам вдарит на полный сброс. В этом случае есть два преимущества : 1. Можно самому задавать через какое время сработает сброс (т.к. обработчик выходит на проверку через фиксированное время, а счетчик циклов работает как множитель запаса по времени 2. Нет нужды команды watchdog рассовывать непосредственно в теле программы, можно за ними не уследить, потом намаешься.
А вообще watchdog нужен на самом деле только на 50%, кстати внешний watchdog тоже проблемы не решает. Потому что если MSP430 завис так, как он может его оттуда можно вытащить только через закорачивание по питанию. Вот чтобы он туда не попал нужно соблюсти две вещи : 1. Поставить внешний супервизор на питание (у 1611 он уж встроен) 2. Контролировать стек (это самый узкий момент)
Как показали испытания самым критичным у MSP является ситуация, когда в одно мгновение перепахивается вся оперативка, указатель стека попадает неизвестно куда и вот тут-то он может конкретно зависнуть. Для этого в том же обработчике прерывания ставится программа контроля за стеком. Если указатель стека не находится в указанных пределах, тут же уйти на сброс. Кстати уходить на сброс лучше всего так: DINT() WDTCTL=0x00 Вот если вы это все сделаете, можно гарантировать бесперебойную работу Вашего устройства.
Все это есть в файлике, который я уже выложил (см на первой стр).
|