嵌入式系统中看门狗概述(2)

话说这个看门狗,还真是形象。什么个意思呢?就是一直“狗”它会盯着系统的定时器,如果定时器的时间值到了,你还没有喂它东西的话,它肯定就不爽了,就把你的系统重启,惩罚一下你,为啥这么久了不喂它东西吃。所以嘛,为了保持系统正常运行,就要在定时器到之前不断的喂它东西吃,贿赂一下它。

回到这个程序,为了不是看门狗叫(重启咱们的电脑),就不断地要从终端输入字符来喂狗(清空定时器,让计时值总是从0开始计数),这样的话,就可以保持狗不会饥饿,也就不会重启我们的电脑了。不多说了,咱们结合代码来详细介绍。

必要的头文件#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <sys/time.h>
#include <unistd.h>
#include <time.h>
#include <getopt.h>
#include <sys/signal.h>
#include <termios.h>


struct watchdog_info{
    unsigned int options;  //options the card/driver supprots 19       
    unsigned int firmware_version;  //firmcard version of the card
    unsigned char identity[32];    //identity of the board 21
 };

#define WATCHDOG_IOCTL_BASE 'W'
#define WDIOC_GETSUPPORT _IOR(WATCHDOG_IOCTL_BASE, 0, struct watchdog_info)
#define WDIOC_SETTIMEOUT _IOWR(WATCHDOG_IOCTL_BASE, 6, int)
#define WDIOC_GETTIMEOUT _IOR(WATCHDOG_IOCTL_BASE, 7, int) 27
#define WDIOS_DISABLECARD 0x0001        /* Turn off the watchdog timer */
#define WDIOS_ENABLECARD 0x0002 /* Turn on the watchdog timer */
#define WDIOC_SETOPTIONS _IOR(WATCHDOG_IOCTL_BASE, 4, int)
#define WDIOC_KEEPALIVE _IOR(WATCHDOG_IOCTL_BASE, 5, int)

int Getch (void)  //无回显的从屏幕输入字符,来达到喂狗的目的
{
    int ch;
    struct termios oldt, newt;  //终端设备结构体
    tcgetattr(STDIN_FILENO, &oldt);  //获得终端属性
    newt = oldt;
    newt.c_lflag &= ~(ECHO|ICANON);  //设置无回显属性
    tcsetattr(STDIN_FILENO, TCSANOW, &newt);  //设置新的终端属性
    ch = getchar();  //从键盘输入一个数据
    tcsetattr(STDIN_FILENO, TCSANOW, &oldt);  //恢复终端设备初始设置
    return ch;
}
 //suspend some seconds
int zsleep(int millisecond)
{
    unsigned long usec;
    usec=1000*millisecond;
    usleep(usec); //睡眠usec秒
}
int Init()
{
    int fd;
    //open device file
    fd = open("/dev/watchdog",O_RDWR);  //打开看门狗设备
      if(fd < 0)
    {
        printf("device open fail\n");
        return -1;
    }
    return fd;
}

int main(int argc,char **argv)
{
    int fd,ch;
    int i,j;
    char c;
    struct watchdog_info wi;
    fd=Init();  //打开终端看门狗设备
    //读板卡信息,但不常用
      ioctl(fd,WDIOC_GETSUPPORT,&wi);
    printf("%d,%s\n",wi.options,wi.identity);
    //读看门狗溢出时间,默认是5s
    //重新设置时间为10s
    i=5;
    printf("%d\n",ioctl(fd,WDIOC_SETTIMEOUT,&i));
    //读新的设置时间
      printf("%d\n",ioctl(fd,WDIOC_GETTIMEOUT,&i));
    printf("%d\n",i);
    //看门狗开始和停止工作,打开和关闭设备具有同样的功能
    //关闭
      i=WDIOS_DISABLECARD;
    printf("%d\n",ioctl(fd,WDIOC_SETOPTIONS,&i));
    //打开
      i=WDIOS_ENABLECARD;
    printf("%d\n",ioctl(fd,WDIOC_SETOPTIONS,&i));
    while(1)
    {
          zsleep(100);
          if((c=Getch())!=27){
                //输入如果不是ESC,就喂狗,否则不喂狗,到时间后系统重启
                ioctl(fd,WDIOC_KEEPALIVE,NULL);
                //write(fd,NULL,1);    //同样是喂狗
          }
    }
    close(fd);  //关闭设备
    return 0;
}
“小王,看清楚了吗?这就是看门狗的应用程序,可不是你说的什么流浪狗,哈巴狗”我拍拍小王的头说。

“看到了,只是感觉没啥用啊,除了你向我炫耀的左右外..”小王调皮地说道。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/b2fc6c9804e4c8c7a52150c468171ff3.html