237|3

89

帖子

2

资源

一粒金砂(中级)

【中科蓝讯AB32VG1 RISC-V板“碰上”RTT测评】看门狗 [复制链接]

本帖最后由 xiyue521 于 2021-5-16 01:48 编辑

 

        看门狗的目的是为了保护芯片避免其进入死循环(或者说程序跑飞)。看门狗有一个输入端和一个输出端。看门狗和单片机程序的主体部分连接,如果主体部分运行正常,那么每一段时间就会给看门狗的输入端一个信号,这时候看门狗就会知道程序运行正常,就不会做出反应。如果看门狗较长一段时间内没有收到信号,说明程序运行不正常,此时由看门狗输出一个信号,该信号会让单片机的主体程序复位进而起到保护的作用。

 

首先使能看门狗,然后照旧用rt_device_find查找设备,成功了进入下一步:

开发板的看门狗主要有3个函数:(其实只有一个,就是第二,三个参数不一样)

设置看门狗溢出时间 :rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);
  
启动看门狗 :rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL);
 

喂狗rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);

image.png

 

 

 

timeout溢出时间选择1024ms,也可以有其他的:

 

image.png

 

 

代码设计思路,创建一个看门狗线程,先初始化看门狗,然后在循环里面喂狗,如果  rt_thread_mdelay<1024ms喂狗则不会复位:



#define WDT_DEVICE_NAME    "wdt"    /* 看门狗设备名称 */
static rt_device_t wdg_dev;         /* 看门狗设备句柄 */
static void wdt(void* pdata)
{
    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);
        while(1);
    }

    /* 设置看门狗溢出时间 */
    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);
    }
    /* 启动看门狗 */
    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);
    }

while(1)
{

    rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
    rt_kprintf("feed dog success!!\r\n");
rt_thread_mdelay(1000);

}
}


static int wdt_Thread_Init(void)
{


    rt_thread_t thread = RT_NULL;
    thread = rt_thread_create("wdt_thread", wdt, RT_NULL, 512, 10, 10);
    if(thread == RT_NULL)
    {
        rt_kprintf("Thread_GRB Init ERROR");
        return RT_ERROR;
    }
    rt_thread_startup(thread);

}

INIT_APP_EXPORT(wdt_Thread_Init);  // 初始化线程

 

 

但是经过测试1s喂狗也会发生复位,溢出时间1024ms按理来说不会的:

鍔ㄧ敾.gif

最后改成900ms喂就可以:误差有点大。。

鍔ㄧ敾.gif

 

        其实在应用中我们不必创建线程喂狗,也不必这么精确控制喂狗时间,可以频繁喂狗,如果系统死机就不会喂狗就会复位达成目的了,所以可以在空闲线程喂狗,如果空闲线程没有喂狗,那么就可以判断系统死机了:

用一个钩子函数添加喂狗函数到空闲线程:

 
static void idle_hook(void)
{
    rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
    rt_kprintf("feed the dog!\n ");
}


rt_thread_idle_sethook(idle_hook);

 

可以看到空闲线程疯狂喂狗:

鍔ㄧ敾 (-1).gif

这就可以保护系统运行了。

 

        

 

最后还要感谢中科蓝讯活动负责人的一个视频转gif的软件,真的挺好,可以直接录屏,摄像然后转gif:视频转gif工具

image.png

 

 

 

 


回复

5785

帖子

0

资源

五彩晶圆(初级)

点赞,分享了这么多

所谓看门狗电路本质是一个定时计数器,一旦到达最大计数值就会把机器复位,比如楼主的测试1s喂狗也会发生复位

顺便说分享的视频转gif的软件,真的挺好

点评

但是如果我选了2048ms那个超时时间1s就不会,所以不知道1024ms为什么会复位,其实提前喂狗也挺好,不用卡的死死的  详情 回复 发表于 2021-5-17 20:41

回复

89

帖子

2

资源

一粒金砂(中级)

Jacktang 发表于 2021-5-16 15:38 点赞,分享了这么多 所谓看门狗电路本质是一个定时计数器,一旦到达最大计数值就会把机器复位,比如楼主 ...

但是如果我选了2048ms那个超时时间1s就不会,所以不知道1024ms为什么会复位,其实提前喂狗也挺好,不用卡的死死的


回复

3953

帖子

1

资源

五彩晶圆(初级)

谢谢分享,期待后续!

个人签名人已离开,无事别找,找也找不到。

回复
您需要登录后才可以回帖 登录 | 注册

最新文章 更多>>
    关闭
    站长推荐上一条 1/8 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表