(a40i)嵌入式Linux 看門狗使用

簡(jiǎn)介

? ? ? ? 嵌入式系統(tǒng)或設(shè)備中凡纳,如果發(fā)生故障(宕機(jī))疏虫,無法及時(shí)對(duì)故障作出反應(yīng)。為了使系統(tǒng)在異常情況下能自動(dòng)恢復(fù)特石,一般都會(huì)引入看門狗盅蝗。
? ? ? ? 看門狗電路是一種電子計(jì)時(shí)器,其用于檢測(cè)和恢復(fù)設(shè)備故障姆蘸。當(dāng)看門狗啟動(dòng)后墩莫,計(jì)數(shù)器開始自動(dòng)計(jì)數(shù),經(jīng)過一定時(shí)間計(jì)數(shù)器溢出就會(huì)對(duì)CPU產(chǎn)生一個(gè)復(fù)位信號(hào)使系統(tǒng)重啟逞敷。系統(tǒng)正常運(yùn)行時(shí)狂秦,需要在看門狗允許的時(shí)間間隔內(nèi)對(duì)看門狗計(jì)數(shù)器清零也即喂狗,不讓復(fù)位信號(hào)產(chǎn)生推捐。
? ? ? ? 看門狗是 Linux 系統(tǒng)一個(gè)重要的機(jī)制裂问,其目的是監(jiān)測(cè)系統(tǒng)運(yùn)行的情況,一旦出現(xiàn)鎖死牛柒,死機(jī)的情況堪簿,能及時(shí)重啟設(shè)備。

開發(fā)環(huán)境介紹

  • 主機(jī)操作系統(tǒng):Ubuntu14.04 64位
  • 目標(biāo)平臺(tái):A40I (ARM Cortex-A7)
  • 交叉工具鏈:arm-linux-gnueabi皮壁,gcc5.3.1
  • 內(nèi)核版本:3.10

使能看門狗驅(qū)動(dòng)

Step1. start the Linux Kernel Configuration tool:
make ARCH=arm menuconfig
Step2. Select Device Drivers from the main menu.
...                                                                                        
 Device Drivers  --->                                                          
 File systems  --->                                                           
...
Step3. Select Watchdog Timer Support as shown here:
...
 [*] Watchdog Timer Support  --->                                                  
         Sonics Silicon Backplane  --->  
...
Step4. Select SUNXI Watchdog as shown here:
--- Watchdog Timer Support 
[*]   WatchDog Timer Driver Core
[*]   Disable watchdog shutdown on close
< >   Software watchdog 
<*>   SUNXI Watchdog

[Disable watchdog shutdown on close]選項(xiàng):當(dāng)編譯內(nèi)核的時(shí)候這個(gè)選項(xiàng)被設(shè)置為Y椭更,則一旦watchdog被啟動(dòng),則將沒有辦法能夠停止蛾魄。這樣虑瀑,則當(dāng)watchdog守護(hù)進(jìn)程崩潰的時(shí)候,系統(tǒng)仍將在超時(shí)后重啟畏腕。

Step5. 添加設(shè)備樹節(jié)點(diǎn)
    wdt: watchdog@01c20ca0 {
         compatible = "allwinner,sun4i-wdt";
         reg = <0x0 0x01c20c90 0 0x18>;
     };

compatible屬性需要根據(jù)驅(qū)動(dòng)中來:

static const struct of_device_id sunxi_wdt_dt_ids[] = {
    { .compatible = "allwinner,sun4i-wdt", .data = &sun4i_wdt_reg },
    { .compatible = "allwinner,sun6i-wdt", .data = &sun6i_wdt_reg },
    { .compatible = "allwinner,sun8i-wdt", .data = &sun6i_wdt_reg },
    { .compatible = "allwinner,sun50i-wdt", .data = &sun6i_wdt_reg },
    { /* sentinel */ }
};

應(yīng)用測(cè)試

? ? ? ? 通常一個(gè)用戶空間守護(hù)進(jìn)程會(huì)在正常的時(shí)間間隔內(nèi)通過/dev/watchdog特殊設(shè)備文件來通知內(nèi)核的watchdog驅(qū)動(dòng)缴川,用戶空間仍然正常。當(dāng)這樣的一個(gè)通知發(fā)生時(shí)描馅,驅(qū)動(dòng)通常會(huì)告訴硬件watchdog一切正常把夸,然后watchdog應(yīng)該再等待一段時(shí)間來復(fù)位系統(tǒng)。如果用戶空間出問題(RAM錯(cuò)誤铭污,內(nèi)核bug等)恋日,則通知將會(huì)停止,然后硬件watchdog將在超時(shí)后復(fù)位系統(tǒng)嘹狞。

? ? ? ? 所有的設(shè)備驅(qū)動(dòng)都支持的基本的操作模式岂膳,一旦/dev/watchdog被打開,則watchdog激活磅网,并且除非喂狗谈截,否則將在一段時(shí)間之后重啟,這個(gè)時(shí)間被稱為timeout或margin。最簡(jiǎn)單的喂狗方法就是寫一些數(shù)據(jù)到設(shè)備簸喂。

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <linux/watchdog.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <limits.h>

