關於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定時中斷作為作業系統的時鐘節拍。
ISNULL 的正確用法
語法 isnull check expression replacement value 備註 如果 check expression 不為 null,則返回它的值 否則,在將 replacement value 隱式轉換為 check expression 的型別 如果這兩個型別不同 後,則返回前...
memset 的正確用法
memset 位於標頭檔案string.h中,用法是將乙個位元組乙個位元組的設定為某個數.例如 memset a,0,sizeof a a為陣列,就是將a中的每乙個位元組都賦值為0。以前沒有正確理解memset 的用法,將陣列賦值為1時,用memset a,1,sizeof a 導致出現很怪的數字。...
getch sleep 函式的正確用法
前段時間由於需要,寫了一段 用到了函式 getch 但是當時出錯了,提示該識別符號未被定義,一時無解。後來又有乙個朋友,問我怎麼將乙個字串中的字元以一種動態的方式進行輸出,我當時告訴他的是使用 sleep 函式,也沒有細想,後來發現,根本不存在 sleep 這個函式。這個糗可是出大發了!在很多的官方...