当前位置:   article > 正文

rtthread studio与正点原子apollo(6)--watchdog设备_rtthread 看门狗

rtthread 看门狗


前言

本文介绍RT-Thread中看门狗定时器的使用。


一、watchdog简介

看门狗(watchdog timer)本质是一个定时器,可以作为系统复位的触发源,通常用于嵌入式系统运行异常时自动复位。
看门狗的工作原理:当启动看门狗功能后,看门狗计数器会自动+1计数,计数值不断与设定值比较,通常在计数值溢出前由软件自动清除计数值,保证看门狗不会产生溢出中断;当系统出现异常,计数值不能及时清零引起中断,继而向CPU申请复位。因此,在系统正常运行时需要定时将计数值清零(“喂狗”)。

二、访问watchdog设备

看门狗设备的访问及相关API函数参考官方文档
访问watchdog设备

RT-Thread中访问watchdog设备的步骤:
(1)查找watchdog设备

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

static rt_device_t wdg_dev;         /* 看门狗设备句柄 */
/* 根据设备名称查找看门狗设备,获取设备句柄 */
wdg_dev = rt_device_find(WDT_DEVICE_NAME);
  • 1
  • 2
  • 3
  • 4
  • 5

(2)初始化看门狗

/* 初始化设备 */
rt_device_init(wdg_dev);
  • 1
  • 2

(3)控制看门狗

rt_uint32_t timeout = 1;       /* 溢出时间,单位:秒*/

/* 设置看门狗溢出时间 */
rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);
  • 1
  • 2
  • 3
  • 4

(4)喂狗,以空闲线程钩子中实现为例

/* 设置空闲线程回调函数 */
rt_thread_idle_sethook(idle_hook);

static void idle_hook(void)
{
    /* 在空闲线程的回调函数里喂狗 */
    rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

也可以通过定时器中断函数喂狗,比空闲线程钩子更加精确。空闲线程钩子函数的使用必须确保进入钩子函数的时间小于看门狗喂狗时间
(5)关闭看门狗

/* 关闭看门狗 */
rt_device_close(wdg_dev);
}
  • 1
  • 2
  • 3

三、看门狗设备使用举例

1.看门狗配置过程

(1)在RT-Thread studio中创建工程,并启动看门狗设备
在这里插入图片描述
(2)打开stm32f7xx_hal_conf.h,确保开启看门狗功能
在这里插入图片描述

2.看门狗完整例程

#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>

#define LED0 GET_PIN(B,0)
#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 ");
}

static int wdt_sample(void)
{
    rt_err_t ret=RT_EOK;
    rt_uint32_t timeout=5;//看门狗溢出时间

    wdg_dev=rt_device_find(WDT_DEVICE_NAME);//查找看门狗设备
    if(!wdg_dev)
    {
        rt_kprintf("find %s failed!\n", WDT_DEVICE_NAME);
        return RT_ERROR;
    }
    ret = rt_device_init(wdg_dev);//初始化看门狗
    if (ret != RT_EOK)
    {
        rt_kprintf("initialize %s failed!\n", WDT_DEVICE_NAME);
        return RT_ERROR;
    }
    ret=rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);//设置看门狗喂狗溢出时间
    if(ret!=RT_EOK)
    {
        return RT_ERROR;
    }
    ret=rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL);//启动看门狗
    if(ret!=RT_EOK)
    {
        return -RT_ERROR;
    }
    rt_thread_idle_sethook(idle_hook);//启动空闲钩子函数
    return ret;
}

int main(void)
{

    wdt_sample();
    rt_pin_mode(LED0, PIN_MODE_OUTPUT);
    while (1)
    {
        rt_pin_write(LED0, PIN_HIGH);
        rt_thread_mdelay(1000);
        rt_pin_write(LED0, PIN_LOW);
        rt_thread_mdelay(1000);
    }

    return RT_EOK;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61

总结

看门狗设备的使用相对比较简单,其本质是定时器,在系统异常需要自动重启时,看门狗非常有用。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/713169
推荐阅读
相关标签
  

闽ICP备14008679号