• 欢迎访问BruceOu的博客,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏本章吧

《嵌入操作系统 – 玩转中科蓝讯(AB32VG1)开发板(基于RT-Thread系统)》第4章 看门狗

开发环境:
RT-Thread版本:4.0.3
操作系统:Windows 10
RT-Thread Studio版本:2.0.0
开发板MCU:AB5301A

cwE5gs.png

4.1看门狗工作原理

看门狗用通俗一点的话来解释就是一个计数器,当计数器的值从某个值一直减到 0 的时候,系统就会产生一个复位信号。如果在计数没减到 0 之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作就是我们经常说的喂狗

4.2配置看门狗

第一步还是先打开WDT设备,打开RT-Thread Setting,勾选WDT选项。

6fYEex.png

同时打开WDT的定时器。

6fYufe.png

这就配置完成了,接下来保存即可。

4.3看门狗代码实现

看门狗一般用来检测和解决由程序引起的故障,比如一个程序正常运行的时间是50ms,在运行完这个段程序之后紧接着进行喂狗,我们设置独立看门狗的定时溢出时间为60ms,比我们需要监控的程序 50ms 多一点,如果超过 60ms 还没有喂狗,那就说明我们监控的程序出故障了,跑飞了,那么就会产生系统复位,让程序重新运行。

这个程序很简单,只需要喂狗即可。

/**
  ******************************************************************************
  * @file                task.c
  * @author              BruceOu
  * @lib version         V3.5.0
  * @version             V1.0
  * @date                2021-01-10
  * @blog                https://blog.bruceou.cn/
  * @Official Accounts   嵌入式实验楼
  * @brief               RTT任务
  ******************************************************************************
  */
/*Includes**********************************************************************/
#include "task.h"

#define WDT_DEVICE_NAME    "wdt"    /* 看门狗设备名称 */

static rt_device_t wdg_dev;         /* 看门狗设备句柄 */

static void idle_hook(void)
{
    /* 在空闲线程的回调函数里喂狗 */
    rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
    //rt_kprintf("feed the dog!\n ");
}

/**
  * @brief  thread_wdt
  * @param  None
  * @retval ret
  */
int thread_wdt(void)
{
    rt_err_t ret = RT_EOK;
    rt_uint32_t timeout = 3;        /* 溢出时间,单位:秒 */
    char device_name[RT_NAME_MAX];

    rt_strncpy(device_name, WDT_DEVICE_NAME, RT_NAME_MAX);

    /* 根据设备名称查找看门狗设备,获取设备句柄 */
    wdg_dev = rt_device_find(device_name);
    if (!wdg_dev)
    {
        rt_kprintf("find %s failed!\n", device_name);
        return RT_ERROR;
    }

    /* 设置看门狗溢出时间 */
    ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);
    if (ret != RT_EOK)
    {
        rt_kprintf("set %s timeout failed!\n", device_name);
        return RT_ERROR;
    }
    /* 启动看门狗 */
    ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL);
    if (ret != RT_EOK)
    {
        rt_kprintf("start %s failed!\n", device_name);
        return -RT_ERROR;
    }
    /* 设置空闲线程回调函数 */
    rt_thread_idle_sethook(idle_hook);

    return ret;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(thread_wdt, wdt sample);

程序很简单,初始化看门狗后,在主循环里不断喂狗即可。值得注意的不要在idle_hook函数中加延时函数。另外在正式使用看门狗时,取消打印即可。

值得注意的是,这里的超时时间也可用以下宏定义替换。

6fYMSH.png

4.4看门狗实验现象

编译无误,下载程序,输入thread_wdt,现象如下:

6fYl6A.png

你会打开终端不断的输出打印信息,说明看门狗工作正常,如果复位了说明计时器溢出,喂狗失败。

本实验很简单,后文将使用看门狗和其他设备一起实现更为复杂的功能。

参考资料


BrueceOu , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:《嵌入操作系统 – 玩转中科蓝讯(AB32VG1)开发板(基于RT-Thread系统)》第4章 看门狗
喜欢 (4)
[支付宝]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(3)个小伙伴在吐槽
  1. 优秀
    小恶魔2021-03-21 09:33 回复
  2. :mrgreen:
    小李子2021-03-21 09:35 回复
    • :sad:
      小李子2021-03-21 10:07 回复