前言

在嵌入式Linux环境中,SOC通常都集成有硬件看门狗,可跨不同厂家使用;
在ubuntu系统使用下面的代码则需要加载softdog,才能出现/dev/watchdog;

// 使能ubuntu看门狗

sudo modprobe softdog


看门狗实现代码

watch_dog.c

#include <errno.h>
#include <linux/watchdog.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <sys/ioctl.h>

#include "watch_dog.h"

#define DEV_HWDOG   "/dev/watchdog"

int openHWDog(void)
{
    int32_t fd,ret = -1;
    int32_t flags = WDIOS_ENABLECARD;
	fd = open(DEV_HWDOG, O_RDWR);
	if (fd < 0)
	{
		LOGERROR("can't open %s: %s\n",DEV_HWDOG,strerror(errno));
	}

    if ((ret = ioctl(fd, WDIOC_SETOPTIONS, &flags)) < 0)
    {
        LOGERROR("enable hardware dog failed: %d:%d,%s\n",ret,errno,strerror(errno));
        return -1;
    }
/*
    if(ioctl(fd,WDIOC_GETSTATUS,&ret) < 0)
    {
		LOGERROR("hardware dog WDIOC_GETSTATUS failed!\n");
        return -1;
    }
    LOGINFO("WDIOC_GETSTATUS :%d\n",ret);
    */
    return fd;
}

inline void feedHWDog(int32_t fd) 
{
    int dummy;
    if(ioctl(fd,WDIOC_KEEPALIVE,&dummy) < 0)
		LOGERROR("feed hardware dog failed!\n");
    //LOGINFO("WDIOC_KEEPALIVE!\n");
}

int closeHWDog(int32_t fd)
{
    int32_t flags = WDIOS_DISABLECARD;
    if (ioctl(fd, WDIOC_SETOPTIONS, &flags) < 0)
    {
        LOGERROR("close hardware dog failed: %s\n",strerror(errno));
        return -1;
    }

    close(fd);
    return 0;
}

watch_dog.h

#ifndef _WATCH_DOG_H_
#define _WATCH_DOG_H_
#ifdef __cplusplus
extern "C" {
#endif
#include "debug.h"

int openHWDog(void);

void feedHWDog(int32_t fd);

int closeHWDog(int32_t fd);

#ifdef __cplusplus
}
#endif
#endif

简单使用方法如下:

int main(int argc, char **argv)
{
	int32_t s32HWdogFd = 0;

    if((s32HWdogFd = openHWDog()) < 0)
    {
        LOGERROR("openHWDog() Failed!!!\n");
        return -1;
    }
    
    while (1)
    {
        feedHWDog(s32HWdogFd);
        LOGINFO("main loop...\n");
        sleep(1);
    }
    closeHWDog(s32HWdogFd);
    return 0;
}

总结

在遇到应用程序出现异常退出时,使用硬件看门狗可以让系统快速复位。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