Watchdog使用参考

Version 1.0


1. 概述

Watchdog 采用标准的linux 框架,提供硬件的watchdog,上层应用可以设定time out时间,自己来keep alive。

Watchdog默认关闭,可自行决定是否开启。开启建议在主线程中操作,如果在其他线程中操作,watchdog会随着线程的关闭而关闭。


2. KERNEL CONFIG

编译开启 watchdog, 配置好要使用的 config 之后再命令行键入 make menuconfig 进入 kernel 配置界面:

将光标移到上述位置之后,按下空格即可操作:

M 为将 watchdog driver 编译为 ko;

*号为将 watchdog driver 直接编入 kernel。


3. WATCHDOG控制


3.1. 打开WATCHDOG

打开/dev/watchdog设备,watchdog将被启动。

参考代码如下:

int wdt_fd = -1;
wdt_fd = open("/dev/watchdog", O_WRONLY);
if (wdt_fd == -1)
{
    // fail to open watchdog device
}

3.2. 关闭WATCHDOG

参考代码如下:

int option = WDIOS_DISABLECARD;
ioctl(wdt_fd, WDIOC_SETOPTIONS, &option);
if (wdt_fd != -1)
{
    close(wdt_fd);
    wdt_fd = -1;
}

3.3. 设定TIMEOUT

通过标准的IOCTL命令WDIOC_SETTIMEOUT,来设定timeout,单位是second,timeout的时间建议大于5s,参考代码如下:

#define WATCHDOG_IOCTL_BASE 'W'
#define WDIOC_SETTIMEOUT        _IOWR(WATCHDOG_IOCTL_BASE, 6, int)
int timeout = 20;
ioctl(wdt_fd, WDIOC_SETTIMEOUT, &timeout);

3.4. KEEP ALIVE

通过标准的IOCTL命令WDIOC_KEEPALIVE来喂狗,喂狗时间按照设定的timeout来决定,喂狗时间应该比timeout小,参考代码如下:

#define WATCHDOG_IOCTL_BASE 'W'
#define WDIOC_KEEPALIVE       _IOR(WATCHDOG_IOCTL_BASE, 5, int)
ioctl(wdt_fd, WDIOC_KEEPALIVE, 0);