在惡劣環境中使用的高速微控制器應用的設計人員將使用看門狗定時器來防止軟件失控。DS80C320高速微控制器集成了看門狗定時器,無需外部系統控制監控器。本應用筆記概述了DS80C320看門狗定時器的使用。軟件示例說明了看門狗定時器作為系統監控器的使用,利用適當的復位間隔和長間隔定時器。
介紹
如今,微控制器被用于電噪聲和電磁干擾(EMI)豐富的惡劣環境中。在這樣的環境中,如果系統包含有助于確保正常運行的資源,則非常有益。在許多系統中,驗證正確操作的常用技術是集成看門狗定時器。
看門狗定時器基本上是一種時間測量設備,它與微處理器結合使用或作為微處理器的一部分,能夠使微處理器復位。在設計合理的系統中,當微處理器未正常工作時,看門狗將導致復位,從而消除故障情況。在典型應用中,看門狗定時器配置為在預定時間間隔后復位處理器。如果處理器運行正常,它將在間隔結束前重新啟動監視器。重新啟動后,看門狗將開始計時另一個預定間隔。如果處理器在間隔結束之前未重新啟動監視器,則會發生監視器超時。這會導致處理器被重置。如果系統軟件設計正確,并且沒有硬件故障,則重置將導致系統再次正常運行。當然,復位條件必須是安全狀態。例如,讓磁盤驅動器控制器的重置狀態啟用寫入磁頭是不明智的。
許多系統都是使用外部看門狗定時器設計的。然而,DS80C320無需額外的外部元件。DS80C320內置非常強大的內部看門狗定時器。該看門狗定時器的特性和使用是本應用筆記的主題。
看門狗定時器的一般用途
看門狗定時器的主要應用是作為系統監視器(詳見下一節)。使用看門狗定時器,系統可以設計成非常擅長檢測和糾正失控的微處理器。使用看門狗定時器的系統特別適合檢測位錯誤。瞬時位錯誤可能是由軟內存故障和電磁放電到存儲設備及其接口等原因引起的。這些可能導致數據臨時位極性翻轉進出處理器。當在獲取程序信息時發生這種情況時,微處理器將開始執行錯誤的代碼。潛在地,處理器可以開始執行操作數而不是操作碼。當處理器開始執行此錯誤代碼時,它將無法正確執行重新啟動看門狗的代碼。超時間隔后,看門狗將導致處理器重置。在正確設計的系統中,復位將糾正錯誤。
無論看門狗定時器的功能如何,它都無法解決所有的可靠性問題。有些故障無法通過重置來糾正。例如,看門狗定時器無法防止數據損壞。在其基本形式中,看門狗重新啟動取決于正確的程序執行,并且通常不依賴于數據存儲器中的值。除非數據損壞影響程序流或采取一些額外措施,否則數據損壞不會導致監視器超時。當然,自診斷軟件可以編寫成這樣一種方式,即重新啟動看門狗取決于數據存儲器的驗證。雖然這種方法可能非常有效并且很常見,但詳細討論超出了本文檔的范圍。
另請注意,看門狗定時器無法立即檢測到故障。根據定義,看門狗定時器必須達到預定時間間隔的終點,然后才能重置處理器。這一事實解釋了為什么應該選擇可能的最小超時間隔。這樣,在糾正失控條件之前,將有最短時間到期。
作為系統主管的看門狗
高速微型看門狗定時器最常見的用途是作為系統監控器。雖然它可以以多種不同的方式使用(其中一些將在本文檔中討論),但系統管理程序是最常見的應用程序。在系統管理引擎模式下,如上所述,處理器會定期重新啟動計時器。如果處理器失控,看門狗將不會重新啟動;它將超時,隨后將導致處理器重置。
在高速微型中,看門狗定時器由提供給一系列分頻器的主系統時鐘驅動。分頻器輸出是可選的,并確定超時之間的間隔。當達到超時時,將設置中斷標志,如果啟用,將在 512 個時鐘后發生復位。如果設置了中斷的單個使能位并設置了全局中斷使能,則中斷標志將導致發生中斷。復位和中斷是完全離散的功能,可以確認或 忽略,一起或單獨用于各種應用程序。
將看門狗定時器用作系統監視器時,應使用看門狗的復位功能。如果使用中斷功能,則看門狗的目的將落空。為了解釋,假設系統在看門狗中斷之前執行錯誤的代碼。中斷將通過向量將 CPU 矢量化到中斷服務例程來暫時強制系統重新控制。重新啟動看門狗并通過 RETI 或 RET 退出會使處理器返回到中斷前丟失的位置。通過使用看門狗復位功能,處理器從程序的開頭重新啟動,從而進入已知狀態。
這并不是說DS80C320看門狗的中斷功能對系統監視應用沒有用處。由于復位發生在中斷后512個時鐘,因此可以使用短中斷服務例程在復位發生之前存儲關鍵變量。這可能允許系統在與故障前條件更相似的狀態下恢復正常運行。當然,如果數據是錯誤的根源,則存儲數據而不進行更正將沒有任何好處。對于任何特定系統,所采用的方法取決于系統和所需的可靠性水平。
如上所述,DS80C320中的看門狗定時器由通過一系列分頻器的主系統時鐘驅動。分頻器輸出可由用戶選擇,允許超時為 217, 220, 223或 226時鐘。如果啟用,處理器的重置將在 512 個時鐘之后發生。表1顯示了與不同晶體頻率相關的復位時間間隔。
時鐘 | @1.832兆赫 | @11.059兆赫 | @12兆赫 | @25兆赫 |
217+ 512 | 71.83 毫秒 | 11.90 毫秒 | 10.97 毫秒 | 5.26 毫秒 |
220+ 512 | 572.6 毫秒 | 94.86 毫秒 | 87.42 毫秒 | 41.96 毫秒 |
223+ 512 | 4.58 秒 | 758.6 毫秒 | 699.1 毫秒 | 335.6 毫秒 |
226+ 512 | 36.63 秒 | 6.07 秒 | 5.59 秒 | 2.68 秒 |
可以看出,有一系列可用的超時間隔。選擇的間隔應基于幾個問題。第一個目標是選擇一個間隔,該間隔表示允許處理器失控的最長時間。例如,理想情況下,每 500 毫秒向機械臂發出位置命令的系統不會使用大于此間隔的超時間隔。縮短超時間隔可確保最多向手臂發出一個錯誤命令。
設置監視器超時間隔的另一個主要問題是能夠在系統軟件中找到重新啟動命令。這可能是一個非常復雜的問題,具體取決于系統軟件的性質。最理想的方法是在重新啟動看門狗定時器的系統軟件的單個主循環中有一個位置。通過主程序循環所需的時間將決定所需的超時間隔。
上述方法假定系統軟件流是線性的,足以允許它。有些程序過于復雜,它們的流程過于非線性,無法允許這種方法。使用這樣的程序結構,很難找到看門狗重新啟動的正確點。這個問題的一個可能解決方案是使用DS80C320的看門狗定時器本身來幫助確定適當的重啟位置。此方法使用看門狗的中斷功能,將在下面的部分中詳細介紹。
在某些系統中,軟件太復雜或程序流程變化太大,無法進行完整徹底的分析。可能無法確定監視器重新啟動是否覆蓋了所有程序路徑。在這種情況下,可以使用不同的方法。在這種情況下,可以開發診斷軟件來測試系統。該診斷軟件將定期調用,可能使用看門狗定時器的中斷功能。如果診斷通過,則重新啟動監視器。否則,監視器超時并重置處理器。當然,在這種情況下,測試必須足夠徹底才能有效。給定系統中使用的確切方法可以是上述任何一種,也可以是每種方法的某種組合,視應用而定。
看門狗復位示例
下面顯示了一個簡短的程序,說明了大多數基本的看門狗定時器功能。該程序說明了如何初始化看門狗定時器,以便在超時時導致重置。
該程序說明了DS80C320看門狗定時器的獨特功能之一。更改看門狗操作的軟件必須執行定時訪問操作。定時訪問操作是必須按順序一起執行的一系列步驟;否則,訪問將失敗。示例程序顯示了用于重新啟動監視器并啟用其重置的定時訪問。可以看出,值 0AAh 首先寫入定時訪問寄存器 (TA)。接下來,將值 055h 寫入 TA 寄存器。最后,修改受保護位。這些指令必須按照所示的順序執行,不得中斷才能訪問受保護位。有關定時訪問操作的更多詳細信息,請參閱高速微型用戶指南。受定時訪問過程保護的監視器計時器位是啟用監視器計時器重置 (EWT = WDCON.1) 位、監視器中斷標志 (WDIF = WDCON.3) 位和重新啟動監視器計時器 (RWT = WDCON.0) 位。
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; WD_RST.ASM Program ; ; This program demonstrates the use of the watchdog timer in ; the DS80C320. It uses the timer's reset capability. When ; running, the program sets port 1's pins low to indicate ; the processor is idle waiting for the watchdog to timeout. When ; the watchdog times out, the processor is reset causing the port ; pins to return high. A delay is written into the program so that ; the port pins will be high long enough to be seen if attached to ; LEDs. ; ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ; Reset Vector ; ORG 00h SJMP START ; ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ; Main program body ; ORG 080h ; START: ORL CKCON, #080h ; Set Watchdog timeout period 2**23 ; (approximately 758 mS @ 11.059 MHz) ; ; In a real application, the next three lines would be placed ; at various locations in the program to restart the watchdog ; before it times out. ; MOV TA, #0AAh ; Restart Watchdog timer MOV TA, #055h ; using timed SETB RWT ; access. ; ; MOV TA, #0AAh ; Enable Watchdog timer reset MOV TA, #055h ; using timed SETB EWT ; access. ; ; MOV R1, #0FFh ; Create a delay loop so the port LOOP: MOV R2, #0FFh ; pins are high long enough after DJNZ R2, $ ; a reset to be seen. DJNZ R1, LOOP ; MOV P1, #00 ; P1 = 0, Reset causes P1 = 1 ; MOV PCON, #01h ; Go to idle mode waiting for reset SJMP $ ; ; ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; END
看門狗定時器作為長間隔定時器
高速微型看門狗定時器的一個略有不同的應用是作為長間隔定時器。在此應用中,使用啟用看門狗定時器中斷 (EWDI=EIE.4) 位使能中斷,復位保持禁用狀態。發生超時時,監視器計時器將設置 WDIF 位 (WDCON.3),如果設置了全局中斷啟用位 (EA=IE.7),則會發生中斷。看門狗中斷標志將指示中斷的來源,必須由軟件清除。如上表所示,5 MHz晶體的間隔從26.2 ms到68.25秒不等。此間隔明顯長于使用標準 16 位定時器的任何間隔。
另一個說明看門狗定時器功能的簡短程序如下所示。該程序演示了必須如何初始化看門狗計時器和中斷,以便超時導致 中斷。包括一個簡短的中斷服務例程。
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ; ;WD_INT.ASM Program ; ; This program demonstrates the use of the watchdog timer of ; the 80C320. It uses the timer's interrupt generating capability. ; For purposes of demonstration, the program toggles Port 1's pins ; each time the watchdog's Interrupt Service Routine is entered. ; ; $MODS320 ; ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ; Reset Vector ; ORG 00h SJMP START ; ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ; Watchdog Interrupt Vector ; ORG 063h ; MOV TA, #0AAh ; Restart watchdog timer MOV TA, #055h ; using timed SETB RWT ; access. ; MOV TA, #0AAh ; Clear watchdog interrupt flag MOV TA, #055h ; using timed CLR WDIF ; access. ; CPL A ; Complement port 1 to show the MOV P1, A ; interrupt routine was entered. ; RETI ; Return from interrupt. ; ; ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ; Main program body ; ORG 080h ; START: ORL CKCON, #040h ; Set Watchdog timeout period 2**20 ; (approximately 94.8 mS @ 11.059 MHz) ; MOV TA, #0AAh ; Restart Watchdog timer MOV TA, #055h ; using timed SETB RWT ; access. ; SETB EWDI ; Enable Watchdog Interrupt and SETB EA ; set global interrupt enable ; Here: MOV PCON, #01 ; Go to Idle mode and wait SJMP Here ; After interrupt, go back to idle ; ; ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; END
看門狗定時器作為定位重啟指令的輔助手段
如上所述,在系統軟件中找到看門狗重新啟動指令有時可能很困難。系統軟件的結構及其流程的復雜性決定了任務的難度級別。在DS80C320中,看門狗定時器本身可用于輔助此活動。對此的一般方法是允許監視器引起中斷,并從服務例程中確定中斷在代碼中發生的位置。通過將監視器重新啟動說明放在此點之前,可以確保監視器將在超時之前重新啟動(當軟件流遵循此特定分支時)。重復此過程,直到不再發生監視器中斷。如果程序流是線性的并且不依賴于數據,則系統將按預期運行。
前面的軟件示例提供了執行此功能所需的大多數軟件。但是,作為第一步,應確定所需的最大超時間隔,并為此值修改代碼。與往常一樣,選擇的超時是系統以及允許微失控多長時間的函數。修改軟件以初始化所需的看門狗超時間隔后,應將以下指令添加到中斷服務例程中。它們將使處理器顯示如果未發生中斷將執行的指令的地址。如果這種顯示機制不方便系統實現,可以將地址轉換為ASCII并在其中一個串行端口上輸出。
MOV R0, SP ; Get SP contents MOV P3, @R0 ; Display high address byte DEC R0 ; Point to low address byte MOV P1, @R0 ; Display low address byte SJMP $ ; Stop here
上述說明將堆棧指針的內容移動到 R0,然后用于指向確認中斷時推送到堆棧的數據。此地址反映在中斷未發生的情況下將執行的下一條指令。地址的高字節顯示在端口 3 引腳上,地址的低字節顯示在端口 1 引腳上。如果重新啟動看門狗計時器的指令放在此地址之前,則看門狗將永遠不會超時。
總結
在使用看門狗作為監視器設計系統時,有效的設計必須考慮許多因素。首先,處理器可能失控的最長時間將決定最大看門狗超時期限。確定超時期限后,必須分析系統軟件以確定看門狗重新啟動指令的位置。為了進行有效的設計,應將監視程序重新啟動的次數保持在最低限度,并應考慮錯誤執行重新啟動的可能性。如前所述,某些系統軟件過于復雜或依賴于數據,無法確保看門狗重新啟動涵蓋所有軟件流路徑。這可能要求可能需要自診斷軟件方法。如果存在預期的故障機制,例如周期性EMI突發或電源毛刺,則看門狗超時應考慮此時間段。
要使看門狗復位成為有效的糾錯機制,處理器的復位狀態必須是安全的。在某些應用中,看門狗的中斷功能可用于在復位之前操作數據或堆棧,以確保處理器在復位后正常運行。
通過仔細考慮上述方面,可以使用在非常惡劣的環境中運行的看門狗定時器設計系統。
審核編輯:郭婷
-
處理器
+關注
關注
68文章
19407瀏覽量
231181 -
微處理器
+關注
關注
11文章
2274瀏覽量
82773 -
定時器
+關注
關注
23文章
3255瀏覽量
115368
發布評論請先 登錄
相關推薦
評論