免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 10586 | 回复: 18
打印 上一主题 下一主题

硬件看门狗的应用问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-07 15:51 |只看该作者 |倒序浏览
10可用积分
emb9260开发板,watchdog是Max706.

驱动是linux内核里面已有的,

不明白的是:硬件看门狗是只要打开运行就可以了吗? 不用程序区“喂”狗吗? 如果不喂的话,按理说应该会自动启动系统的吧,可是我打开以后,一直没什么反映。

是不是硬件会自动的喂狗,知道系统崩溃后,才会重启呢??????

论坛徽章:
0
2 [报告]
发表于 2009-05-07 16:23 |只看该作者
一般都没有打开看门狗吧
这个问题有点意思,有时间试试

论坛徽章:
0
3 [报告]
发表于 2009-05-07 16:29 |只看该作者
要喂狗的,不喂系统就复位了。
看门狗在文件系统里应该是被映射成一个字符型设备的,比如/dev/watchdog。
你写一个程序单单open这个文件,然后也不去喂它,比如下面的伪码。
open(/dev/watchdog);
while(1);
系统应该会过一段时间就复位的,喂狗周期可以用ioctl函数进行设置,也可以直接修改看门狗驱动代码中的默认喂狗周期。

至于如何喂狗只要随便write一个值就可以了。

另外,close(/dev/watchdog)会将看门狗关闭,程序结束也会关闭看门狗,此时,不去喂狗系统也不会复位了。

论坛徽章:
0
4 [报告]
发表于 2009-05-07 16:43 |只看该作者

回复 #3 zhsishi 的帖子

楼上,我按照您说的试了,
open,然后 while空循环没有退出。
可是它就是不复位,不知为什么??
等了很长时间的。。。

论坛徽章:
0
5 [报告]
发表于 2009-05-07 16:47 |只看该作者
原帖由 wwlhz 于 2009-5-7 16:43 发表
楼上,我按照您说的试了,
open,然后 while空循环没有退出。
可是它就是不复位,不知为什么??
等了很长时间的。。。

我估计还有ioctl来设置watchdog有效

论坛徽章:
0
6 [报告]
发表于 2009-05-07 16:57 |只看该作者

回复 #5 sep 的帖子

int main(int argc, char *argv[])
{
    fd = open("/dev/watchdog", O_WRONLY);
   
    if (fd == -1) {
        fprintf(stderr, "Watchdog device not enabled.\n");
        fflush(stderr);
        exit(-1);
    }
   
    if (argc > 1) {
        if (!strncasecmp(argv[1], "-test", 5)) {
            ioctl(fd, WDIOC_SETOPTIONS, WDIOS_ENABLECARD);
            while (1){
                sleep(100);
            }
        } else if (!strncasecmp(argv[1], "-d", 2)) {
            ioctl(fd, WDIOC_SETOPTIONS, WDIOS_DISABLECARD);
            fprintf(stderr, "Watchdog card disabled.\n");
        } else if (!strncasecmp(argv[1], "-e", 2)) {
            ioctl(fd, WDIOC_SETOPTIONS, WDIOS_ENABLECARD);
            fprintf(stderr, "Watchdog card enabled.\n");
        } else if (!strncasecmp(argv[1], "-t", 2) && (argc > 2)) {
            timeout = atoi(argv[2]);
            ioctl(fd, WDIOC_SETTIMEOUT, &timeout);
            fprintf(stderr, "Set timeout %s sec.\n", argv[2]);
        } else {
            fprintf(stderr, "-d to disable, -e to enable, -t val to set timeout.\n");
            fprintf(stderr, "run by itself to tick the card.\n");
        }
        fflush(stderr);
        exit(0);
    } else {
        fprintf(stderr, "Watchdog Ticking Away!\n");
        fflush(stderr);
    }
   
    while(1) {
        keep_alive();
        sleep(1);
    }
}

我运行:./wdt_test -test
是先open后ioctl设置为ENABLECARD

还是不会reset

论坛徽章:
0
7 [报告]
发表于 2009-05-07 17:01 |只看该作者
你可以先看下说明,一般这些说明位于内核驱动的相关头文件

论坛徽章:
5
8 [报告]
发表于 2009-05-07 17:27 |只看该作者
硬件狗就是时钟counter && Interrupt.
软件要做的事情就是:
1. 设置计时周期.
2. 设置reset级别.
3. disable/enable

Enable后, 硬件counter自己计数, 定时产生Interrupt, 软件喂狗, 使狗复位, 重新计数.
长时间没喂狗, reset interrupt产生, 根据reset级别, 复位你的系统.

LZ可以比较一下, 看看哪些步骤没做好.

论坛徽章:
0
9 [报告]
发表于 2009-05-07 19:14 |只看该作者
在每次调度时是否系统自动喂狗了呢?

论坛徽章:
0
10 [报告]
发表于 2009-05-08 10:22 |只看该作者

回复 #8 yidou 的帖子

/* Check if disabled */
        mr = at91_sys_read(AT91_WDT_MR);
        if (mr & AT91_WDT_WDDIS) {
                printk(KERN_ERR DRV_NAME": sorry, watchdog is disabled\n");
                return -EIO;
        }
看门狗控制寄存器的值读出来DISABLE位一直是1,无论写什么值,这个寄存器的值都出来都是一样的。
手册上写的这个寄存器只可以write一次,但写不起作用。
不知道为什么会这样
DISABLE位应该是可以控制的吧?
写0就enable了?

现在主要问题是无法enable看门狗

[ 本帖最后由 wwlhz 于 2009-5-8 12:06 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP