歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

嵌入式系統中看門狗概述

一直以來對於嵌入式中的watch dog(看門狗)都比較陌生,一直都不知道它到底是做什麼的,單從名字上看也不知其所以然,然後就在網上找到了一篇blog,就是再說看門狗的作用和概述,原文如下:

 1、概述:

      WATCHDOG對於沒有底層開發經驗的開發人員來說,可能比較陌生,但是它在系統起到非常重要的作用,相當於系統警察,當系統發生嚴重錯誤(如程序進入死循環等)不能 恢復的時候,WATCHDOG能夠讓系統重啟。WATCHDOG的應用主要是在嵌入式操作系統中,避免了系統在無人干預時長時間掛起的情況。

 2、WATCHDOG模塊

      在比較高檔的嵌入式硬件芯片中,都有一個WATCHDOG模塊,如果在MCU/MPU中沒有集成WATCHDOG,一般會在此嵌入式系統中加一個專門的WATCHDOG芯片來實現WATCHDOG機制。此模塊主要的功能包括:

      1、提供WATCHDOG控制寄存器和配置寄存器,供軟件開發人員根據系統需要進行靈活配置。

      2、提供一接口,使應用軟件能夠定時給WATCHDOG“喂狗”。

      3、提供WATCHDOG機制,當系統進入不可恢復錯誤時,能產生一個不可屏蔽中斷來通知系統自動重啟(一般這樣,也有改變為其他處理方式的),只有相應的復位信號才能清除它。

 3、WATCHDOG的實現方式:

      對於WATCHDOG模塊的實現,不同的硬件芯片有不同的方式,這裡介紹2中工作方式:

      1、利用系統操作系統時鐘來實現WATCHDOG

      在Intel XScale系列中,利用了操作系統時鐘的比較寄存器3(OSMR3)做為WATCHDOG的運行主體,當系統的WATCHDOG激活後,軟件就必須在一定時間內從OSMR3讀出當前的計數,然後加上一定的計數值(下一次到期的計數值),再寫回到OSMR3中,軟件一直周期性的重復這個過程,如果軟件沒有重新寫入新的計數使定時器到期,此OSMR3會利用一個GPIO觸發系統復位。

      2、芯片的專門WATCHDOG模塊

      對於現在的很多芯片,已經集成了專門的WATCHDOG模塊,比如ARM11的芯片,WATCHDOG模塊中,提供了比較靈活的配置和控制機制:

      A、寬范圍設置過期時間間隔,從0。5秒到128秒可以用戶配置

      B、可以靈活配置在低功耗下,使用或者停止WATCHDOG功能

      C、可以靈活配置在DEBUG等狀態下,使用或者停止WATCHDOG功能

      根據不同的系統,設置好相應的寄存器,激活WATCHDOG後,需要應用程序周期性的服務WATCHDOG,即我們所說的“喂狗”,對於 WATCHDOG模塊,需要定時向Watchdog Service Register按順序寫入0x5555,0xaaaa.一般 在WATCHDOG模塊中還會提供Watchdog Reset Status Register,從中可以找到復位的具體原因。

      3、單片機的WATCHDOG實現

      許多單片機片內自帶看門狗電路,單片機復位時將片內自帶看門狗電路禁止,只有當程序訪問該電路時,電路啟動。如51系列單片機對SFR中的0A6H 地址順序寫入#01EH、#0E1H;而96系列單片機則對SFR中的0A6H地址順序寫入#1EH、#0E1H;工控主機板上看門狗電路本身並不要求復位後重新啟動,但BIOS在復位後將板上看門狗禁止,啟動和喂狗方法與單片機相同。如研祥的FSC-1713主板,在WatchDog編程狀態,只要執行如下兩條指令:

      outportb(0x2e,0xf6); 

      outportb(0x2f,TIME-OUT-VALUE);

可實現WatchDog的啟停,其中TIME-OUT-VALUE ≠0啟動;TIME-OUT-VALUE =0停止[2] 。能夠用指令禁止看門狗是為了適應用戶程序開發階段的需要,這同時給看門狗啟動和運行失敗留下了後門,在看門狗啟動時或啟動前遇干擾而使程序跑飛,則看門狗啟動失敗,無法行使監控職能。

      4、結論

      WATCHDOG在嵌入式系統中發揮著非常重要的作用,其實現方式也千差萬別,根據不同的硬件設計,可以選用不同的WATCHDOG,但它們的作用是一樣的:保證系統在出現不可恢復錯誤時,能夠自動讓系統重啟。

參考資料:

1.Intel XScale Pocessor Developer's Manual   

2.Arm11 芯片用戶手冊

3.WatchDog失效機理與對策研究

 

      以上就是原文,對我理解看門狗有一定的幫助,也希望能夠幫助大家。

 

 

linux嵌入式系統開發之看門狗---應用篇
“小濤哥,你的這個什麼板子是不是壞了啊,為啥老是重啟,好奇怪啊….”小王好奇的指著我心愛的板子說。

“笨死啦,沒看到嗎, 我昨天化了一上午寫的一個看門狗程序…”我生氣而又無奈的說。

“等等,啥?看門狗?我聽過哈巴狗,牡羊狗,落水狗,流浪狗,還就是沒聽說過你的說的那個啥子 看門狗 ”小王嘴一噘鎖,“哼,你是看我不懂,忽悠我的吧”..

“切,不懂就是不懂,這還就是你沒聽過的 看門狗 ”我故意提高了音調說。

  算啦,也不賣官腔了,開始今天的課程----linux嵌入式系統開發之看門狗----應用篇。

  話說這個看門狗,還真是形象。什麼個意思呢?就是一直“狗”它會盯著系統的定時器,如果定時器的時間值到了,你還沒有喂它東西的話,它肯定就不爽了,就把你的系統重啟,懲罰一下你,為啥這麼久了不喂它東西吃。所以嘛,為了保持系統正常運行,就要在定時器到之前不斷的喂它東西吃,賄賂一下它。

  回到這個程序,為了不是看門狗叫(重啟咱們的電腦),就不斷地要從終端輸入字符來喂狗(清空定時器,讓計時值總是從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;
}
“小王,看清楚了嗎?這就是看門狗的應用程序,可不是你說的什麼流浪狗,哈巴狗”我拍拍小王的頭說。

“看到了,只是感覺沒啥用啊,除了你向我炫耀的左右外..”小王調皮地說道。

“啊!啊! 切,我是怕你不懂,所以就沒怎麼講它的用途和原理,以及實際的應用..”我嚇唬她到,“難的在下一��有關看門狗驅動的編寫上,知道不..”

“嗯..嗯,知道,你啊,一點幽默都不懂..不想跟你說了..”小王生氣的說…

“好了,不跟你耍嘴皮子啦,我還是給你說說這個程序咋用吧..”我不耐煩的說。

  你,這樣,先gcc編譯一下,生成可執行的文件,然後下到板子上運行,這個時候你要小心啦,要不斷的按鍵盤(除了ESC),否則系統就會重啟啦,就像你開始的那樣。哈哈哈…

Copyright © Linux教程網 All Rights Reserved