rt-thread 看门狗使用详解
- 一、什么是看门狗
-
- 1、工作原理
- 2、类型与应用
- 3、设计注意事项
- 3、典型场景
- 4、看门狗的作用
- 5、总结
- 二、使用源码
-
- 1、rt-thread使用源码
- 2、低功耗中看门狗处理

一、什么是看门狗
在嵌入式系统中,看门狗(Watchdog)是一种关键的硬件或软件机制,用于检测和恢复系统故障。其核心原理是通过定时器监控程序运行状态,若系统因意外(如死循环、硬件干扰)导致程序卡死,看门狗会强制复位系统,确保可靠性。
1、工作原理
T
T
T)。WDT_Init(T); // 初始化看门狗,超时时间为T
// … 主程序逻辑
WDT_Feed(); // 喂狗操作
}
若
t
last_feed
>
T
⟹
复位
\\text{若 } t_{\\text{last\\_feed}} > T \\implies \\text{复位}
若 tlast_feed>T⟹复位
2、类型与应用
- 硬件看门狗:独立于CPU的计时电路,抗干扰性强,适用于工业控制等严苛环境。
- 软件看门狗:基于系统时钟的软件定时器,依赖CPU资源,适合低功耗场景。
3、设计注意事项
- 超时时间
T
T
T:需平衡系统响应速度和容错需求(如T
=
1
s
T=1\\,\\text{s}
T=1s)。 - 喂狗位置:置于主循环关键节点,避免遗漏。
- 中断处理:在中断服务程序中谨慎喂狗,防止异常屏蔽复位。
3、典型场景
看门狗广泛应用于:
- 嵌入式设备(如微控制器)。
- 服务器和网络设备,防止服务中断。
- 自动化系统,确保工业控制稳定。
- 物联网设备,增强抗故障能力。
4、看门狗的作用
- 故障检测与恢复:当系统挂起或进入死循环时,看门狗能检测到这种异常状态(因为“喂狗”操作未及时执行),并自动执行复位,避免系统长时间瘫痪。
- 提高可靠性:在关键应用(如工业控制、医疗设备或服务器)中,看门狗能减少人工干预的需要,确保系统持续可用。
- 容错能力:它帮助系统从临时故障中恢复,防止小错误演变成大问题。
5、总结
看门狗是嵌入式系统的“安全卫士”,通过超时复位机制保障长期稳定运行,需合理配置以适配具体应用场景。
二、使用源码
1、rt-thread使用源码
/*************************************************
* @copyright:
* @author:Xupeng
* @date:2022-11-03
* @description:
**************************************************/
#include "watchdog.h"
#define DBG_TAG "watchdog"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
#define WDT_DEVICE_NAME "wdt"
rt_device_t wdgDev = RT_NULL;
/*************************************************
* @function:static void wdg_idle_hook(void)
* @description: 空闲回调
* @calls:
* @input:
* @return:
* @others:
*************************************************/
static void wdg_idle_hook(void)
{
if(wdgDev != RT_NULL)
rt_device_control(wdgDev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL); //喂狗
}
/*************************************************
* @function:static int watchdog_init(void)
* @description: watchdog初始化
* @calls:
* @input:
* @return:
* @others:
*************************************************/
static int watchdog_init(void)
{
rt_err_t ret = RT_EOK;
rt_uint32_t timeout = 1; /* 溢出时间,单位:秒 */
wdgDev = rt_device_find(WDT_DEVICE_NAME);
if(wdgDev == RT_NULL)
{
LOG_E("can't find %s device", WDT_DEVICE_NAME);
return –RT_ERROR;
}
/* 初始化设备 */
ret = rt_device_init(wdgDev);
if (ret != RT_EOK)
{
LOG_E("initialize %s failed!\\n", WDT_DEVICE_NAME);
return RT_ERROR;
}
/* 设置看门狗溢出时间 */
ret = rt_device_control(wdgDev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);
if (ret != RT_EOK)
{
LOG_E("set %s timeout failed!\\n", WDT_DEVICE_NAME);
return RT_ERROR;
}
/* 启动看门狗 */
ret = rt_device_control(wdgDev, RT_DEVICE_CTRL_WDT_START, RT_NULL);
if (ret != RT_EOK)
{
LOG_E("start %s failed!\\n", WDT_DEVICE_NAME);
return –RT_ERROR;
}
/* 设置空闲线程回调函数 */
rt_thread_idle_sethook(wdg_idle_hook);
LOG_D("watch dog startup success!");
return 0;
}
#if ENABLE_WDT_WATCH
INIT_APP_EXPORT(watchdog_init);
#endif
2、低功耗中看门狗处理
由于低功耗需要休眠无法及时喂狗,但一般看门狗启动以后无法停止,所以在低功耗场景中都是定时唤醒喂狗,不然会造成软件复位。