#define WATCHDOGDEV "/dev/watchdog0"
#define MIN_TIMEOUT 1   //(in secs)
#define MAX_TIMEOUT 16  //(in secs)
#define MIN_SLEEP   1   //(in secs)

#define IN_RANGE(val, max, min) \
    ((val) < (min) ? (min) : ((val) > (max) ? (max) : (val)))

void print_usage(FILE * stream, const char *app_name, int exit_code);

int main(int argc, const char *argv[])
{
    int fd = -1;    /* File handler for watchdog */
    int timeout;    /* Watchdog timeout interval (in secs) */
    int sleep_sec;  /* Feed the dog time(in secs) */
    int mode = 0;       /* Feed the dog way */
    
    if (argc < 3) {
        print_usage(stdout, argv[0], EXIT_FAILURE);
        return 1;
    }
    
    timeout = IN_RANGE(atoi(argv[1]), MAX_TIMEOUT, MIN_TIMEOUT);
    sleep_sec = IN_RANGE(atoi(argv[2]), INT_MAX, MIN_SLEEP);
    mode = atoi(argv[3]);
    printf("Starting wdt_driver (timeout: %d, sleep: %d, mode: %s)\n",
           timeout, sleep_sec, (mode == 0) ? "ioctl" : "write");
    
    /*打開設(shè)備文件*/
    fd = open(WATCHDOGDEV, O_WRONLY);
    if (fd == -1) {
        perror("watchdog");
        exit(EXIT_FAILURE);
    }
    
    printf("Trying to set timeout value=%d seconds\n", timeout);
    ioctl(fd, WDIOC_SETTIMEOUT, &timeout);
    printf("The actual timeout was set to %d seconds\n", timeout);
    ioctl(fd, WDIOC_GETTIMEOUT, &timeout);
    printf("Now reading back -- The timeout is %d seconds\n", timeout);
    
    while (1) 
    {
        if ( 0==mode ) {
            //使用ioctl()方法喂狗
            ioctl(fd, WDIOC_KEEPALIVE, 0); 
        } else {
            //使用write()方法喂狗
            write(fd, "\0", 1);           
        }
        
        sleep(sleep_sec);
    }
    return 0;
}

void print_usage(FILE * stream, const char *app_name, int exit_code)
{
   fprintf(stream, "Usage: %s <timeout> <sleep> <mode> \n", app_name);
   fprintf(stream,
      "     timeout:    value in seconds to cause wdt timeout/reset.\n"
      "     sleep  :    value in seconds to service the wdt.\n"
      "     mode   :    0 - Service wdt with ioctl(), 1 - with write() \n"
      "  The default device file is '/dev/watchdog0'\n");
 
   exit(exit_code);
}

備注:應(yīng)用層上毙死,dev/watchdog 下會(huì)有watchdog 和 watchdog0;代表的是同一個(gè)硬件喻鳄,即使他們的字符設(shè)備的major和minor 不一樣扼倘。(之所以要注冊(cè)/dev/watchog 是為來兼容老的接口)



參考:
https://processors.wiki.ti.com/index.php/AM335x_PSP_WDT_Driver_User_Guide
https://embeddedfreak.wordpress.com/2010/08/23/howto-use-linux-watchdog/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市除呵,隨后出現(xiàn)的幾起案子再菊,更是在濱河造成了極大的恐慌,老刑警劉巖颜曾,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纠拔,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡泛豪,警方通過查閱死者的電腦和手機(jī)绿语,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來候址,“玉大人,你說我怎么就攤上這事种柑「诼兀” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵聚请,是天一觀的道長(zhǎng)荠雕。 經(jīng)常有香客問我,道長(zhǎng)驶赏,這世上最難降的妖魔是什么炸卑? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮煤傍,結(jié)果婚禮上盖文,老公的妹妹穿的比我還像新娘。我一直安慰自己蚯姆,他們只是感情好五续,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著龄恋,像睡著了一般疙驾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上郭毕,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天它碎,我揣著相機(jī)與錄音,去河邊找鬼。 笑死扳肛,一個(gè)胖子當(dāng)著我的面吹牛傻挂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播敞峭,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼踊谋,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了旋讹?” 一聲冷哼從身側(cè)響起殖蚕,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沉迹,沒想到半個(gè)月后睦疫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鞭呕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年蛤育,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片葫松。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瓦糕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出腋么,到底是詐尸還是另有隱情咕娄,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布珊擂,位于F島的核電站圣勒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏摧扇。R本人自食惡果不足惜圣贸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扛稽。 院中可真熱鬧吁峻,春花似錦、人聲如沸在张。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瞧掺。三九已至耕餐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辟狈,已是汗流浹背肠缔。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工夏跷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人明未。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓槽华,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親趟妥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子猫态,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容