|
1. Свързване на горния и долния етаж Без значение колко добра е операционната система – дали е настоящата Win7 или бъдещите Win8 и Win9 – винаги ще има BlueScreen, да не говорим за малък микроконтролер~ Непредсказуеми причини като електрически шум, прекъсване на захранването, електростатично разреждане и др., могат да причинят ненормална работа на вградената система. Watch Dog, за да бъдем точни, трябва да бъде watchdog таймер – структура на схема, специално използвана за наблюдение на работещото състояние на микроконтролерната програма. Основният принцип е: след стартиране на watchdog таймера, той започва да брои от 0, ако програмата не го изчисти навреме в рамките на определения времеви интервал, watchdog таймерът ще нулира системата (еквивалентно на рестартиране на компютъра), както е показано на фигурата по-долу (нарисувано в Word, рисунката е по-скоро "eggache"~):
Нека въведем един прост метод за прилагане на пазач: Как да пуснете кучето да си тръгне? Как да се храним? Какво ще стане, ако не го храниш? 2. Историята на пазача(1) Въведение в експериментаАко кучето е нахранено, системата работи нормално; Ако не храните кучето, системата продължава да се рестартира. (2) Схема на потока на програмата
(3) Експериментален изходен код и анализ/*
Описание на експеримента: В експеримента с пазачите, ако кучето не бъде нахранено, системата продължава да се рестартира.
*/
#include
#define led1 P1_0
#define led2 P1_1
#define led3 P1_2
#define led4 P1_3
/*系统时钟初始化
-------------------------------------------------------*/
Празнотаxtal_init(Празнота)
{ СЪН &= ~0x04; //都上电
докато(! (СЪН &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; Изберете кристален осцилатор с честота 32MHz СЪН |=0x04;
}
/*LED初始化
-------------------------------------------------------*/
Празнотаled_init(Празнота)
{ P1SEL =0x00; P1 е нормалният I/O порт 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();
Delay(); led1 =0; //点亮led1
докато(1) { FeetDog(); Команда за хранене на кучета (системата не се нулира след включване и малката светлина не мига; Ако е анотиран, системата ще продължи да се нулира и малката светлина ще мига на всеки 1 секунди) }
}
Както се вижда от горния изходен код, методът на работа на Watch Dog е много прост и целият процес включва само нов SFR, а именноWDCTL。Следва конкретно описание на CC2430 в китайския наръчник:
Използването на пазачите може да се обобщи така:Изберете режим → изберете интервал за таймер → поставете кучето → да нахрани кучето (1) Режим на избор: Watchdog таймерът има два режима – "watchdog mode" и "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. ЗаключениеТози раздел описва принципа и употребата на времеви вериги на watchdog. На практика, ако е необходима висока надеждност, пазачът може да се използва в системата. Когато системата спре по някаква причина (вече не може да храни кучето), кучето, което никой не храни, ще лае: "Господарю, има аномалия, има аномалия! ” За безжична сензорна мрежа консумацията на енергия по време на изпълнение е критичен аспект при оценката на производителността. В следващия раздел ще обсъдим съня в системата CC2430 и неговото прекъснато събуждане.
|