1、在嵌入式产品中,为了方便Linux操作系统在异常情况下,能够自动复位,一般需要引入看门狗。看门狗其实就是在一定的时间内被复位的计数器。当看门狗启动后,计数器开始自动计数,如果计数器溢出就会产生CPU产生一个复位信号使得系统重启--俗称被狗咬。如果在一定的时间内对看门狗及时喂狗,不产生复位信号。
2、正常的Linux开发板中,都会集成看门狗定时器:WDOG1 普通的看门狗,支持产生中断信号或者复位CPU。 相应的设备节点在对应的路径下为:/dev/watchdog0 /dev/watchdog1等。
3、看门狗应用编程实验代码如下:
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #define WDOG_DEV “/dev/watchdog” int main(int argc,char *argv[]) { struct watchdog_info info; int timeout; int time; int fd; int op; /* 打开看门狗 */ fd = open(WDOG_DEV, O_RDWR); if (0 > fd) { fprintf(stderr, "open error: %s: %s\n", WDOG_DEV, strerror(errno)); exit(EXIT_FAILURE); } /* 打开之后看门狗计时器会开启、先停止它 */ op = WDIOS_DISABLECARD; if (0 > ioctl(fd, WDIOC_SETOPTIONS, &op)) { fprintf(stderr, "ioctl error: WDIOC_SETOPTIONS: %s\n", strerror(errno)); close(fd); exit(EXIT_FAILURE); } timeout = atoi(argv[1]); if (1 > timeout) timeout = 1; /* 设置超时时间 */ printf("timeout: %ds\n", timeout); if (0 > ioctl(fd, WDIOC_SETTIMEOUT, &timeout)) { fprintf(stderr, "ioctl error: WDIOC_SETTIMEOUT: %s\n", strerror(errno)); close(fd); exit(EXIT_FAILURE); } /* 开启看门狗计时器 */ op = WDIOS_ENABLECARD; if (0 > ioctl(fd, WDIOC_SETOPTIONS, &op)) { fprintf(stderr, "ioctl error: WDIOC_SETOPTIONS: %s\n", strerror(errno)); close(fd); exit(EXIT_FAILURE); } /* 喂狗 */ time = (timeout * 1000 - 100) * 1000;//喂狗时间设置 us 微秒、在超时时间到来前 100ms 喂狗 for ( ; ; ) { usleep(time); ioctl(fd, WDIOC_KEEPALIVE, NULL); } }
总结:1、实例的代码很简单,利用参数传进来相应的超时时间,需要传入一个参数作为看门狗超时时间。2、Linux系统下都会有常用硬件的驱动节点,直接调用即可控制硬件。