Chinaunix首页 | 论坛 | 博客
  • 博客访问: 226415
  • 博文数量: 39
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 218
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-06 12:33
文章分类
文章存档

2017年(2)

2015年(11)

2014年(18)

2013年(8)

我的朋友

分类: 嵌入式

2013-12-04 15:09:50

1、什么是看门够?说白了就是个定时器,当时间到了如果不喂狗它就执行一次系统复位,也就跳到中断向量表执行复位向量。
2、Linux下看门狗程序又是怎么编写的?
1)、内核给我们提供了几个驱动接口,如下:
wdt_open :打开设备,应用程序调用open时进入该函数.
wdt_close :关闭设备,应用程序调用close时进入该函数
wdt_write :写设备,若传入数据大小不为0则喂狗;应用程序调用write时进入该函数.
wdt_ioctl :这个函数是最主要的,原型如下(driver\watchdog):

点击(此处)折叠或打开

  1. static long wdt_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
  2. {
  3.     void __user *argp = (void __user *)arg;
  4.     int __user *p = argp;
  5.     int new_timeout;
  6.     static const struct watchdog_info ident = {
  7.         .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT |
  8.                             WDIOF_MAGICCLOSE,
  9.         .firmware_version = 1,
  10.         .identity = "W83627HF WDT",
  11.     };

  12.     switch (cmd) {
  13.     case WDIOC_GETSUPPORT:
  14.         if (copy_to_user(argp, &ident, sizeof(ident)))
  15.             return -EFAULT;
  16.         break;
  17.     case WDIOC_GETSTATUS:
  18.     case WDIOC_GETBOOTSTATUS:
  19.         return put_user(0, p);
  20.     case WDIOC_SETOPTIONS:
  21.     {
  22.         int options, retval = -EINVAL;

  23.         if (get_user(options, p))
  24.             return -EFAULT;
  25.         if (options & WDIOS_DISABLECARD) {
  26.             wdt_disable();
  27.             retval = 0;
  28.         }
  29.         if (options & WDIOS_ENABLECARD) {
  30.             wdt_ping();
  31.             retval = 0;
  32.         }
  33.         return retval;
  34.     }
  35.     case WDIOC_KEEPALIVE:
  36.         wdt_ping();
  37.         break;
  38.     case WDIOC_SETTIMEOUT:
  39.         if (get_user(new_timeout, p))
  40.             return -EFAULT;
  41.         if (wdt_set_heartbeat(new_timeout))
  42.             return -EINVAL;
  43.         wdt_ping();
  44.         /* Fall */
  45.     case WDIOC_GETTIMEOUT:
  46.         return put_user(timeout, p);
  47.     default:
  48.         return -ENOTTY;
  49.     }
  50.     return 0;
  51. }
其主要的几个参数如下:
WDIOC_KEEPALIVE :喂狗,同write函数功能类似
WDIOC_SETTIMEOUT :设置超时值
WDIOC_GETTIMEOUT :获取超时值
WDIOC_SETOPTIONS:设置看门狗状态,开启(WDIOS_ENABLECARD)或关闭(WDIOS_DISABLECARD)

2编写看门狗程序
1、open设备(/dev/watchdog)
    fd = open("/dev/watchdog", O_RDWR);
2、start watchdog
 ioctl(fd, WDIOC_SETOPTIONS, WDIOS_ENABLECARD);
3、set outtime
 int timeout = 60;
  ioctl(fd, WDIOC_SETTIMEOUT, &timeout);
4、喂够
在循环体while(1)内喂
(1)、write。
 write(fd, &arg, sizeof(arg));//arg必须是非0数,否则喂狗失败
(2)、ioctl。
 ioctl(fd, WDIOC_KEEPALIVE,NULL);
5、close watchdog
 ioctl(fd, WDIOC_SETOPTIONS, WDIOS_DISABLECARD)
6、记得关闭设备
close(fd);







阅读(13561) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~