• WINCE平台下C#应用程序中使用看门狗


      看门狗定时器(WDT,Watch Dog Timer)是单片机的一个组成部分,它实际上是一个计数器,一般给看门狗一个大数,程序开始运行后看门狗开始倒计数。如果程序运行正常,过一段时间CPU应发出指令让看门狗复位,重新开始倒计数。如果看门狗减到0就认为程序没有正常工作,强制整个系统复位。

     

      看门狗定时器是单片机的一个组成部分,在单片机程序的调试和运行中都有着重要的意义。它的主要功能是在发生软件故障时,通过使器件复位(如果软件未将器件清零)将单片机复位。也可以用于将器件从休眠或空闲模式唤醒,看门狗定时器对微控制器提供了独立的保护系统,当系统出现故障时,在可选的超时周期之后,看门狗将以RESET信号作出响应,像x25045就可选超时周期为1.4秒、600毫秒、200毫秒三种。当你的程序死机时,x25045就会使单片机复位。
     

      近日使用wince平台做C#的开发,由于设备提供商的设备不够稳定,有时会出现在运行过程中设备黑屏、假死的现象,故在程序中加入看门狗功能。当设备假死导致程序停止工作之后,没有及时喂狗,可以通过CPU让设备重启,恢复软件的正常工作状态,从一定程度上防止因为硬件假死导致程序不能正常工作的状态。

     

      以下是基于wince嵌入式开发平台写的一个看门狗测试程序,经测试可以达到预期使用效果,现在共享给需要的人。

     

      要说明的一点是,要使用看门狗的功能,要先调用看门狗的动态库,我在附件的项目中有提供。(FeedDog/bin/Debug/WDogDLL.dll)

      

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    
    namespace FeedDog
    {
        //作者:姚量
        //日期:2016-1-5
        //说明:基于WINCE5.0平台的看门狗测试程序
        //博客:http://www.cnblogs.com/leon719/
        public partial class Form1 : Form
        {
    
            //初始化应用程序看门狗
            [DllImport("WDogDLL.dll")]
            public extern static bool InitWatchdog(uint dwPeriod);
    
            //启动看门狗。注意:初始化看门狗后,启动看门狗才有监控效果
            [DllImport("WDogDLL.dll")]
            public extern static bool StartWatchdog();
    
            //停止看门狗。停止看门狗后,一直没有喂狗,也不重启系统。
            [DllImport("WDogDLL.dll")]
            public extern static bool StopWatchdog();
    
            //喂狗函数。初始化并且启动看门狗后,周期内不喂狗,则重启设备
            [DllImport("WDogDLL.dll")]
            public extern static bool FeedWatchdog();
    
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void btn_init_Click_1(object sender, EventArgs e)
            {
                uint feedPeriod;
                try
                {
                    feedPeriod = Convert.ToUInt32(tb_feedTime.Text.Trim());
                }
                catch
                {
                    feedPeriod = 60000;
                }
                if (InitWatchdog(feedPeriod))
                {
                    AddInfo("初始化看门狗成功!");
                }
                else 
                {
                    AddInfo("初始化看门狗失败!");
                }
            }
    
            private void btn_start_Click_1(object sender, EventArgs e)
            {
                if (StartWatchdog())
                {
                    AddInfo("启动看门狗成功!");
                }
                else 
                {
                    AddInfo("启动看门狗失败!");
                }
            }
    
            private void btn_stop_Click_1(object sender, EventArgs e)
            {
                if (StopWatchdog())
                {
                    AddInfo("停止看门狗成功!");
                }
                else
                {
                    AddInfo("停止看门狗失败!");
                }
            }
    
            private void btn_feed_Click_1(object sender, EventArgs e)
            {
                if (FeedWatchdog())
                {
                    AddInfo("喂狗成功!");
                }
                else
                {
                    AddInfo("喂狗失败!");
                }
            }
    
            private void AddInfo(string msg) 
            {
                lb_feedback.Text = msg;
            }
        }
    }

    附件地址:

    http://pan.baidu.com/s/1o7vDdI6

  • 相关阅读:
    个人作业week7——前端开发感想总结
    C#【结对编程作业】小学数学习题助手
    【个人作业3】必应词典案例分析
    【个人博客作业II】有关代码规范问题的讨论
    【个人博客作业II】代码复审结果
    【补充】第一次个人项目出现的bug
    《构建之法》阅读反馈
    【个人项目总结】C#四则运算表达式生成程序
    软件工程驻足篇章:第十七周和BugPhobia团队漫长的道别
    软件工程反思篇章:第七周和进阶团队项目感想反思
  • 原文地址:https://www.cnblogs.com/leon719/p/5104502.html
Copyright © 2020-2023  润新知