嵌入式开发之看门狗

2019-07-13 00:08发布

linux嵌入式系统开发之看门狗—-应用篇。

2014年10月30日 ⁄ 综合 ⁄ 共 4027字 ⁄ 字号    ⁄ 评论关闭 开始今天的课程----linux嵌入式系统开发之看门狗----应用篇。   话说这个看门狗,还真是形象。什么个意思呢?就是一直“狗”它会盯着系统的定时器,如果定时器的时间值到了,你还没有喂它东西的话,它肯定就不爽了,就把你的系统重启,惩罚一下你,为啥这么久了不喂它东西吃。所以嘛,为了保持系统正常运行,就要在定时器到之前不断的喂它东西吃,贿赂一下它。    回到这个程序,为了不是看门狗叫(重启咱们的电脑),就不断地要从终端输入字符来喂狗(清空定时器,让计时值总是从0开始计数),这样的话,就可以保持狗不会饥饿,也就不会重启我们的电脑了。不多说了,咱们结合代码来详细介绍。 必要的头文件#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include 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 ");
         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 ",wi.options,wi.identity);
     //读看门狗溢出时间,默认是5s
     //重新设置时间为10s
     i=5;
     printf("%d ",ioctl(fd,WDIOC_SETTIMEOUT,&i));
     //读新的设置时间
      printf("%d ",ioctl(fd,WDIOC_GETTIMEOUT,&i));
     printf("%d ",i); 
     //看门狗开始和停止工作,打开和关闭设备具有同样的功能
     //关闭
      i=WDIOS_DISABLECARD;
     printf("%d ",ioctl(fd,WDIOC_SETOPTIONS,&i));
     //打开
      i=WDIOS_ENABLECARD;
     printf("%d ",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; }

(转)Linux 看门狗原理

主板上提供一个可按分或秒计时的,最长达255级的可编程看门狗定时器,WDT超时事件发生时系统复位.
本程序(w83627hf_wdt.c)是基于Winbond83627芯片的看门狗驱动程序.
驱动程序接口
wdt_open :打开设备,应用程序调用open时进入该函数.
wdt_close :关闭设备,应用程序调用close时进入该函数
wdt_write :写设备,若传入数据大小不为0则喂狗;应用程序调用write时进入该函数.
wdt_ioctl :应用程序调用ioctl时进入该函数,通过传入不同的参数实现不同的功能.主要参数如下:
WDIOC_GETSUPPORT :获取看门狗信息watchdog_info(见w83627hf_wdt.h)
WDIOC_KEEPALIVE :喂狗,同write函数功能类似
WDIOC_SETTIMEOUT :设置超时值
WDIOC_GETTIMEOUT :获取超时值
WDIOC_SETOPTIONS:设置看门狗状态,开启(WDIOS_ENABLECARD)或关闭(WDIOS_DISABLECARD)
应用程序编写
主要步骤如下(请参考代码w83627hf_test.c):
1、打开设备
调用open方法,返回值为已打开的设备,若小于0表示打开失败,以下的调用都要用该返回值做参数,表示操作该设备.
        wdt = open(WDT_DEVICE, O_RDWR);
2、开启看门狗
调用ioctl方法,传入WDIOC_SETOPTIONS参数,设置开启(WDIOS_ENABLECARD)状态,方法如下:
        ioctl(wdt, WDIOC_SETOPTIONS, WDIOS_ENABLECARD);
3、设置看门狗超时值(可选,默认为60s)
调用ioctl方法,传入WDIOC_SETTIMEOUT参数,设置指定的超时值.
        ioctl(wdt, WDIOC_SETTIMEOUT, &timeout);//timeout为超时值
4、喂狗
一般用while(1)循环在超时时间(timeout)内定时喂狗,若在timeout内没喂狗,则系统复位.提供2种喂狗方法:
(1) 调用write方法,注意传入参数大小不要为0.
         write(wdt, &arg, sizeof(arg));//若sizeof(arg)为0则不会喂狗
(2)调用ioctl方法,传入WDIOC_KEEPALIVE参数
        ioctl(wdt, WDIOC_KEEPALIVE,0);//第3个参数驱动不用
5、关闭看门狗
若不需要使用看门狗,则关闭它,注意关闭后即使超时值到也不会复位.调用ioctl方法实现,传入WDIOC_SETOPTIONS参数,设置关闭状态
         ioctl(wdt, WDIOC_SETOPTIONS, WDIOS_DISABLECARD)
6、关闭设备
调用close方法.
         close(wdt);