|
1. Sammenkobling av øvre og nedre nivåer Uansett hvor godt operativsystemet er, enten det er dagens Win7 eller fremtidige Win8 og Win9, vil det alltid være en BlueScreen, for ikke å snakke om en liten mikrokontroller~ Uforutsigbare årsaker som elektrisk støy, strømbrudd, elektrostatisk utladning osv. kan forårsake unormal drift av det innebygde systemet. Watch Dog, for å være presis, bør være en watchdog-timer, som er en kretsstruktur spesielt brukt for å overvåke kjørestatusen til mikrokontrollerprogrammet. Grunnprinsippet er: etter å ha startet watchdog-timeren, vil den begynne å telle fra 0, hvis programmet ikke klarer å rydde den innen det angitte tidsintervallet, vil watchdog-timeren tilbakestille systemet (tilsvarende å starte datamaskinen på nytt), som vist i figuren under (tegnet i Word, tegningen er mer Eggache~):
La oss introdusere en enkel metode for bruk av vakthund: Hvordan slippe en hund fri? Hvordan mate? Hva skjer hvis du ikke mater den? 2. Historien om vakthunden(1) Introduksjon til eksperimentetHvis hunden blir matet, fungerer systemet normalt; Hvis du ikke mater hunden, starter systemet stadig på nytt. (2) Programflytskjema
(3) Eksperimentell kildekode og analyse/*
Eksperimentbeskrivelse: I vakthund-eksperimentet, hvis hunden ikke får mat, starter systemet stadig på nytt.
*/
#include
#define led1 P1_0
#define led2 P1_1
#define led3 P1_2
#define led4 P1_3
/*系统时钟初始化
-------------------------------------------------------*/
Tomromxtal_init(Tomrom)
{ SOV &= ~0x04; //都上电
mens(! (SØVN &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; Velg en 32 MHz krystalloscillator SØVN |=0x04;
}
/*LED初始化
-------------------------------------------------------*/
Tomromled_init(Tomrom)
{ P1SEL =0x00; P1 er den vanlige I/O-porten P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3-utgang
led1 =1; //关闭所有LED led2 =1; led3 =1; led4 =1;
}
/*看门狗初始化
-------------------------------------------------------*/
Tomromwatchdog_Init(Tomrom)
{ WDCTL =0x00; //看门狗模式,时间间隔一秒 WDCTL |=0x08; //启动看门狗
}
/*喂狗程序
-------------------------------------------------------*/
TomromFeetDog(Tomrom)
{ WDCTL =0xa0; WDCTL =0x50;
}
/*延时函数(小于1秒。读者可以想一下,若大于1秒,会出现什么情况)
-------------------------------------------------------*/
TomromForsinkelse(Tomrom)
{
Usignert 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--);
}
/*主函数
-------------------------------------------------------*/
Tomromhoved(Tomrom)
{ xtal_init(); led_init(); watchdog_Init();
Delay(); led1 =0; //点亮led1
mens(1) { FeetDog(); Hundematingskommando (systemet tilbakestilles ikke etter tilkobling, og det lille lyset blinker ikke; Hvis det er annotert, vil systemet fortsette å tilbakestille, og det lille lyset vil blinke hvert 1. sekund) }
}
Som du kan se fra kildekoden ovenfor, er driftsmetoden til Watch Dog veldig enkel, og hele prosessen involverer kun en ny SFR, nemligWDCTL。Følgende er en spesifikk beskrivelse av CC2430 i den kinesiske manualen:
Bruken av vaktbikkjer kan oppsummeres som:Velg modus → velg tidsintervall → sett hunden → mat hunden (1) Velg modus: Watchdog-timeren har to moduser, nemlig "watchdog-modus" og "timer"-modus. I timer-modus tilsvarer det en vanlig timer, og når timerintervallet nås, vil det produsere et avbrudd (du finner det i ioCC2430.h-filen med en avbruddsvektor på WDT_VECTOR); I vakthundmodus, når et planlagt intervall nås, er det ingen avbrytelse, i stedet sendes et tilbakestillingssignal til systemet. I dette eksperimentet bestod denWDCTL. MODE=0for å velge portvoktermodus. (2) Velg det planlagte intervallet: Som vist i figuren ovenfor, finnes det fire klokkeperioder å velge mellom, og for å teste bekvemmelighet velger vi tidsintervallet 1 sekunder (dvs. rekkefølge).WDCTL.INT=00)。 (3) Slipp hunden fri: RekkefølgeWDCTL.EN=1For å starte vakthund-timeren. (4) Gi hunden mat: Når timeren starter, begynner den å telle fra 0. Før tellingen når 32 768 (dvs. <1s), hvis vi mater hunden med følgende kode: WDCTL =0xa0; WDCTL =0x50;
Deretter vil telleverdien på timeren bli slettet til 0, og deretter vil den begynne å telle fra 0x0000 igjen, noe som hindrer den i å sende et reset-signal, som manifesteres på utviklingskortet: LED1 vil alltid være på og vil ikke blinke; Hvis vi ikke mater hunden (altså kommenterer denne koden), vil et tilbakestillingssignal bli sendt når timertellingen når 32768, og programmet vil starte fra bunnen av, noe som vises på utviklingskortet: LED1 blinker konstant, og blinkintervallet er 1 sekunder. (Merk: Hundefôringsprogrammet må være strengt konsistent med koden ovenfor, og rekkefølgen reversert/feil/skrevet mindre vil ikke spille noen rolle i å fjerne 0.) ) CC2430-tipsTo tilleggsnotater: (1) IVakthundmodusHvis watchdog-timeren er aktivert, er det ugyldig å sette 0 til WDCTL.EN (dvs. denne biten kan ikke fungere som å stoppe timeren); (2) ITimermodus, du kan skrive 1 til WDCTL.CLR[0] for å fjerne timeren; Å skrive 0 til aktiveringsbiten WDCTL.EN vil stoppe timeren, mens å skrive 1 til aktiveringsbiten vil starte timeren på nytt fra 0x0000 på.
(4) Eksperimentelle resultater:Hvis du legger til FeedDog-funksjonen, kjører koden, og oppdager at LED1 alltid er på (systemet tilbakestilles ikke); Hvis du kommenterer FeedDog-funksjonen, kjør koden og finn at LED1 blinker med 1 sekunds intervaller (systemet tilbakestilles hvert 1. sekund). 3. KonklusjonDenne seksjonen beskriver prinsippet og bruken av vakthund-tidskretser. I praktiske anvendelser, dersom høy pålitelighet kreves, kan vakthunden brukes i systemet. Når systemet går ned av en eller annen grunn (det kan ikke mate hunden lenger), vil hunden som ingen mater bjeffe: «Mester, det er en anomali, det er en anomali! ” For et trådløst sensornettverk er strømforbruket under kjøring et kritisk aspekt ved ytelsesevaluering. I neste seksjon skal vi diskutere CC2430 systemdvale og dens avbrutte vekker.
|