|
1. З'єднання верхнього та нижнього рівнів Незалежно від того, наскільки хороша операційна система — чи то нинішній Win7, чи майбутні Win8 і Win9 — завжди буде BlueScreen, не кажучи вже про невеликий мікроконтролер~ Непередбачувані причини, такі як електричний шум, відключення живлення, електростатичний розряд тощо, можуть спричинити аномальну роботу вбудованої системи. Watch Dog, якщо бути точним, має бути таймером watchdog — структурою схеми, що спеціально використовується для моніторингу робочого стану програми мікроконтролера. Основний принцип такий: після запуску таймера watchdog він почне рахувати з 0, якщо програма не очистить його вчасно у визначений часовий проміжок, таймер watchdog скине систему (еквівалентно перезавантаженню комп'ютера), як показано на рисунку нижче (намальовано в 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) Режим вибору: Таймер watchdog має два режими: «режим watchdog» і режим «timer». У режимі таймера він еквівалентний звичайному таймеру, і коли досягається інтервал таймера, він створює переривання (його можна знайти у файлі ioCC2430.h з вектором переривання WDT_VECTOR); У режимі watchdog, коли досягається запланований інтервал, переривання немає, натомість надсилається сигнал скидання. У цьому експерименті він пройшовWDCTL. MODE=0щоб обрати режим вартового воріт. (2) Виберіть запланований інтервал: Як показано на рисунку вище, є чотири періоди годинника на вибір, і для зручності тестування ми обираємо часовий інтервал 1s (тобто порядок).WDCTL.INT=00)。 (3) Відпустити собаку: ПорядокWDCTL.EN=1Щоб запустити таймер Watchdog. (4) Годувати собаку: Як тільки таймер починається, він починає рахувати з 0. Поки його кількість не досягне 32768 (тобто <1s), якщо ми годуємо собаку наступним кодом: 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 та його перерваний сигнал пробудження.
|