Linux下看门狗/dev/watchdog使用方法
文章目录前言看门狗实现代码总结前言在嵌入式Linux环境中,SOC通常都集成有硬件看门狗,可跨不同厂家使用;在ubuntu系统使用下面的代码则需要加载softdog,才能出现/dev/watchdog;// 使能ubuntu看门狗sudo modprobe softdog看门狗实现代码watch_dog.c#include <errno.h>#include <linux/wat
·
前言
在嵌入式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;
}
总结
在遇到应用程序出现异常退出时,使用硬件看门狗可以让系统快速复位。
更多推荐
已为社区贡献1条内容
所有评论(0)