|
1. A felső és alsó szintek összekapcsolása Bármilyen jó is legyen az operációs rendszer, legyen az a jelenlegi Win7, akár a jövőbeli Win8 és Win9, mindig lesz BlueScreen, nem beszélve egy kis mikrokontrollerről~ Kiszámíthatatlan okok, mint az elektromos zaj, áramszünet, elektrosztatikus kisülés stb., okozhatják a beépített rendszer rendellenes működését. Pontosabban a Watch Dognak egy watchdog időzítőnek kell lennie, ami egy áramköri szerkezet, amelyet kifejezetten a mikrovezérlő program futási állapotának figyelésére használnak. Az alapelv az, hogy a watchdog időzítő elindítása után 0-ról számolni kezd, ha a program nem tisztítja meg időben a megadott időközön, a watchdog időzítő visszaállítja a rendszert (ami a számítógép újraindításának felel meg), ahogy az alábbi ábrán is látható (word-ben rajzolva, a rajz inkább eggache~):
Mutassunk be egy egyszerű őrkutya alkalmazási módszert: Hogyan engedjük el egy kutyát? Hogyan lehet etetni? Mi történik, ha nem eteted? 2. A felügyeleti kutya története(1) Bevezetés a kísérlethezHa a kutyát etetik, a rendszer normálisan működik; Ha nem eteted a kutyát, a rendszer újra és újra elindul. (2) Programáram
(3) Kísérleti forráskód és elemzés/*
Kísérlet leírása: A felügyeleti kísérletben, ha a kutyát nem etetik, a rendszer újra elindul.
*/
#include
#define lead1 P1_0
#define led2 P1_1
#define lead3 P1_2
#define lead4 P1_3
/*系统时钟初始化
-------------------------------------------------------*/
Semmixtal_init(Semmi)
{ ALVÁS &= ~0x04; //都上电
miközben(! (ALVÁS &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; Válassz egy 32 MHz-es kristályoscillátort ALVÁS |=0x04;
}
/*LED初始化
-------------------------------------------------------*/
Semmiled_init(Semmi)
{ P1SEL =0x00; A P1 a normál I/O port P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3 kimenet
led1 =1; //关闭所有LED led2 =1; led3 =1; led4 =1;
}
/*看门狗初始化
-------------------------------------------------------*/
Semmiwatchdog_Init(Semmi)
{ WDCTL =0x00; //看门狗模式,时间间隔一秒 WDCTL |=0x08; //启动看门狗
}
/*喂狗程序
-------------------------------------------------------*/
SemmiFeetDog(Semmi)
{ WDCTL =0xa0; WDCTL =0x50;
}
/*延时函数(小于1秒。读者可以想一下,若大于1秒,会出现什么情况)
-------------------------------------------------------*/
SemmiKésés(Semmi)
{
Aláírás nélkül 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--);
}
/*主函数
-------------------------------------------------------*/
Semmimain(Semmi)
{ xtal_init(); led_init(); watchdog_Init();
Delay(); led1 =0; //点亮led1
miközben(1) { FeetDog(); Kutyaetetési parancs (a rendszer nem áll vissza csatlakozás után, és a kis lámpa sem villog; Ha annotálják, a rendszer tovább regenerálódik, és a kis lámpa minden 1 másodpercben villog) }
}
Ahogy a fenti forráskódból is látható, a Watch Dog működési módja nagyon egyszerű, és az egész folyamat csak egy új SFR-t foglal magában, nevezetesenWDCTL。Az alábbiakban a CC2430 konkrét leírása található a kínai kézikönyvben:
A watchdogs használata a következőképpen összefoglalható:Válaszd meg a módot → válaszd ki az időzítő intervallumot, → tedd a kutyát → etetni a kutyát (1) Mód kiválasztása: A watchdog időzítőnek két módja van: "watchdog mód" és "timer" mód. Időzítő módban ez egyenértékű egy normál időzítővel, és amikor elérjük az időzítő intervallumát, megszakítást generál (megtalálhatod az ioCC2430.h fájlban, amelynek megszakítási vektora WDT_VECTOR); Figyelő módban, amikor egy ütemezett időköz ér el, nincs megszakítás, helyette egy reset jelet küldenek a rendszernek. Ebben a kísérletben átmentWDCTL. MODE=0hogy kiválassza a kapuőr módot. (2) Válaszd ki az ütemezett intervallumot: Ahogy a fenti ábrán látható, négy óraidőszak közül választhatunk, és a tesztelés érdekében az 1s időintervallumat (azaz sorrendet) választjuk.WDCTL.INT=00)。 (3) Engedd el a kutyát: RendWDCTL.EN=1hogy elindítsuk a watchdog időzítőt. (4) Etetni a kutyát: Amint elindul az időzítő, elkezd 0-tól számolni. Mielőtt a száma elérné a 32768-at (azaz <1-eseket), ha a kutyát a következő kóddal etetjük: WDCTL =0xa0; WDCTL =0x50;
Ezután az időzítő számlálási értéke 0-ra kerül, majd újra elkezd számolni 0x0000-ről, ami megakadályozza, hogy visszaállító jelet küldjön, ami megjelenik a fejlesztő táblán: a LED1 mindig be van kapcsolva, és nem villog; Ha nem etetjük a kutyát (azaz nem kommenteljük ezt a kódot), akkor amikor az időzítő száma eléri a 32768-at, egy reset jel indul, és a program a nulláról indul, ami megjelenik a fejlesztő panelen: a LED1 folyamatosan villog, és a villogási intervallum 1s. (Megjegyzés: A kutyaetetési programnak szigorúan összhangban kell lennie a fenti kódextel, és a megfordított/rossz/írt sorrend kevesebb nem játszik szerepet a 0 törlésében.) ) CC2430 tippekKét további megjegyzés: (1) A következőkbenFigyelő kutya módHa a watchdog időzítő be van kapcsolva, a 0 beállítása WDCTL.EN-re érvénytelen (azaz ez a bit nem játszhat a megállító szerepében); (2) A következőkbenIdőzítő mód, írhatsz 1-et a WDCTL.CLR[0] címre, hogy töröld az időzítőt; Ha 0-t írunk az engedélyező bitbe, a WDCTL.EN megállítja az időzítőt, míg az 1-et az engedélyezett bithez írva az időzítő újraindítja az időzítőt 0x0000-től.
(4) Kísérleti eredmények:Ha hozzáadod a FeedDog funkciót, futtatod a kódot, és látod, hogy a LED1 mindig be van kapcsolva (a rendszer nem áll vissza); Ha kiírod a FeedDog funkciót, futtatd a kódot, és látod, hogy a LED1 1s intervallidőben villog (a rendszer minden 1 másodpercenként visszaáll). 3. KövetkeztetésEz a rész bemutatja a felügyeleti időzítő áramkörök elvét és használatát. Gyakorlati alkalmazásokban, ha nagy megbízhatóságra van szükség, a watchdog használható a rendszerben. Amikor valamiért a rendszer leáll (már nem tudja etetni a kutyát), az a kutya, akit senki sem etet, ugatni fog: "Mester, van egy anomália, van egy anomália! ” Egy vezeték nélküli szenzorhálózat esetén a futási idejű energiafogyasztás kritikus tényező a teljesítményértékelésnek. A következő részben a CC2430 rendszer alvásáról és annak megszakított ébresztőhívásáról beszélünk.
|