【日拱一卒,脚踏实地】快速理解-看门狗(Watchdog)机制

1 如何定义看门狗

看门狗,英文名称为Watch Dog Timer,是设计者为了防止CPU死机而设计的一种定时器模块。有了它的存在,机器一般就不会死机了。

2 怎么使用看门狗

看门狗本质是一种定时器,但与一般定时器达到计时时间触发中断不同,看门狗会触发CPU的复位,也就是机器的重启。

下面,以一个简单的流水灯小程序,来说明如何使用看门狗。

While (1)
{
LED1=1;LED2=0;LED3=0;LED4=0;
Delay (10ms);
LED1=0;LED2=1;LED3=0;LED4=0;
Delay (10ms);
LED1=0;LED2=0;LED3=1;LED4=0;
Delay (10ms);
LED1=0;LED2=0;LED3=0;LED4=1;
Delay (10ms);
}

上述程序表示每隔10ms,依次轮流点亮4个LED灯。
由于程序是在while死循环里,所以会一直重复上面这个过程。

接下来,我们给它加入看门狗,程序变成下面这样:

WDT time =50ms; //设置看门狗的定时时间为50ms
WDT =1;				  //看启看门狗
While (1)
{
Clear WDT(); 		  //喂狗,给看门狗清零
LED1=1;LED2=0;LED3=0;LED4=0;
Delay (10ms);
LED1=0;LED2=1;LED3=0;LED4=0;
Delay (10ms);
LED1=0;LED2=0;LED3=1;LED4=0;
Delay (10ms);
LED1=0;LED2=0;LED3=0;LED4=1;
Delay (10ms);
}

上述程序加入看门狗后, 就开始计时了,只要时间到了50ms,机器就会进行重启。
进入死循环后,注意首先要进行喂狗,即对看门狗定时器进行清零操作,这样每个循环才能都从零开始计时。如果不进行喂狗,将会每过50ms,机器就会进行复位一次,如此高频的复位,所造成的后果将不亚于死机,此时看门狗就会变成一条疯狗了。
所以,在使用看门狗之前,一定要喂好狗。

上述看门狗程序运行机理如下:
由于一个循环轮流点亮流水灯用时40ms,此时距离看门狗复位还有10ms的时间,下个循环又进行了清零操作,所以只要程序正常运行(即不发生死机),看门狗就永远不会触发机器重启。
当程序发生死机之后,就不会回到while死循环第一步进行喂狗了,而是等50ms过去,看门狗就会触发机器复位,此时CPU虽然死机了,但看门狗模块不会受影响,还能正常运行,所以能触发机器复位。

CPU
死机
看门狗
复位

好了,以上内容,就是我对看门狗的理解,希望对大家有所帮助。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,以下是一个简单的Rt-thread看门程序的示例: ``` #include <rtthread.h> #define WATCHDOG_TIMEOUT (5000) // 5秒超时时间 /* 定义看门设备对象 */ static rt_device_t watchdog_dev; /* 定义看门线程 */ static rt_thread_t watchdog_thread = RT_NULL; static void watchdog_thread_entry(void* parameter) { rt_uint32_t timeout; while (1) { /* 表示没有任务需要看门保护 */ if (rt_thread_self()->stat == RT_THREAD_CLOSE) { rt_kprintf("No task to watch!\n"); break; } /* 看门开始计时 */ timeout = rt_device_control(watchdog_dev, RT_DEVICE_CTRL_WDT_START, (void*)WATCHDOG_TIMEOUT); /* 如果返回0,则表示看门时间到达 */ if (timeout == 0) { rt_kprintf("Watchdog timeout\n"); rt_hw_reset(); // 通过硬件复位系统 } rt_thread_mdelay(WATCHDOG_TIMEOUT / 2); // 线程等待WATCHDOG_TIMEOUT / 2毫秒 } } int watchdog_init(void) { watchdog_dev = rt_device_find("wdt"); // 找到看门设备 /* 如果找不到看门设备,则返回错误 */ if (watchdog_dev == RT_NULL) { rt_kprintf("Watchdog device not found!\n"); return -1; } /* 控制看门的设备注册为看门模式 */ rt_device_control(watchdog_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, (void*)WATCHDOG_TIMEOUT); rt_device_control(watchdog_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL); // 看门计时开始 /* 创建看门线程 */ watchdog_thread = rt_thread_create("watchdog", watchdog_thread_entry, RT_NULL, 1024, 25, 10); if (watchdog_thread != RT_NULL) { rt_thread_startup(watchdog_thread); rt_kprintf("Watchdog thread create success!\n"); return 0; } rt_kprintf("Watchdog thread create fail!\n"); return -1; } /* 注册看门初始化函数到Rt-thread */ INIT_APP_EXPORT(watchdog_init); ``` 这个看门程序中,我们使用了Rt-thread提供的看门接口来实现计时功能并防止系统因为某个线程的执行超时而崩溃的情况发生。当超时时间到达时,看门会向外部硬件发送一个复位信号,从而复位整个系统。这个看门程序需要在初始化的时候调用 watchdog_init() 函数来完成注册到Rt-thread内核的初始化过程。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值