關於watchdog應該有過單片機學習經歷的人。都比較熟悉。但watchdog的正確使用方法,恐怕大家假設沒有經歷過實際產品的開發不會有深入的理解。
瑞薩RL78系列的單片機自身帶有watchdog,當啟用watchdogtimer定時器后。在watchdog timer溢出時間間隔的75%會產生watchdog中斷。
至於在watchdog中做什么。好多演示樣例程序。都會在中斷處理函數中喂狗。使watchdog timer又一次開始計時。
實際的喂狗程序應該在watchdog的中斷處理函數中嗎?假設在,有什么樣的效果?假設不應該在,喂狗程序應該放在哪兒,中斷處理函數中又應該做什么?以下一一來解答。
假如喂狗程序僅僅在watchdog的中斷處理函數中。當然又一次啟動watchdog timer的目的達到了,因為watchdogtimer溢出產生的復位也避免了。
可是,watchdog本身存在的價值已經失去了。Watchdog存在的意義是監測程序中的非法循環以及程序是否跑飛。假設程序已經陷入了非法循環中不能退出,或者程序已經跑飛。Watchdog timer的定時中斷還會正常工作,所以喂狗程序還能夠正常運行。
僅僅是中斷函數運行完之后,程序的返回點還是非法循環,或者是跑飛的非法指令。這個大家能夠在其它MCU中敲代碼,打斷點調試一下。
既然,喂狗程序不能放在watchdogtimer的定時中斷中。應該放在哪兒呢。
首先,來一個知識的正向遷移。watchdog timer的定時中斷運行的機制是全部中斷都遵循的機制,這個中斷的中斷處理函數中喂狗不能達到目的。當然其它定時中斷處理函數中也是一樣的道理。
正確的喂狗程序須要放入main函數的主循環中。喂狗的時間間隔須要考慮主循環全部可能分支耗時最大的那個。
也即,watchdog timer的溢出時間大於全部分支的最大耗時,喂狗時間間隔小於全部分支的最大耗時。
返回到最后一個問題,watchdog timer定時中斷的中斷處理程序應該做些什么。和普通定時器的使用方法一樣,提供一個較為精確的定時時間間隔。
比方在ucosII向RL78/G14的移植中。能夠將watchdog timer定時中斷作為操作系統的時鍾節拍。