当前位置:   article > 正文

RT-Thread设备和驱动-I/O WATCHDOG设备①_rt thread 外部看门狗

rt thread 外部看门狗

RT-Thread设备和驱动-I/O WATCHDOG设备

在这里插入图片描述

WATCHDOG 设备

WATCHDOG 简介

硬件看门狗(watchdog timer)是一个定时器,其定时输出连接到电路的复位端。在产品化的嵌入式系统中,为了使系统在异常情况下能自动复位,一般都需要引入看门狗。

当看门狗启动后,计数器开始自动计数,在计数器溢出前如果没有被复位,计数器溢出就会对 CPU 产生一个复位信号使系统重启(俗称 “被狗咬”)。系统正常运行时,需要在看门狗允许的时间间隔内对看门狗计数器清零(俗称“喂狗“),不让复位信号产生。如果系统不出问题,程序能够按时“喂狗”。一旦程序跑飞,没有“喂狗”,系统“被咬” 复位。

一般情况下可以在 RT-Thread 的 idle 回调函数和关键任务里喂狗。

访问看门狗设备

应用程序通过 RT-Thread 提供的 I/O 设备管理接口来访问看门狗硬件,相关接口如下所示:

函数 描述
rt_device_find() 根据看门狗设备设备名称查找设备获取设备句柄
rt_device_init() 初始化看门狗设备
rt_device_control() 控制看门狗设备
rt_device_close() 关闭看门狗设备
在这里插入图片描述

查找看门狗

应用程序根据看门狗设备名称获取设备句柄,进而可以操作看门狗设备,查找设备函数如下所示:

rt_device_t rt_device_find(const char* name);
  • 1

参数 描述
name 看门狗设备名称
返回 ——
设备句柄 查找到对应设备将返回相应的设备句柄
RT_NULL 没有找到相应的设备对象
在这里插入图片描述

使用示例如下所示:

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

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

使用看门狗设备前需要先初始化,通过如下函数初始化看门狗设备:

rt_err_t rt_device_init(rt_device_t dev);
  • 1

参数 描述
dev 看门狗设备句柄
返回 ——
RT_EOK 设备初始化成功
-RT_ENOSYS 初始化失败,看门狗设备驱动初始化函数为空
其他错误码 设备打开失败
在这里插入图片描述

使用示例如下所示:

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

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

/* 初始化设备 */
rt_device_init(wdg_dev);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
控制看门狗

通过命令控制字,应用程序可以对看门狗设备进行配置,通过如下函数完成:

rt_err_t rt_device_control(rt_device_t dev, rt_uint8_t cmd, void* arg);
  • 1

参数 描述
dev 看门狗设备句柄
cmd 命令控制字
arg 控制的参数
返回 ——
RT_EOK 函数执行成功
-RT_ENOSYS 执行失败,dev 为空
其他错误码 执行失败
在这里插入图片描述

命令控制字可取如下宏定义值:

#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) /* 停止看门狗 */
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

设置看门狗溢出时间使用示例如下所示:

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

rt_uint32_t timeout = 1;       /* 溢出时间,单位:秒*/
static rt_device_t wdg_dev;    /* 看门狗设备句柄 */
/* 根据设备名称查找看门狗设备,获取设备句柄 */
wdg_dev = rt_device_find(WDT_DEVICE_NAME);
/* 初始化设备 */
rt_device_init(wdg_dev);

/* 设置看门狗溢出时间 */
rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);
/* 设置空闲线程回调函数 */
rt_thread_idle_sethook(idle_hook);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在空闲线程钩子函数里喂狗使用示例如下所示:

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

当应用程序完成看门狗操作后,可以关闭看门狗设备,通过如下函数完成:

rt_err_t rt_device_close(rt_device_t dev);
  • 1

参数 描述
dev 看门狗设备句柄
返回 ——
RT_EOK 关闭设备成功
-RT_ERROR 设备已经完全关闭,不能重复关闭设备
其他错误码 关闭设备失败
在这里插入图片描述

