|
1. Att koppla ihop de övre och undre nivåerna Oavsett hur bra operativsystemet är, oavsett om det är nuvarande Win7 eller framtida Win8 och Win9, kommer det alltid att finnas en BlueScreen, för att inte tala om en liten mikrokontroller~ Oförutsägbara orsaker som elektriskt brus, strömavbrott, elektrostatisk urladdning etc., kan orsaka onormal funktion av det inbyggda systemet. Watch Dog, för att vara exakt, bör vara en watchdog-timer, vilket är en kretsstruktur som särskilt används för att övervaka mikrokontrollerprogrammets körstatus. Grundprincipen är: efter att watchdog-timern startats börjar den räkna från 0, om programmet inte rensar den inom angiven tidsintervall, kommer watchdog-timern att återställa systemet (motsvarande att starta om datorn), som visas i figuren nedan (ritad i ord, teckningen är mer äggpinna~):
Låt oss introducera en enkel metod för applicering av vakthund: Hur släpper man en hund? Hur matar man? Vad händer om du inte matar den? 2. Berättelsen om vakthunden(1) Introduktion till experimentetOm hunden matas fungerar systemet normalt; Om du inte matar hunden startar systemet om och om igen. (2) Programflödesschema
(3) Experimentell källkod och analys/*
Experimentbeskrivning: I vakthundsexperimentet, om hunden inte matas, fortsätter systemet att starta om.
*/
#include
#define led1 P1_0
#define led2 P1_1
#define led3 P1_2
#define led4 P1_3
/*系统时钟初始化
-------------------------------------------------------*/
tomrumxtal_init(tomrum)
{ SOV &= ~0x04; //都上电
medan(! (SÖMN &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; Välj en 32MHz kristalloscillator SÖMN |=0x04;
}
/*LED初始化
-------------------------------------------------------*/
tomrumled_init(tomrum)
{ P1SEL =0x00; P1 är den normala I/O-porten P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3-utgång
led1 =1; //关闭所有LED led2 =1; led3 =1; led4 =1;
}
/*看门狗初始化
-------------------------------------------------------*/
tomrumwatchdog_Init(tomrum)
{ WDCTL =0x00; //看门狗模式,时间间隔一秒 WDCTL |=0x08; //启动看门狗
}
/*喂狗程序
-------------------------------------------------------*/
tomrumFeetDog(tomrum)
{ WDCTL =0xa0; WDCTL =0x50;
}
/*延时函数(小于1秒。读者可以想一下,若大于1秒,会出现什么情况)
-------------------------------------------------------*/
tomrumFördröjning(tomrum)
{
osignerad intn;
för(n=50000; n>0; n--);
för(n=50000; n>0; n--);
för(n=50000; n>0; n--);
för(n=50000; n>0; n--);
för(n=50000; n>0; n--);
för(n=50000; n>0; n--);
för(n=50000; n>0; n--);
}
/*主函数
-------------------------------------------------------*/
tomrumhuvud(tomrum)
{ xtal_init(); led_init(); watchdog_Init();
Delay(); led1 =0; //点亮led1
medan(1) { FeetDog(); Hundmatkommando (systemet återställs inte efter anslutning, och den lilla lampan blinkar inte; Om det är annoterat kommer systemet fortsätta att återställas, och det lilla ljuset blinkar var etta. sekund) }
}
Som du kan se från källkoden ovan är Watch Dogs arbetsmetod mycket enkel, och hela processen involverar endast en ny SFR, nämligenWDCTL。Följande är en specifik beskrivning av CC2430 i den kinesiska manualen:
Användningen av vakthundar kan sammanfattas som:Välj läge → välj timerintervall → sätt hunden → mata hunden (1) Välj läge: Watchdog-timern har två lägen, nämligen "watchdog-läge" och "timer"-läge. I timer-läge motsvarar det en vanlig timer, och när timerintervallet nås producerar det ett avbrott (du kan hitta det i ioCC2430.h-filen med en avbrottsvektor på WDT_VECTOR); I watchdog-läge, när ett schemalagt intervall uppnås, sker ingen avbrott, istället skickas en återställningssignal till systemet. I detta experiment klarade denWDCTL. MODE=0för att välja Gatekeeper-läget. (2) Välj det schemalagda intervallet: Som visas i figuren ovan finns det fyra klockperioder att välja mellan, och för att underlätta testningen väljer vi tidsintervallet 1 sekunder (dvs. ordning).WDCTL.INT=00)。 (3) Släpp hunden: OrdningWDCTL.EN=1för att starta vakthundstimern. (4) Mata hunden: När timern startar börjar den räkna från 0. Innan dess räkning når 32 768 (dvs. <1s), om vi matar hunden med följande kod: WDCTL =0xa0; WDCTL =0x50;
Sedan raderas räknevärdet på timern till 0, och sedan börjar den räkna från 0x0000 igen, vilket förhindrar att den skickar en återställningssignal, som manifesteras på utvecklingskortet: LED1 är alltid på och blinkar inte; Om vi inte matar hunden (dvs. kommenterar denna kod), så när timern når 32768 kommer en återställningssignal att skickas och programmet körs från grunden, vilket manifesteras på utvecklingskortet: LED1 blinkar konstant och blinkningsintervallet är 1 sekunder. (Observera: Hundmatningsprogrammet måste vara strikt konsekvent med ovanstående kod, och ordningen om det är omvänt/fel/skrivet mindre spelar ingen roll för att rensa 0.) ) CC2430-tipsTvå ytterligare anteckningar: (1) IVakthundslägeOm watchdog-timern är aktiverad är inställningen 0 till WDCTL.EN ogiltig (dvs. denna bit kan inte spela rollen att stoppa timern); (2) ITimerläge, du kan skriva 1 till WDCTL.CLR[0] för att rensa timern; Att skriva 0 till aktiveringsbiten WDCTL.EN stoppar timern, medan att skriva 1 till aktiveringsbiten startar timern om från 0x0000 och framåt.
(4) Experimentella resultat:Om du lägger till FeedDog-funktionen, kör koden och upptäcker att LED1 alltid är på (systemet återställs inte); Om du kommenterar FeedDog-funktionen, kör koden och upptäck att LED1 blinkar med 1 sekunds intervall (systemet återställs var 1 sekund). 3. SlutsatsDetta avsnitt beskriver principen och användningen av watchdog-tidtagningskretsar. I praktiska tillämpningar, om hög tillförlitlighet krävs, kan vakthunden användas i systemet. När systemet av någon anledning går ner (det kan inte mata hunden längre), kommer hunden som ingen matar att skälla: "Mästare, det finns en anomali, det finns en anomali! ” För ett trådlöst sensornätverk är dess strömförbrukning under körning en kritisk aspekt av prestandautvärdering. I nästa avsnitt kommer vi att diskutera CC2430-systemets viloläge och dess avbrutna väckningssamtal.
|