【rtthread设备】第八篇:看门狗设备

[rtthread设备]系列文章

【rtthread设备】第零篇:IO设备
【rtthread设备】第一篇:pin设备
【rtthread设备】第二篇:rtc设备
【rtthread设备】第三篇:adc设备
【rtthread设备】第五篇:hwtimer设备
【rtthread设备】第六篇:i2c设备
【rtthread设备】第七篇:spi设备
【rtthread设备】第八篇:看门狗设备

一、watchdog设备概念

看门狗启动后,可以在空闲线程或者关键任务喂狗,在产品化的嵌入式系统保证在系统异常时能够自动复位。

二、watchdog设备api

//查找设备
/*
name:设备名称,一般为wdt
*/
rt_device_t rt_device_find(const char* name);

//初始化看门狗
/*
看门狗句柄
*/
rt_err_t rt_device_init(rt_device_t dev)

//控制看门狗
/*
dev:看门狗句柄
cmd:控制命令,可取
    #define RT_DEVICE_CTRL_WDT_GET_TIMEOUT (1) /* 获 取 溢 出 时 间 */
    #define RT_DEVICE_CTRL_WDT_SET_TIMEOUT (2) /* 设 置 溢 出 时 间 */
    #define RT_DEVICE_CTRL_WDT_GET_TIMELEFT (3) /* 获 取 剩 余 时 间 */
    #define RT_DEVICE_CTRL_WDT_KEEPALIVE (4) /* 喂 狗 */
    #define RT_DEVICE_CTRL_WDT_START (5) /* 启 动 看 门 狗 */
    #define RT_DEVICE_CTRL_WDT_STOP (6) /* 停 止 看 门 狗 */
arg:控制命令参数
*/
rt_err_t rt_device_control(rt_device_t dev, rt_uint8_t cmd, void* arg);

//关闭看门狗
/*
dev:看门狗句柄
*/
rt_err_t rt_device_close(rt_device_t dev);

三、wotchdog设备示例

/*
 * Copyright (c) 2006-2018, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2018-09-25     misonyo      first edition.
 */
/*
 * 程序清单:这是一个独立看门狗设备使用例程
 * 例程导出了 iwdg_sample 命令到控制终端
 * 命令调用格式:iwdg_sample iwg
 * 命令解释:命令第二个参数是要使用的看门狗设备名称,为空则使用例程默认的看门狗设备。
 * 程序功能:程序通过设备名称查找看门狗设备,然后初始化设备并设置看门狗设备溢出时间。
 *           然后设置空闲线程回调函数,在回调函数里会喂狗。
*/

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

#define IWDG_DEVICE_NAME    "iwg"    /* 看门狗设备名称 */

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 iwdg_sample(int argc, char *argv[])
{
    
    
    rt_err_t ret = RT_EOK;
    rt_uint32_t timeout = 1000;    /* 溢出时间 */
    char device_name[RT_NAME_MAX];

    /* 判断命令行参数是否给定了设备名称 */
    if (argc == 2)
    {
    
    
        rt_strncpy(device_name, argv[1], RT_NAME_MAX);
    }
    else
    {
    
    
        rt_strncpy(device_name, IWDG_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_init(wdg_dev);
    if (ret != RT_EOK)
    {
    
    
        rt_kprintf("initialize %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;
    }
    /* 设置空闲线程回调函数 */
    rt_thread_idle_sethook(idle_hook);

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

Guess you like

Origin blog.csdn.net/weixin_43810563/article/details/116840567