嵌入式系統的Watchdog

Introduction

   Watchdog,又名看門狗,光聽名字就知道是保衛系統的可靠幫手,它相當於系統警察,當系統發生嚴重錯誤(比如程序跑飛或進入死循環等)不能恢復的時候,能夠讓系統重啓。

   看門狗最初的意義是因爲早期嵌入式設備上的程序經常跑飛(比如說電磁干擾等),爲了避免系統在無人干預時長時間掛起,所以專門設置了一個硬件看門狗,每隔一段時間,看門狗就去檢查某個參數是不是被設置了,如果發現該參數被設置了,則判斷爲系統出錯,然後強制重啓。

   另外,它又叫 watchdogtimer(WDT),即一個定時器電路, 一般有一個輸入,叫喂狗(feed),一個輸出到MCU(微控制單元 Microcontroller Unit,俗稱單片機)的RST端,MCU正常工作的時候,每隔一段時間輸出一個信號到喂狗端,給 WDT 清零,如果超過規定時間不喂狗(一般在程序跑飛時),WDT 定時超過,就會給出一個復位信號到MCU,使MCU復位. 防止MCU死機. 從而使嵌入式系統可以在無人狀態下實現連續工作。

How to work?

  Watchdog在實現上可以是硬件電路也可以是軟件定時器,能夠在系統出現故障時自動重新啓動系統。

  在比較高檔的嵌入式硬件芯片中,都有一個Watchdog模塊,如果在MCU/MPU中沒有集成Watchdog,一般會在此嵌入式系統中加一個專門的Watchdog芯片(常用的WDT芯片如MAX813 ,5045, IMP 813等)來實現Watchdog機制。此模塊主要的功能包括:  
1. 提供WATCHDOG控制寄存器和配置寄存器,供軟件開發人員根據系統需要進行靈活配置。
2. 提供一接口,使應用軟件能夠定時給WATCHDOG“喂狗”。
3. 提供WATCHDOG機制,當系統進入不可恢復錯誤時,能產生一個不可屏蔽中斷來通知系統自動重啓     (一般這樣,也有改變爲其他處理方式的),只有相應的復位信號才能清除它。

如果是單獨的watchdog芯片,則,
1. 芯片和單片機的一個I/O引腳相連,該I/O引腳通過程序控制它定時地往看門狗的這個引腳上送入高電平(或低電平);
2. 如果單片機一旦跑飛或陷入死循環狀態,看門狗電路就會由於得不到嵌入式系統送來的信號,便在它和單片機復位引腳相連的引腳上送出一個復位信號,使單片機發生復位。

HW WDT and SW WDT:

硬件watchdog(由硬件電路支持)比軟件watchdog(一般是通過定時器機制實現)有更好的可靠性。 軟件watchdog基於內核的定時器實現,當內核或中斷出現異常時,軟件watchdog將會失效。而硬件watchdog由自身的硬件電路控制, 獨立於內核。無論當前系統狀態如何,硬件watchdog在設定的時間間隔內沒有被執行寫操作,仍會重新啓動系統

在Linux 內核下, 自帶一個watchdog的實現,用於監視系統的運行,它的基本工作原理是:當watchdog啓動後(即/dev/watchdog 設備被打開後),如果在某一設定的時間間隔內/dev/watchdog沒有被執行寫操作, 硬件watchdog電路或軟件定時器就會重新啓動系統。 /dev/watchdog 是一個主設備號爲10, 從設備號130的字符設備節點。 Linux內核不僅爲各種不同類型的watchdog硬件電路提供了驅動,還提供了一個基於定時器的純軟件watchdog驅動。 驅動源碼位於內核源碼樹drivers\char\watchdog\目錄下。

Sample code flow:

Wdt_config() {
	// config the timer register
   // enable the mdode register
  // enable WDT irq
}
wdt_cb(){
 // feed watchdog or reset the system
}
Wdt_register_timerout_handler(wdt_cb);
Wdt_enable();

The Ending

WATCHDOG在嵌入式系統中發揮着非常重要的作用,其實現方式會有較大差別。可以根據不同的硬件設計,可以選用不同的看門狗實現,但它們的作用是一樣的:保證系統在出現不可恢復錯誤時,能夠自動讓系統重啓。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章