|
1. Соединение верхнего и нижнего уровней Независимо от того, насколько хороша операционная система — будь то нынешний Win7 или будущие Win8 и Win9 — всегда будет BlueScreen, не говоря уже о небольшом микроконтроллере~ Непредсказуемые причины, такие как электрический шум, отключение питания, электростатический разряд и т.д., могут привести к ненормальной работе встроенной системы. Точнее, Watch Dog должен быть таймером watchdog — это структура схемы, специально используемая для мониторинга состояния работы программы микроконтроллера. Основной принцип таков: после запуска таймера сторожевой собаки он начнёт отсчёт с 0, если программа не выполнит его вовремя в указанный временной интервал, таймер сбросит систему (эквивалентно перезагрузке компьютера), как показано на рисунке ниже (нарисован в Word, рисунок более болезненный~):
Давайте представим простой способ применения сторожевой собаки: как отпустить собаку? Как кормить? Что будет, если не кормить его? 2. История сторожевой собаки(1) Введение в экспериментЕсли собака накормлена, система работает нормально; Если не кормить собаку, система постоянно перезагружается. (2) Блок-схема программы
(3) Экспериментальный исходный код и анализ/*
Описание эксперимента: В эксперименте с сторожем, если собаку не кормят, система продолжает перезапускаться.
*/
#include
#define led1 P1_0
#define led2 P1_1
#define led3 P1_2
#define led4 P1_3
/*系统时钟初始化
-------------------------------------------------------*/
пустотаxtal_init(пустота)
{ SLEEP &= ~0x04; //都上电
в то время как(! (SLEEP &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; Выберите кристаллический осциллятор на 32 МГц СОН |=0x04;
}
/*LED初始化
-------------------------------------------------------*/
пустотаled_init(пустота)
{ P1SEL =0x00; P1 — это обычный порт ввода-вывода P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3 выход
led1 =1; //关闭所有LED led2 =1; led3 =1; led4 =1;
}
/*看门狗初始化
-------------------------------------------------------*/
пустотаwatchdog_Init(пустота)
{ WDCTL =0x00; //看门狗模式,时间间隔一秒 WDCTL |=0x08; //启动看门狗
}
/*喂狗程序
-------------------------------------------------------*/
пустотаFeetDog (пустота)
{ WDCTL =0xa0; WDCTL =0x50;
}
/*延时函数(小于1秒。读者可以想一下,若大于1秒,会出现什么情况)
-------------------------------------------------------*/
пустотаЗадержка(пустота)
{
Без подписания intn;
для(n=50000; n>0; n--);
для(n=50000; n>0; n--);
для(n=50000; n>0; n--);
для(n=50000; n>0; n--);
для(n=50000; n>0; n--);
для(n=50000; n>0; n--);
для(n=50000; n>0; n--);
}
/*主函数
-------------------------------------------------------*/
пустотаОсновная(пустота)
{ xtal_init(); led_init(); watchdog_Init();
Задержка(); led1 =0; //点亮led1
в то время как(1) { FeetDog(); Команда кормления собаки (система не сбрасывается после подключения, и маленький индикатор не мигает; Если аннотировать, система будет продолжать сбрасываться, и маленький индикатор будет мигать каждые 1 секунды) }
}
Как видно из исходного кода выше, метод работы Watch Dog очень прост, и весь процесс включает только новый SFR, а именноWDCTL。Ниже приведено конкретное описание CC2430 в китайском руководстве:
Использование сторожевых собак можно резюмировать следующим образом:Выберите режим → выберите интервал таймера → поставьте собаку → кормить собаку (1) Режим выбора: Таймер сторожевой собаки имеет два режима: «режим сторожевой собаки» и режим «таймер». В режиме таймера он эквивалентен обычному таймеру, и при достижении интервала таймера возникает прерывание (вы можете найти его в файле ioCC2430.h с вектором прерывания WDT_VECTOR); В режиме watchdog, когда достигнут запланированный интервал, прерывания нет, вместо этого в систему отправляется сигнал сброса. В этом эксперименте она прошлаWDCTL. MODE=0чтобы выбрать режим хранителя. (2) Выберите запланированный интервал: Как показано на рисунке выше, есть четыре тактовых периода на выбор, и для удобства проверки мы выбираем интервал времени в 1с (то есть порядок).WDCTL.INT=00)。 (3) Отпустить собаку: ПорядокWDCTL.EN=1Чтобы запускать таймер сторожевой собаки. (4) Кормить собаку: Как только таймер запускается, он начинает считать с 0. Пока её количество не достигнет 32768 (то есть <1), если мы кормим собаку следующим кодом: WDCTL =0xa0; WDCTL =0x50;
Затем счётное значение таймера будет сведено до 0, и он снова начнёт отсчёт от 0x0000, что не позволяет отправить сигнал сброса, который отображается на плате разработки: LED1 всегда будет включён и не будет мигать; Если мы не кормим собаку (то есть не выставляем этот код), то когда количество таймеров достигает 32768, появляется сигнал сброса, и программа запускается с нуля, что отображается на плате разработки: LED1 постоянно мигает, а интервал мигания равен 1 секунде. (Примечание: программа кормления собак должна строго соответствовать вышеуказанному коду, и порядок обратного/неправильного/написанного меньше не будет играть роль в устранении 0.) ) Советы по CC2430Две дополнительные заметки: (1) ВРежим сторожевой собакиЕсли таймер watchdog был включён, установка 0 на WDCTL.EN недействительна (то есть этот бит не может остановить таймер); (2) ВРежим таймера, вы можете записать 1 в WDCTL.CLR[0], чтобы очистить таймер; Запись 0 в бит включения WDCTL.EN останавливает таймер, а запись 1 в бит включения запускает таймер с 0x0000 и далее.
(4) Экспериментальные результаты:Если добавить функцию FeedDog, запустить код и обнаружить, что LED1 всегда включён (система не сбрасывается); Если вы оставите комментарий к функции FeedDog, запустите код и обнаружите, что LED1 мигает с интервалом в 1 секунду (система сбрасывается каждые 1 секунды). 3. ЗаключениеВ этом разделе описывается принцип и использование часовых схем наблюдения. На практике, если требуется высокая надёжность, в системе может использоваться сторожевой дог. Когда система по какой-то причине выходит из строя (она больше не может кормить собаку), собака, которую никто не кормит, лает: «Хозяин, есть аномалия, есть аномалия! ” Для беспроводной сенсорной сети энергопотребление во время выполнения является ключевым аспектом оценки производительности. В следующем разделе мы обсудим сон системы CC2430 и его прерванный сигнал пробуждения.
|