关闭设备接口和打开设备接口需配对使用,打开一次设备对应要关闭一次设备,这样设备才会被完全关闭,否则设备仍处于未关闭状态。

看门狗设备使用示例

看门狗设备的具体使用方式可以参考如下示例代码,示例代码的主要步骤如下:

  1. 根据设备名称 “wdt” 查找设备获取设备句柄。
  2. 初始化设备后设置看门狗溢出时间。
  3. 启动看门狗。
  4. 喂狗:设置空闲线程回调函数,在空闲线程回调函数中喂狗。
/*
 * 程序清单:这是一个独立看门狗设备使用例程
 * 例程导出了 wdt_sample 命令到控制终端
 * 命令调用格式:wdt_sample wdt
 * 命令解释:命令第二个参数是要使用的看门狗设备名称,为空则使用例程默认的看门狗设备。
 * 程序功能:程序通过设备名称查找看门狗设备,然后初始化设备并设置看门狗设备溢出时间。
 *           然后设置空闲线程回调函数,在回调函数里会喂狗。
*/

#include <rtthread.h>
#include <rtdevice.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 ");
}

static int wdt_sample(int argc, char *argv[])
{
    rt_err_t ret = RT_EOK;
    rt_uint32_t timeout = 1;        /* 溢出时间,单位:秒 */
    char device_name[RT_NAME_MAX];

    /* 判断命令行参数是否给定了设备名称 */
    if (argc == 2)
    {
        rt_strncpy(device_name, argv[1], RT_NAME_MAX);
    }
    else
    {
        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;
    }
    /* 初始化设备 */
     rt_device_init(wdg_dev);
    /* 设置看门狗溢出时间 */
    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(wdt_sample, wdt sample);
  • 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
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68

小结:

RT-Thread是一个在实时操作系统(RTOS)中广泛使用的开源系统。在RT-Thread中,设备和驱动程序是其硬件抽象层的重要组成部分。对于I/O WATCHDOG设备,它是RT-Thread中的一个特殊设备,用于监视系统运行状态,确保系统的稳定性和可靠性。下面是关于RT-Thread设备和驱动以及I/O WATCHDOG设备的详细解释。

1. RT-Thread设备和驱动

  • 设备:RT-Thread中的设备是硬件抽象层的表示,它代表了一个可以操作的实体。设备可以是CPU、内存、中断控制器、串行端口、以太网控制器等。每个设备都有一些特定的操作,例如读、写、打开、关闭等。
  • 驱动程序:驱动程序是RT-Thread中与设备交互的软件组件。它负责处理设备的底层细节,并向上层应用程序提供一个统一的接口。驱动程序通常处理设备的初始化、配置、读写操作等。

2. I/O WATCHDOG设备

  • I/O WATCHDOG:I/O WATCHDOG设备是RT-Thread中的一个特殊设备,用于实现系统监视和故障恢复功能。它通常用于检测系统是否正常运行,并在系统出现故障时执行一些预定的恢复操作。
  • 工作原理:I/O WATCHDOG设备会定期接收来自系统的“心跳”信号,表明系统正常运行。如果在一定时间内没有接收到心跳信号,I/O WATCHDOG设备将认为系统出现故障,并触发相应的恢复操作,例如重启系统或执行备份恢复等。
  • 使用方式:在RT-Thread中使用I/O WATCHDOG设备,首先需要配置和初始化WATCHDOG设备相关的参数,例如超时时间、恢复操作等。然后,在应用程序中通过调用相应的API来操作WATCHDOG设备,例如喂狗(发送心跳信号)、获取设备状态等。

总之,RT-Thread设备和驱动程序是RTOS的底层核心组件,它们共同为上层应用程序提供了一个统一、稳定的硬件抽象层。而I/O WATCHDOG设备则是RT-Thread中一个特殊的设备,用于增强系统的可靠性和稳定性,确保系统在出现故障时能够及时恢复。

我有疑问: 1992152446@qq.com

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

闽ICP备14008679号