|
1. Reliant les niveaux supérieur et inférieur Peu importe la qualité du système d’exploitation, qu’il s’agisse du Win7 actuel ou des futurs Win8 et Win9, il y aura toujours un BlueScreen, sans parler d’un petit microcontrôleur~ Des raisons imprévisibles telles que le bruit électrique, une panne de courant, une décharge électrostatique, etc., peuvent entraîner un fonctionnement anormal du système embarqué. Le Watch Dog, pour être précis, devrait être un minuteur de surveillance, c’est-à-dire une structure de circuit spécialement utilisée pour surveiller l’état d’exécution du programme microcontrôleur. Le principe de base est le suivant : après avoir lancé le minuteur watchdog, il commence à compter à partir de 0, si le programme ne le réinitialise pas dans le temps spécifié, le timer watchdog réinitialise le système (équivalent au redémarrage de l’ordinateur), comme montré dans la figure ci-dessous (dessiné dans Word, le dessin est plus mal d’œuf~) :
Présentons une méthode simple d’application pour le chien de garde : comment laisser partir un chien ? Comment se nourrir ? Que se passera-t-il si vous ne le nourrissez pas ? 2. L’histoire du chien de garde(1) Introduction à l’expérienceSi le chien est nourri, le système fonctionne normalement ; Si vous ne nourrissez pas le chien, le système redémarre sans cesse. (2) Organigramme de programme
(3) Code source expérimental et analyse/*
Description de l’expérience : Dans l’expérience de chien de garde, si le chien n’est pas nourri, le système redémarre sans cesse.
*/
#include
#define menait P1_0
#define P1_1
#define a mené 3 P1_2
#define P1_3 mené
/*系统时钟初始化
-------------------------------------------------------*/
vidextal_init(vide)
{ SOMMEIL &= ~0x04; //都上电
tandis que(! (SOMMEIL &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; Choisissez un oscillateur à cristal de 32 MHz SOMMEIL |=0x04;
}
/*LED初始化
-------------------------------------------------------*/
videled_init(vide)
{ P1SEL =0x00; P1 est le port d’E/S normal P1DIR |=0x0F; Sortie P1.0 P1.1 P1.2 P1.3
mené1 =1; //关闭所有LED mené2 =1; mené3 =1; mené4 =1;
}
/*看门狗初始化
-------------------------------------------------------*/
videwatchdog_Init(vide)
{ WDCTL =0x00; //看门狗模式,时间间隔一秒 WDCTL |=0x08; //启动看门狗
}
/*喂狗程序
-------------------------------------------------------*/
videFeetDog(vide)
{ WDCTL =0xa0; WDCTL =0x50;
}
/*延时函数(小于1秒。读者可以想一下,若大于1秒,会出现什么情况)
-------------------------------------------------------*/
videDélai (vide)
{
non signé intn;
pour(n=50000; n>0; n--);
pour(n=50000; n>0; n--);
pour(n=50000; n>0; n--);
pour(n=50000; n>0; n--);
pour(n=50000; n>0; n--);
pour(n=50000; n>0; n--);
pour(n=50000; n>0; n--);
}
/*主函数
-------------------------------------------------------*/
videmain(vide)
{ xtal_init() ; led_init() ; watchdog_Init() ;
Delay() ; mené1 =0; //点亮led1
tandis que(1) { FeetDog() ; Commande d’alimentation du chien (le système ne se réinitialise pas après l’assemblage, et la petite lumière ne clignote pas ; Si elle est annotée, le système continue de se réinitialiser, et la petite lumière clignote toutes les 1 secondes) }
}
Comme vous pouvez le voir dans le code source ci-dessus, la méthode de fonctionnement de Watch Dog est très simple, et tout le processus ne concerne qu’un nouveau SFR, à savoirWDCTL。Voici une description spécifique de CC2430 dans le manuel chinois :
L’utilisation des chiens de garde peut se résumer ainsi :Sélectionnez le mode → sélectionnez l’intervalle de minuterie → mettez le chien → le nourrir (1) Mode de sélection : Le minuteur watchdog propose deux modes, à savoir « mode watchdog » et mode « minuteur ». En mode minuteur, il est équivalent à un minuteur normal, et lorsque l’intervalle de minuterie est atteint, il produit une interruption (vous pouvez la trouver dans le fichier ioCC2430.h avec un vecteur d’interruption de WDT_VECTOR) ; En mode watchdog, lorsqu’un intervalle programmé est atteint, il n’y a pas d’interruption, un signal de réinitialisation est envoyé au système. Dans cette expérience, elle a été adoptéeWDCTL. MODE=0pour sélectionner le mode gardien. (2) Sélectionner l’intervalle programmé : Comme montré dans la figure ci-dessus, il y a quatre périodes d’horloge parmi lesquelles choisir, et pour faciliter le test, nous choisissons l’intervalle de temps de 1 s (c’est-à-dire l’ordre).WDCTL.INT=00)。 (3) Relâcher le chien : CommandeWDCTL.EN=1pour lancer le minuteur de garde. (4) Nourrissez le chien : Une fois le minuteur lancé, il commence à compter à partir de zéro. Avant que son décompte n’atteigne 32 768 (c’est-à-dire < 1), si nous nourrissons le chien avec le code suivant : WDCTL =0xa0; WDCTL =0x50;
Ensuite, la valeur de comptage du minuteur sera effacée à 0, puis il recommencera à compter à partir de 0x0000, ce qui empêche l’envoi d’un signal de réinitialisation, qui se manifeste sur la carte de développement : LED1 sera toujours allumée et ne clignotera pas ; Si nous ne nourrissons pas le chien (c’est-à-dire commentez ce code), alors lorsque le compte de minuterie atteint 32768, un signal de réinitialisation sera émis, et le programme fonctionnera de zéro, ce qui se manifeste sur la carte de développement : LED1 clignote constamment, et l’intervalle de cligneaux est de 1 seconde. (Note : Le programme d’alimentation du chien doit être strictement cohérent avec le code ci-dessus, et l’ordre inversé/erroné/écrit moins ne jouera pas de rôle dans la résolution de 0.) ) Conseils CC2430Deux notes supplémentaires : (1) DansMode chien de surveillanceSi le minuteur watchdog a été activé, le réglage de 0 sur WDCTL.EN est invalide (c’est-à-dire que ce bit ne peut pas jouer le rôle d’arrêt du minuteur) ; (2) DansMode minuterie, vous pouvez écrire 1 sur WDCTL.CLR[0] pour effacer le minuteur ; Écrire 0 sur le bit d’activation WDCTL.EN arrête le minuteur, tandis qu’écrire 1 sur le bit d’activation redémarre le minuteur à partir de 0x0000.
(4) Résultats expérimentaux :Si vous ajoutez la fonction FeedDog, exécutez le code et constatez que LED1 est toujours allumé (le système ne se réinitialise pas) ; Si vous commentez la fonction FeedDog, exécutez le code et constatez que LED1 clignote tous les intervalles de 1 seconde (le système se réinitialise tous les 1 seconde). 3. ConclusionCette section décrit le principe et l’utilisation des circuits de chronométrage de surveillance. Dans des applications pratiques, si une grande fiabilité est requise, le watchdog peut être utilisé dans le système. Quand le système tombe en panne pour une raison quelconque (il ne peut plus nourrir le chien), le chien que personne ne nourrit aboie : « Maître, il y a une anomalie, il y a une anomalie ! ” Pour un réseau de capteurs sans fil, sa consommation d’énergie en temps d’exécution est un aspect critique de l’évaluation des performances. Dans la section suivante, nous aborderons le sommeil du système CC2430 et son réveil interrompu.
|