看門狗定時器 (WDT) 是一種硬件,它監視代碼的執行情況,以在軟件崩潰時重置處理器。多年來,嵌入式世界一直在激烈爭論它們的重要性。不少工程師認為 WDT 是不必要的。他們聲稱,更好的解決方案是編寫不會崩潰的固件。這是一種崇高的情操,因為完美是一個崇高而令人欽佩的目標。
然而,很少有產品能達到這樣的質量水平。隨著軟件規模的擴大,即使是對質量毫不妥協的關注也很難達到完美。一個百萬行的程序,如果代碼的正確率達到 99.99%(這個數字遠遠高于絕大多數組織所達到的數字),就會有 100 個潛伏的錯誤。其中任何一個都可能使系統崩潰或更糟——將其置于危險的操作模式。(唉,一般的嵌入式系統只刪除了所有錯誤的 95% 。1
錯誤不是唯一的問題。完美設計和構建的硬件在其上執行完美代碼仍然可能失敗。
宇宙射線越來越多地在數字系統中引起問題。它們主要由來自太空的高能質子組成,可以與 IC 上的晶體管和翻轉位相互作用。在微處理器的早期,這些威脅比今天要小得多,因為工藝幾何尺寸很大——需要大量能量來實現位翻轉。如今,由于 45 nm 的幾何形狀是常規的,而 28 nm 并不少見,并且每年都會出現較小的節點,因此問題變得更加嚴重。
在 1990 年代,IBM 發現一臺典型的計算機每個月每 256 MB 的 RAM 都會遇到一次由宇宙射線引起的錯誤。2從那時起,幾何形狀已經縮小了很多,所以問題可能變得更糟了。
英特爾認為,未來宇宙射線可能會成為越來越多的計算機錯誤來源。他們的專利 7,309,866 使用 MEMS 傳感器來檢測進入的宇宙射線,然后向電路發出信號以采取糾正措施。3
H. Kobayashi 等人。發現宇宙射線和其他粒子的誤差在 180 nm 幾何結構的設備中是 250 nm 幾何結構的兩倍多。4
Tezzaron Semiconductor 2004 年的一篇論文表明,SRAM 和邏輯是宇宙射線擾動的主要受害者。5作者聲稱,具有 1 GB SRAM 的系統每兩周會出現一次軟錯誤,而丹佛的問題比海平面的問題嚴重十倍。
令人驚訝的是,一個只有 10 飛庫侖電荷的粒子有足夠的能量來翻轉 SRAM 位。6十年前,較大的細胞需要五倍的能量。
底線:即使是完美編寫的代碼也可能崩潰。只有看門狗定時器可以幫助崩潰的系統恢復。
出色的 WDT
由于 WDT 是最后一道防線,因此其設計必須預見到任何故障模式。有人可能會問,“偉大的看門狗有什么特點?”
首先,WDT 必須獨立于 CPU。無論處理器發現自己處于何種奇怪模式,看門狗定時器都必須正常工作。此外,一旦在初始化時設置,處理器所做的任何事情都不能禁用或重新編程看門狗。否則,流氓程序可能會意外禁用此保護機制,使其無用。
WDT 必須始終在任何情況下(除非可能出現硬件故障)使系統恢復運行。這意味著向 CPU 發出硬復位。沒有其他選擇可以保證讓崩潰的處理器起死回生。
一些 WDT 發出不可屏蔽的中斷而不是復位。這個想法是 NMI 的服務例程可以對堆棧進行快照并記錄調試信息。唉,沒有理由相信處于任意功能失調模式的 CPU 會響應任何中斷。在調用服務例程之前需要進行大量處理。在許多處理器上,如果堆棧指針具有奇數或未對齊的地址,則不會啟動中斷服務程序;實際上,它們可能會進入雙總線故障模式,其中 CPU 關閉,只有硬復位才能恢復操作。
然而,NMI 方法很有趣。有時使用的一種替代方法是發出 NMI,并啟動計時器。幾毫秒后,計時器將復位 CPU。然后,如果 NMI 服務例程有效,它會記錄調試信息,但不可避免的硬重置可確保設備恢復運行。
當系統控制危險硬件時,看門狗獨立于可能受損的 CPU 將系統置于安全狀態是至關重要的。移動機械、危險輻射等必須禁用、停放或以其他方式脫離,因為如果硬件故障導致處理器崩潰,重置可能無法工作。
當今的嵌入式系統通常具有非常復雜的外圍設備;在某些情況下,I/O 可能比微處理器復雜得多。WDT 復位序列必須確保這些設備恢復到已知狀態。當代碼崩潰時,它可能會向外圍設備發出奇怪的數據流。如果外圍設備的設計使得 CPU 并不總是能夠將設備置于已知的正確狀態,則這些設備需要從 WDT 進行硬復位。
最后,如果可能的話,最好留下調試面包屑。前面提到的 NMI/deferred-reset 就是一個例子。將堆棧和其他關鍵參數保存到開發人員可以訪問的非易失性內存區域中。不幸的是,重置會破壞所有處理器狀態信息,但通常有特定于應用程序的數據可以幫助診斷問題,例如指向狀態機表的指針。在重置后初始化它們之前,請保存它們。如果有實時時鐘,還要保存復位時間。
內部 WDT
看門狗可分為兩大類:處理器芯片上的看門狗和硬件設計人員添加的外部設備。大多數微控制器都有一個內部看門狗,盡管它們的功效差異很大。
一個例子是美心(nee Dallas) DS80C320 / DS80C323,一個 8031 變種,已經存在了很長一段時間。這部分在看門狗中有兩個非常好的功能。首先,可以對其進行編程以產生中斷,但 512 個周期后它將重置 CPU,因此調試面包屑很容易保存。此外,可以限制對 WDT 寄存器的訪問;必須背靠背執行兩個特定的移動指令,然后只有一個三周期的窗口可以進行 WDT 寄存器訪問。這極大地降低了惡意代碼禁用保護機制的機會。然而,人們想知道如果在這些指令之間發生中斷會發生什么。大概不會發生 WDT 訪問,因此無法啟用該功能。顯然,軟件工程師在執行此序列時必須禁用中斷。
飛思卡爾的 MCF520x系列則完全不同。要給看門狗發癢,必須向看門狗服務寄存器發出兩次寫操作,但在這些操作之間可能會發生任意數量的指令。如果 CPU 崩潰并運行隨機代碼,這可能會破壞可靠操作。從好的方面來說,復位狀態寄存器確實記錄了先前的復位是由于外部硬件信號還是由于 WDT 超時,這是重新啟動后記錄錯誤的有用方法。可以對看門狗進行編程以產生復位或中斷;后者是一個非常糟糕的主意。如果堆棧因錯誤或惡意代碼而變得奇怪,系統將進入雙總線故障。中斷不會使 CPU 恢復正常運行;只有重置會。
意法半導體新系列STM32F4Cortex?-M4 CPU 有兩個獨立的看門狗。一個從它自己的內部 RC 振蕩器運行。這意味著各種事情都可能在 CPU 中崩潰,而 WDT 仍然會觸發。還有一個“窗口看門狗”(WWDT),它要求代碼經常對它進行撓癢癢,但不要太頻繁。這是一種非常有效的方法,可以確保隨機寫入保護機制的崩潰代碼不會導致 WDT 抖動,并且 WWDT 可以在復位被斷言之前不久產生中斷。
有趣的是,其中一些部件還包括一個“模擬看門狗”,如果 A/D 的輸入超過編程限制,它會觸發中斷。可以監控電源并檢測掉電。在控制危險硬件的系統中,這種早期警告可用于在電源超出操作限制之前將系統置于安全狀態。Microchip 的
許多PIC24F系列都具有 WWDT,NXP 的一些部件(例如LPC18xx和LPC43xx系列)也是如此。NXP 的部件可以配置為,一旦啟用,軟件就不可能關閉 WDT,從而提供更多保護,防止代碼運行異常。
這些處理器都沒有向外界發出超時發生的信號。如果軟件不能保證正確的重新初始化,設計人員可能必須斷言一個并行 I/O 位來復位外部硬件。
外部 WDT
很少有微處理器(與微控制器相反)具有內部看門狗定時器,而且在許多情況下,內部 WDT 不能提供特定應用所需的可靠性。在這些情況下,設計應該增加外部硬件,以監控系統操作并在需要時發出復位。
在使用兩個或更多 CPU 的系統中,讓每個處理器監視另一個處理器的操作是合理的。
有許多 WDT 芯片可用。通常,它們的操作不受軟件控制,因此崩潰的程序無法禁用它們的功能。此外,它們還在上電期間斷言復位,從而無需這些外部組件。
Maxim 的 MAX6751 是一種外部WWDT。它有一個 WWDT,其超時由電容器控制,如圖 1 所示。
圖 1:MAX6751 的超時時間由一對電容器設置(由 Maxim 提供)。Texas Instruments 的TPS3126 類似于沒有窗口功能的 WWDT。它們適用于各種電源電壓和延遲時間,價格低廉,采用 SOT-23 封裝。圖 2 概述了它們的配置。
圖 2:TI 的 TPS3126 監控電源并具有 WDT(德州儀器提供)。TI 還擁有包括TPS386000
在內的一系列部件,可監控四個獨立的電源軌并包括一個具有固定延遲的 WDT。其中一個電壓監視器可以處理負電源。如果有任何超出公差,則激活單獨的“RESET”輸出。作為開漏,它們可以被線或在一起。或者,可以將這些連接到輸入引腳,以便 CPU 知道哪個電源低,并采取適當的措施,如圖 3 所示
圖 3:TPS386000 監控四個電源(由 Texas Instruments 提供)。
Analog Devices 的ADM699是一款簡單的 WDT,它還可以監控一個電源。圖 4 顯示了它的實現。
圖 4:ADM699 的設計非常簡潔(由 Analog Devices 提供)。
現在一些微處理器對復位輸入非常挑剔,只允許相對較快的轉換速率和信號電平。開漏驅動只能通過使用非常低值的上拉電阻來滿足這些要求,這會增加功耗。ADI 公司有多個組件,例如ADM6316,它們使用推挽輸出來滿足這些嚴格的要求。圖 5 顯示了該部件的框圖。
圖 5:ADM6316 具有推挽式驅動器(由 Analog Devices 提供)。
軟件考慮
如果代碼構造不正確,即使是最好的看門狗電路也只是一個很差的安全機制。唉,在大多數系統中,開發人員在沒有考慮設計的情況下在整個代碼中撒上看門狗的癢癢。
最重要的考慮是確保所有代碼都正確運行,而不僅僅是其中的一部分。因此,永遠不要在中斷服務例程中放置 WDT 滴答聲,也永遠不要將 RTOS 任務用于此活動。如果主代碼使中斷甚至 RTOS 的調度程序崩潰,它可能會繼續運行,因此看門狗永遠不會超時。
在單線程設計中,使用類似狀態機的架構。示例代碼如圖 6 所示。
圖 6:處理非多任務 WDT 的代碼。
這里的主循環首先將變量“state”設置為 0x5555。它調用 wdt_a() 檢查值是否正確;如果沒有,它會停止并且 WDT 重置系統。否則,“狀態”中的值會通過添加偏移量來更改。請注意,看門狗沒有被撓癢癢。
在循環結束時(我們已經執行了所有代碼),再次調整“狀態”并調用 wdt_b()。現在,如果“狀態”沒有正確地循環遍歷它的所有更改——表明我們確實運行了整個循環——代碼停止并且 CPU 被重置。否則看門狗會被觸發并且“狀態”設置為零。請注意,如果代碼崩潰并進入 wdt_b(),“狀態”將不正確并且會發生重置。
在多任務應用程序中,每個任務每次啟動時都會在數據結構中增加一個與任務相關聯的值。低優先級任務偶爾會檢查數據結構并檢查以確保數據合理。如果一個任務經常運行,數量會很大;相反,慢任務的數量會很少。如果一切正常,任務會觸發 WDT,將值歸零,然后返回。否則它會停止并啟動重置。
如果存在代碼無法處理或恢復的異常(例如,被零除或 malloc() 失敗),請編寫一個禁用中斷和暫停的處理程序。看門狗將使系統恢復活力。
結論
看門狗定時器是防止代碼崩潰的最后一道防線,因此必須精心設計和實施。如今,許多微控制器都包含非常復雜的 WDT,并且能夠抵御異常運行的程序的欺騙。或者,使用外部 WDT;可能最安全的選擇是支持窗口化。此外,請仔細構建代碼,以使錯誤的軟件不會落入 tickle 例程中,并防止計時器重置 CPU。
評論
查看更多