為何一般不建議在中斷中喂狗?
可如果只在主程序喂狗,由于中斷被無意關(guān)斷,那么主程序?qū)嶋H就只干傻喂狗功能,這種不工作也不死的。
所以建議:最好的辦法是主程序和中斷相結(jié)合的方法喂狗,這個(gè)需要根據(jù)實(shí)際程序中斷的特點(diǎn)編寫相應(yīng)的喂狗功能(參考方法:在主循環(huán)內(nèi)判中斷進(jìn)入標(biāo)志(或中斷進(jìn)入次數(shù))再喂狗.)。
如果你沒什么把握的話,還是建議只在主程序喂狗
而"中斷喂狗論"恰恰就是利用了這個(gè)"理論依據(jù)"!!!
中斷一般都有自己固定不變的中斷向量地址,這樣即使主程序飛,中斷也能正確地跳入自己的軌道繼續(xù)運(yùn)行.
如果每個(gè)其他事件即程序模塊都設(shè)置一個(gè)"執(zhí)行標(biāo)志",即執(zhí)行過后都設(shè)置此標(biāo)志.
那么,在定時(shí)(節(jié)拍)中斷中,可以從這些"執(zhí)行標(biāo)志"掌握程序的運(yùn)行狀況,達(dá)到檢控的目的.
若全部模塊正常運(yùn)行,則清除全部標(biāo)志,否則,進(jìn)行硬件復(fù)位(不喂狗)或軟件復(fù)位(在沒硬件看門狗時(shí)或需要立即復(fù)位時(shí)).
由于各模塊的運(yùn)行周期不定,喂狗中斷可以靈活掌握.
"中斷喂狗論"和"主程序應(yīng)答喂狗論"(不同于亂喂)效果基本相同,都能達(dá)到同樣的目的,但是它的喂狗周期不定,在低功耗的系統(tǒng)中,主循環(huán)的喂狗檢測較耗電.
而且主循環(huán)飛后只能期待硬件看門狗的復(fù)位了,故一般用在有硬件看門狗的系統(tǒng)中.而前者可用于有無硬件看門狗的系統(tǒng)中(當(dāng)然要保證定時(shí)器及中斷不能被關(guān)閉,一般在主循環(huán)中刷新中斷配置較好).
當(dāng)然,"中斷喂狗論"要耗損一些在中斷中的時(shí)間,但在定時(shí)(節(jié)拍)中斷中,是很短暫的,基本不影響系統(tǒng)的性能.
再駁"主程序喂狗論"
主程序活著比死了更難受!!!
所以沒有"雙向應(yīng)答"機(jī)制的主程序強(qiáng)喂狗方式還是有漏洞的.
由于中斷被無意關(guān)斷,那么主程序?qū)嶋H就只干傻喂狗功能,這種不工作也不死的
程序要它何用???
所以我喜歡在主循環(huán)內(nèi)刷新中斷標(biāo)志,即再次打開自己所需的全部中斷.
在主循環(huán)內(nèi)判中斷進(jìn)入標(biāo)志(或中斷進(jìn)入次數(shù))再喂狗.
或在主循環(huán)內(nèi)設(shè)置主循環(huán)內(nèi)駐留標(biāo)志(表示中斷是從主循環(huán)跳入的),再在中斷中
"主程序不飛可是中斷被關(guān)斷"將會如何???
一般是定時(shí)中斷(或OS的節(jié)拍中斷)中喂狗,因?yàn)檫@種喂狗發(fā)生喂狗時(shí)間恒定,狗不得胃病.
中斷中喂狗后清除那個(gè)主循環(huán)內(nèi)駐留標(biāo)志,這樣:
1.如果主程序飛,則定時(shí)中斷照常工作時(shí),將收不到那個(gè)主循環(huán)內(nèi)駐留標(biāo)志,則不喂狗(硬件看門狗),若無硬件看門狗,則定時(shí)中斷數(shù)次后,強(qiáng)行軟件復(fù)位!!!(起到了軟件看門狗的作用)
2.若主程序不飛,且主循環(huán)強(qiáng)制刷新中斷標(biāo)志,一般都能定時(shí)中斷,即使不能中斷,
則系統(tǒng)得不到喂狗,則硬件看門狗動作,系統(tǒng)復(fù)位.
從上2種情況分析,中斷喂狗的好處還能兼職軟件看門狗的作用!!!
評論