看门狗watchdog
来源:互联网 发布:手机讲故事软件 编辑:程序博客网 时间:2024/04/29 12:42
看门狗在嵌入式系统开发中占据重要的地位,管理系统的工作状态。在这里本人muge0913在参考别人的基础上,实现了mini6410看门狗的移植。本文章仅供技术交流请勿商用,转载请标明地址:
http://blog.csdn.net/muge0913/article/details/7063001
在mini6410中看门狗驱动文件为linux2.6.38/drivers/watchdog/s3c2410_wdt.c
在mini6410中linux系统默认看门狗是不开机启动,但是我们可以向/dev/watchdog写入数据来启动或关闭看门狗。
如:echo 0 >/dev/watchdog
echo这个命令启动的作用是先打开文件,再写入内容,然后关闭。也就是open->write->release。
运行效果:
一段时间后系统会自动重启。
如果执行:
echo 0 >/dev/watchdog
echo V >/dev/watchdog
系统侧不会重启。
原因分析:
open函数:
static int s3c2410wdt_open(struct inode *inode, struct file *file){if (test_and_set_bit(0, &open_lock))return -EBUSY;if (nowayout)__module_get(THIS_MODULE);expect_close = 0;/* start the timer */s3c2410wdt_start();return nonseekable_open(inode, file);}
release函数:
static int s3c2410wdt_release(struct inode *inode, struct file *file){/* *Shut off the timer. * Lock it in if it's a module and we set nowayout */if (expect_close == 42)s3c2410wdt_stop();else {dev_err(wdt_dev, "Unexpected close, not stopping watchdog\n");s3c2410wdt_keepalive();}expect_close = 0;clear_bit(0, &open_lock);return 0;}
write函数:
static ssize_t s3c2410wdt_write(struct file *file, const char __user *data,size_t len, loff_t *ppos){/* *Refresh the timer. */if (len) {if (!nowayout) {size_t i;/* In case it was set long ago */expect_close = 0;for (i = 0; i != len; i++) {char c;if (get_user(c, data + i))return -EFAULT;if (c == 'V')expect_close = 42;}}s3c2410wdt_keepalive();}return len;}
看门狗只能被一个进程打开,打开函数中先判断了一下,然后启动了看门狗;再看write函数,写入的如果是V则允许关闭看门狗,如果不是V仅仅喂狗一次;最后是release函数,如果允许关闭则关闭看门狗,如果不允许关闭,打印"Unexpectedclose, not stoppingwatchdog",喂狗一次。此时看门狗并没有关闭,所以系统会复位的,如果输入V则看门狗被关闭,这样系统就不复位了。
看门狗在mini6410上的移植过程:
首先配置:make menuconfig
在drivers/watchdog/s3c2410_wdt.c中进行修改:
#define CONFIG_S3C2410_WATCHDOG_ATBOOT(1)#define CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME(15)
注:
#define CONFIG_S3C2410_WATCHDOG_ATBOOT(0)//系统启动时不开启看门狗#define CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME(15)//复位时间
设置成系统启动就启动看门狗,并且看门狗到期时间为15s。这样系统复位后每15s系统就会复位一次,所以我们在用户空间进行喂狗,驱动中的那个中断函数是当看门狗作为定时器时用的,所以没有实现喂狗,所以只能在用户程序中喂狗,下面是源码:
#include <stdio.h> #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> #include <stdlib.h> #include <errno.h> #include <linux/watchdog.h> int main(int argc, char **argv){ int fd; fd = open("/dev/watchdog",O_RDONLY); if(fd < 0){ perror("/dev/watchdog"); return -1; } for(;;){ ioctl(fd, WDIOC_KEEPALIVE); sleep(3); } close(fd); return 0; }
编译:
arm-linux-gcc wdt.c -o wdt
把wdt拷贝到root-2.6.30.4/sbin/下,并修改root-2.6.38/etc/init.d/rcS文件,添加wdt&这么一句,让系统启动后这个应用程序在后台运行。
#! /bin/shPATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:runlevel=Sprevlevel=Numask 022export PATH runlevel prevlevel##Trap CTRL-C &c only in this shell so we can interrupt subprocesses.#trap ":" INT QUIT TSTP/bin/hostname FriendlyARM[ -e /proc/1 ] || /bin/mount -n -t proc none /proc[ -e /sys/class ] || /bin/mount -n -t sysfs none /sys[ -e /dev/tty ] || /bin/mount -t ramfs none /dev/bin/mount -n -t usbfs none /proc/bus/usbecho /sbin/mdev > /proc/sys/kernel/hotplug/sbin/mdev -s/bin/hotplug# mounting file system specified in /etc/fstabmkdir -p /dev/ptsmkdir -p /dev/shm/bin/mount -n -t devpts none /dev/pts -o mode=0622/bin/mount -n -t tmpfs tmpfs /dev/shm/bin/mount -n -t ramfs none /tmp/bin/mount -n -t ramfs none /varmkdir -p /var/emptymkdir -p /var/logmkdir -p /var/lockmkdir -p /var/runmkdir -p /var/tmp/sbin/hwclock -ssyslogd/etc/rc.d/init.d/netd startecho " " > /dev/tty1echo "Starting networking..." > /dev/tty1sleep 1/etc/rc.d/init.d/httpd startecho " " > /dev/tty1echo "Starting web server..." > /dev/tty1sleep 1/etc/rc.d/init.d/leds startecho " " > /dev/tty1echo "Starting leds service..." > /dev/tty1echo " "sleep 1echo " " > /dev/tty1/etc/rc.d/init.d/alsaconf startecho "Loading sound card config..." > /dev/tty1echo " "/sbin/ifconfig lo 127.0.0.1/etc/init.d/ifconfig-eth0/sbin/wdt&/bin/qtopia &echo " " > /dev/tty1echo "Starting Qtopia, please waiting..." > /dev/tty1
http://www.linuxso.com/linuxbiancheng/12702.html
某CSDN帖子
/dev/watchdog是一个字符设备节点,简单点可以理解为linux下的一个文件,在程序中使用看门狗的过程大致分为以下几步:
1.打开年看门狗“文件”;
2.设置超时时间;
3,周期性向这个文件写入字符(喂狗);
若程序出现异常退出,无法在喂狗周期内写入字符,则系统将自动复位重启。我写的一个例子代码如下:
- C/C++ code
- #include <unistd.h>#include <fcntl.h>#include <sys/ioctl.h>#include <linux/watchdog.h>#define WDT "/dev/watchdog"int main(){ int wdt_fd = -1;//看门狗文件标识 int timeout = 10;//超时时间为10s wdt_fd = open(WDT,O_WRONLY); if(wdt_fd == -1) { printf("----------Fail to open "WDT"!\n"); } ioctl(wdt_fd,WDIOC_SETTIMEOUT,&timeout); ioctl(wdt_fd,WDIOC_GETTIMEOUT,&timeout); while(1) { write(wdt_fd,"\0",1); printf("feet dog***********\n"); sleep(9); } return 0;}
- 看门狗watchdog
- 看门狗watchdog的理解
- 什么是看门狗(watchdog)
- 什么是看门狗(watchdog)
- 什么是看门狗(watchdog)
- watchdog(看门狗)
- s3c2410 watchdog (看门狗)转
- android -- WatchDog看门狗分析
- Linux 软件看门狗 watchdog
- android -- WatchDog看门狗分析
- android Watchdog 看门狗
- android -- WatchDog看门狗分析
- WatchDog Timer看门狗
- watchdog(看门狗)
- Linux 软件看门狗 watchdog
- WatchDog Timer看门狗
- Linux 软件看门狗 watchdog
- 树莓派启用看门狗watchdog
- 学习链接
- 防止handle忘记关闭,或者被关闭多次,以及防止内存忘记释放,或者释放多次
- sharepoint2010管理permission levels
- java中byte,String,InputStream之间的转换
- xfire+Sping+安全认证
- 看门狗watchdog
- USB接口的EMI和ESD设计方案
- grub
- 用 Java 实现断点续传 (HTTP)
- 图标资源
- linux备份
- 多线程下载(FtpWebRequest)
- HBase Log Splitting
- jQuery LigerUI 初次发布&一睹为快(提供Demo下载)