欢迎光临
我们一直在努力

rt-thread 看门狗使用详解

rt-thread 看门狗使用详解

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

在这里插入图片描述

一、什么是看门狗

在嵌入式系统中,看门狗(Watchdog)是一种关键的硬件或软件机制,用于检测和恢复系统故障。其核心原理是通过定时器监控程序运行状态,若系统因意外(如死循环、硬件干扰)导致程序卡死,看门狗会强制复位系统,确保可靠性。

1、工作原理

  • 定时器初始化: 系统启动时,配置看门狗定时器(例如设置超时时间

    T

    T

    T)。WDT_Init(T); // 初始化看门狗,超时时间为T

  • 定期喂狗: 主程序需周期性地重置看门狗计数器(俗称“喂狗”),若正常执行则计数器不会溢出。while(1) {
    // … 主程序逻辑
    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、低功耗中看门狗处理

    由于低功耗需要休眠无法及时喂狗,但一般看门狗启动以后无法停止,所以在低功耗场景中都是定时唤醒喂狗,不然会造成软件复位。

    在这里插入图片描述

    赞(0)
    未经允许不得转载:171主机测评 » rt-thread 看门狗使用详解
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址