zl程序教程

您现在的位置是:首页 >  系统

当前栏目

扩展知识点----Linux中看门狗应用编程

2023-09-14 09:13:24 时间

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系统下都会有常用硬件的驱动节点,直接调用即可控制硬件。