1952|3

119

帖子

2

TA的资源

一粒金砂(中级)

楼主
 

【中科蓝讯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);

 

 

 

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

 

 

 

代码设计思路,创建一个看门狗线程,先初始化看门狗,然后在循环里面喂狗,如果  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按理来说不会的:

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

 

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

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

 
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);

 

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

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

 

        

 

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

 

 

 

 

最新回复

谢谢分享,期待后续!   详情 回复 发表于 2021-5-17 23:19
点赞 关注
 
 

回复
举报

6593

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

点赞,分享了这么多

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

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

点评

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

回复

119

帖子

2

TA的资源

一粒金砂(中级)

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

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

 
 
 

回复

7462

帖子

2

TA的资源

五彩晶圆(高级)

4
 

谢谢分享,期待后续!

个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

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