|
1. Forbindelse mellem øvre og nedre niveauer Uanset hvor godt operativsystemet er, uanset om det er det nuværende Win7 eller det fremtidige Win8 og Win9, vil der altid være en BlueScreen, for ikke at nævne en lille mikrocontroller~ Uforudsigelige årsager som elektrisk støj, strømsvigt, elektrostatisk udladning osv. kan forårsage unormal drift af det indlejrede system. Watch Dog, for at være præcis, bør være en watchdog-timer, som er en kredsløbsstruktur, der er specielt brugt til at overvåge kørselsstatus for mikrocontrollerprogrammet. Det grundlæggende princip er: efter at watchdog-timeren er startet, vil den begynde at tælle fra 0, og hvis programmet ikke klarer den inden for det angivne tidsinterval, vil watchdog-timeren nulstille systemet (svarende til at genstarte computeren), som vist i figuren nedenfor (tegnet i Word, tegningen er mere Edache~):
Lad os introducere en simpel metode til anvendelse af vagthund: Hvordan slipper man en hund fri? Hvordan fodrer man? Hvad sker der, hvis du ikke fodrer den? 2. Historien om vagthunden(1) Introduktion til eksperimentetHvis hunden bliver fodret, kører systemet normalt; Hvis du ikke fodrer hunden, bliver systemet ved med at genstarte. (2) Programflowdiagram
(3) Eksperimentel kildekode og analyse/*
Eksperimentbeskrivelse: I vagthundseksperimentet, hvis hunden ikke bliver fodret, starter systemet hele tiden forfra.
*/
#include
#define led1 P1_0
#define led2 P1_1
#define led3 P1_2
#define led4 P1_3
/*系统时钟初始化
-------------------------------------------------------*/
tomrumxtal_init(tomrum)
{ SOV &= ~0x04; //都上电
mens(! (SØVN &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; Vælg en 32MHz krystaloscillator SØVN |=0x04;
}
/*LED初始化
-------------------------------------------------------*/
tomrumled_init(tomrum)
{ P1SEL =0x00; P1 er den normale I/O-port P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3 output
led1 =1; //关闭所有LED led2 =1; led3 =1; led4 =1;
}
/*看门狗初始化
-------------------------------------------------------*/
tomrumwatchdog_Init(tomrum)
{ WDCTL =0x00; //看门狗模式,时间间隔一秒 WDCTL |=0x08; //启动看门狗
}
/*喂狗程序
-------------------------------------------------------*/
tomrumFeetDog(tomrum)
{ WDCTL =0xa0; WDCTL =0x50;
}
/*延时函数(小于1秒。读者可以想一下,若大于1秒,会出现什么情况)
-------------------------------------------------------*/
tomrumForsinkelse(tomrum)
{
Usigneret intn;
for(n=50000; n>0; n--);
for(n=50000; n>0; n--);
for(n=50000; n>0; n--);
for(n=50000; n>0; n--);
for(n=50000; n>0; n--);
for(n=50000; n>0; n--);
for(n=50000; n>0; n--);
}
/*主函数
-------------------------------------------------------*/
tomrumhoved(tomrum)
{ xtal_init(); led_init(); watchdog_Init();
Delay(); led1 =0; //点亮led1
mens(1) { FeetDog(); Hundefodringskommando (systemet nulstilles ikke efter tilslutning, og det lille lys blinker ikke; Hvis det annoteres, vil systemet fortsætte med at nulstille, og det lille lys vil blinke hvert 1. sekund) }
}
Som du kan se fra kildekoden ovenfor, er driftsmetoden i Watch Dog meget enkel, og hele processen involverer kun en ny SFR, nemligWDCTL。Følgende er en specifik beskrivelse af CC2430 i den kinesiske manual:
Brugen af vagthunde kan opsummeres som:Vælg tilstand → vælg timerinterval → sæt hunden → fodr hunden (1) Vælg tilstand: Watchdog-timeren har to tilstande, nemlig "watchdog-tilstand" og "timer"-tilstand. I timer-tilstand svarer det til en normal timer, og når timerintervallet nås, vil det producere et interrupt (du kan finde det i ioCC2430.h-filen med en interruptvektor på WDT_VECTOR); I watchdog-tilstand, når et planlagt interval nås, er der ingen afbrydelse, i stedet sendes et nulstillingssignal til systemet. I dette eksperiment bestod denWDCTL. MODE=0for at vælge gatekeeper-tilstanden. (2) Vælg det planlagte interval: Som vist i figuren ovenfor er der fire urperioder at vælge imellem, og for testbekvemmelighed vælger vi tidsintervallet 1 sekunder (dvs. rækkefølge).WDCTL.INT=00)。 (3) Slip hunden fri: OrdenWDCTL.EN=1For at starte watchdog-timeren. (4) Fodr hunden: Når timeren starter, begynder den at tælle fra 0. Før dens optælling når 32.768 (dvs. <1s), hvis vi fodrer hunden med følgende kode: WDCTL =0xa0; WDCTL =0x50;
Derefter vil tælleværdien for timeren blive slettet til 0, og så vil den begynde at tælle fra 0x0000 igen, hvilket forhindrer den i at sende et reset-signal, som manifesteres på udviklingskortet: LED1 vil altid være tændt og vil ikke blinke; Hvis vi ikke fodrer hunden (dvs. kommenterer denne kode), så når timertællingen når 32768, vil et nulstillingssignal blive udsendt, og programmet vil køre fra bunden, hvilket vises på udviklingskortet: LED1 blinker konstant, og blinkeintervallet er 1 sekunder. (Bemærk: Hundefodringsprogrammet skal være strengt konsistent med ovenstående kode, og rækkefølgen om det er omvendt/forkert/skrevet mindre spiller ikke en rolle i at rydde 0.) ) CC2430 TipsTo yderligere bemærkninger: (1) IVagthundstilstandHvis watchdog-timeren er aktiveret, er indstilling 0 til WDCTL.EN ugyldig (dvs. denne bit kan ikke fungere som at stoppe timeren); (2) ITimer-tilstand, du kan skrive 1 til WDCTL.CLR[0] for at rydde timeren; Hvis man skriver 0 til aktiveringsbiten WDCTL.EN, stopper man timeren, mens man skriver 1 til aktiveringsbit, genstarter timeren fra 0x0000 og frem.
(4) Eksperimentelle resultater:Hvis du tilføjer FeedDog-funktionen, kører koden og finder ud af, at LED1 altid er tændt (systemet nulstiller ikke); Hvis du kommenterer FeedDog-funktionen, kører koden og finder ud af, at LED1 blinker med 1s intervaller (systemet nulstiller hver 1s). 3. KonklusionDette afsnit beskriver princippet og brugen af watchdog-tidskredsløb. I praktiske anvendelser, hvis høj pålidelighed er nødvendig, kan vagthunden anvendes i systemet. Når systemet går ned af en eller anden grund (det kan ikke længere fodre hunden), vil hunden, som ingen fodrer, gø: "Mester, der er en anomali, der er en anomali! ” For et trådløst sensornetværk er dets strømforbrug under kørsel et kritisk aspekt af ydelsesevalueringen. I næste afsnit vil vi diskutere CC2430-systemsøvn og dens afbrudte vækningskald.
|