|
1. Üst ve alt katların birbirine bağlanması İşletim sistemi ne kadar iyi olursa olsun, mevcut Win7 ya da gelecekteki Win8 ve Win9 olsun, her zaman bir BlueScreen ve küçük bir mikrodenetleyici olur bile~ Elektrik gürültüsü, elektrik kesintisi, elektrostatik deşarj gibi öngörülemez nedenler gömülü sistemin anormal çalışmasına neden olabilir. Tam olarak Watch Dog, mikrodenetleyici programının çalışma durumunu izlemek için özel olarak kullanılan bir devre yapısı olan bir watchdog zamanlayıcısı olmalıdır. Temel prensip şudur: Watchdog zamanlayıcı başlatıldıktan sonra 0'dan saymaya başlar, eğer program belirlenen zaman aralığında zamanlayıcıyı zamanında temizlemezse, watchdog zamanlayıcı sistemi sıfırlayacak (bilgisayarı yeniden başlatmaya eşdeğer), aşağıdaki şekilde gösterildiği gibi (word ile çizilmiş, çizim daha fazla yumurta ağrısı~):
Basit bir bekçi köpeği uygulama yöntemini tanıtalım: Bir köpeği nasıl bırakılır? Nasıl beslenir? Beslemezseniz ne olur? 2. Gözetmen Köpeğinin Hikayesi(1) Deneye girişKöpek beslenirse, sistem normal çalışıyordur; Köpeği beslemezseniz, sistem sürekli yeniden başlıyor. (2) Program akış şeması
(3) Deneysel kaynak kodu ve analiz/*
Deney açıklaması: Gözetmen köpeği deneyinde, köpek beslenmezse sistem sürekli yeniden başlatılır.
*/
#include
#define lead1 P1_0
#define led2 P1_1
#define led3 P1_2
#define led4 P1_3
/*系统时钟初始化
-------------------------------------------------------*/
Voidxtal_init(Void)
{ UYKU &= ~0x04; //都上电
while(! (UYKU &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; 32MHz kristal osilatör seçin UYKU |=0x04;
}
/*LED初始化
-------------------------------------------------------*/
Voidled_init(Void)
{ P1SEL =0x00; P1 normal I/O portudur P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3 çıkışı
led1 =1; //关闭所有LED led2 =1; led3 =1; led4 =1;
}
/*看门狗初始化
-------------------------------------------------------*/
Voidwatchdog_Init(Void)
{ WDCTL =0x00; //看门狗模式,时间间隔一秒 WDCTL |=0x08; //启动看门狗
}
/*喂狗程序
-------------------------------------------------------*/
VoidFeetDog(Void)
{ WDCTL =0xa0; WDCTL =0x50;
}
/*延时函数(小于1秒。读者可以想一下,若大于1秒,会出现什么情况)
-------------------------------------------------------*/
VoidGecikme(Void)
{
imzasız intn;
için(n=50000; n>0; n--);
için(n=50000; n>0; n--);
için(n=50000; n>0; n--);
için(n=50000; n>0; n--);
için(n=50000; n>0; n--);
için(n=50000; n>0; n--);
için(n=50000; n>0; n--);
}
/*主函数
-------------------------------------------------------*/
Voidmain(Void)
{ xtal_init(); led_init(); watchdog_Init();
Delay(); led1 =0; //点亮led1
while(1) { FeetDog(); Köpek besleme komutu (sistem katıldıktan sonra sıfırlanmaz ve küçük ışık yanıp sönmez; Eğer notlanırsa, sistem sıfırlanmaya devam eder ve küçük ışık her 1 saniyede bir yanıp sönür) }
}
Yukarıdaki kaynak kodundan da görebileceğiniz gibi, Watch Dog'un çalışma yöntemi çok basittir ve tüm süreç sadece yeni bir SFR içerir, yaniWDCTL。Aşağıda Çin el kitabında CC2430'un özel bir tanımı yer almaktadır:
Gözcü köpeklerinin kullanımı şöyle özetlenebilir:Modu seç → zamanlayıcı aralığını seç → köpeği → köpeği besle (1) Modu seçme: Watchdog zamanlayıcısının iki modu vardır: "watchdog modu" ve "zamanlayıcı" modu. Zamanlayıcı modunda, normal bir zamanlayıcıya eşdeğerdir ve zamanlayıcı aralığına ulaşıldığında bir kesme üretir (bunu ioCC2430.h dosyasında WDT_VECTOR kesme vektörüyle bulabilirsiniz); Watchdog modunda, planlanmış bir aralık geçildiğinde kesinti olmaz, sisteme reset sinyali gönderilir. Bu deneyde geçtiWDCTL. MODE=0Gatekeeper modunu seçmek için. (2) Planlanan aralığı seçin: Yukarıdaki şekilde gösterildiği gibi, seçilebilecek dört saat periyodu vardır ve test kolaylığı için 1s zaman aralığı (yani sıra) seçilir.WDCTL.INT=00)。 (3) Köpeği serbest bırakın: DüzenWDCTL.EN=1Watchdog zamanlayıcısını başlatmak için. (4) Köpeği besleyin: Zamanlayıcı başladığında, 0'dan itibaren saymaya başlar. Sayısı 32768'e (yani <1s) ulaşmadan önce, köpeği aşağıdaki kodla beslersek: WDCTL =0xa0; WDCTL =0x50;
Sonra zamanlayıcının sayım değeri 0'a temizlenir ve tekrar 0x0000'den saymaya başlar, bu da geliştirme kartında kendini gösteren sıfırlama sinyali göndermesini engeller: LED1 her zaman açık olur ve yanıp sönmez; Köpeği beslemezsek (yani bu kodu yorumlamazsak), zamanlayıcı sayısı 32768'e ulaştığında sıfırlama sinyali verilecek ve program sıfırdan çalışacak, bu da geliştirme kartında kendini gösteriyor: LED1 sürekli yanıp sönüyor ve yanıp sönme aralığı 1s. (Not: Köpek besleme programı yukarıdaki kurala tamamen tutarlı olmalı ve sıra tersine/yanlış/yazılmış daha az 0'ı temizlemede rol oynamaz.) ) CC2430 İpuçlarıİki ek not: (1) İçindeGözcük köpeği moduEğer watchdog zamanlayıcı etkinleştirildiyse, 0'ı WDCTL.EN'e ayarlamak geçersizdir (yani, bu bit zamanlayıcıyı durdurma rolünü oynayamaz); (2) İçindeZamanlayıcı modu, zamanlayıcıyı temizlemek için WDCTL.CLR[0] adresine 1 yazabilirsiniz; 0 yazmak etkinleştir bitine WDCTL.EN zamanlayıcıyı durdururken, 1 yazmak etkinleştir bitine zamanlayıcıyı yeniden başlatır, 1 yazmak ise zamanlayıcıyı 0x0000'den itibaren yeniden başlatır.
(4) Deneysel sonuçlar:FeedDog fonksiyonunu eklerseniz, kodu çalıştırın ve LED1'in her zaman açık olduğunu görürsünüz (sistem sıfırlanmıyor); FeedDog fonksiyonunu yorumlarsanız, kodu çalıştırın ve LED1'in 1 saniye aralıklarla yanıp söndüğünü gör (sistem her 1 saniyede bir sıfırlanır). 3. SonuçBu bölüm, watchdog zamanlama devrelerinin prensibi ve kullanımını açıklar. Pratik uygulamalarda, yüksek güvenilirlik gerekirse, sistemde watchdog kullanılabilir. Sistem bir sebepten çöktüğünde (köpeği artık besleyemiyor), kimsenin beslemediği köpek havlayacak: "Efendim, bir anomali var, bir anomali var! ” Kablosuz bir sensör ağı için, çalışma zamanı güç tüketimi performans değerlendirmesinde kritik bir unsurdur. Bir sonraki bölümde, CC2430 sisteminin uykusu ve kesintiye uğrayan uyandırma çağrısını tartışacağız.
|