|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
為何一般不建議在中斷中喂狗? |
| 作者:真水無香 欄目:單片機 |
在網(wǎng)站中看到很多大俠的帖子,都是建議不要在中斷程序中喂狗,小弟不知其中緣由? 我的程序流程是這樣的 程度首先初始化,在初始化中打開看門狗(使用GCC) wdt_reset(); wdt_enable(WDTO_2S); 然后進入while循環(huán) 在RTC秒中斷中喂狗 wdt_reset(); 不知,這樣有何缺陷,請各位幫忙提提看法,謝謝 順便問一下 關(guān)看門狗使用一下語句可以嗎? wdt_reset(); wdt_disable(); |
| 2樓: | >>參與討論 |
| 作者: apad 于 2006/3/2 11:46:00 發(fā)布:
程序跑飛了可是中斷不一定會死 假如主程序跑飛了,陷在某處,可是中斷正常,比如定時器,這時應(yīng)該看門狗復(fù)位才是,可是…… |
|
| 3樓: | >>參與討論 |
| 作者: NE5532 于 2006/3/2 20:15:00 發(fā)布:
白喂 |
|
| 4樓: | >>參與討論 |
| 作者: hanyafeng 于 2006/3/3 17:03:00 發(fā)布:
就是 請在運行等級最低的程序中喂狗,一般是主程序中。系統(tǒng)中,我認為一般是定時器中斷響應(yīng)程序,因為它是最經(jīng)常運行的部分,其他進程都是在時隙中運行。 |
|
| 5樓: | >>參與討論 |
| 作者: computer00 于 2006/3/3 18:47:00 發(fā)布:
狗在外面有吃的了,它回到家之后還會餓嗎? |
|
| 6樓: | >>參與討論 |
| 作者: pheavecn 于 2006/3/3 20:16:00 發(fā)布:
赫赫,我都是中斷中喂。 但是中斷中喂狗前會檢測一個主程序設(shè)置的標志。 這樣保證兩個都不死。 |
|
| 7樓: | >>參與討論 |
| 作者: hotpower 于 2006/3/3 21:56:00 發(fā)布:
還是pheavecn和菜農(nóng)的狗論相同呀 "程序跑飛了可是中斷不一定會死" 為什么不想:"中斷中喂狗前會檢測一個主程序設(shè)置的標志" |
|
| 8樓: | >>參與討論 |
| 作者: pheavecn 于 2006/3/3 21:59:00 發(fā)布:
這個叫“連坐”。 |
|
| 9樓: | >>參與討論 |
| 作者: hotpower 于 2006/3/3 22:02:00 發(fā)布:
哈哈,何處喂狗不要緊,關(guān)鍵要"雙向應(yīng)答"... |
|
| 10樓: | >>參與討論 |
| 作者: computer00 于 2006/3/3 23:15:00 發(fā)布:
那還不是一樣了…………既然要設(shè)置標志,還不如去喂狗…… 等于說,告訴鄰居,你要記得幫我喂狗噢……如果有一天沒有告訴鄰居,那么狗就回來咬主人了…… |
|
| 11樓: | >>參與討論 |
| 作者: hotpower 于 2006/3/4 9:02:00 發(fā)布:
再駁"主程序喂狗論" 主程序活著比死了更難受!!! 所以沒有"雙向應(yīng)答"機制的主程序強喂狗方式還是有漏洞的. 由于中斷被無意關(guān)斷,那么主程序?qū)嶋H就只干傻喂狗功能,這種不工作也不死的 程序要它何用??? 所以我喜歡在主循環(huán)內(nèi)刷新中斷標志,即再次打開自己所需的全部中斷. 在主循環(huán)內(nèi)判中斷進入標志(或中斷進入次數(shù))再喂狗. 或在主循環(huán)內(nèi)設(shè)置主循環(huán)內(nèi)駐留標志(表示中斷是從主循環(huán)跳入的),再在中斷中 "主程序不飛可是中斷被關(guān)斷"將會如何??? 一般是定時中斷(或OS的節(jié)拍中斷)中喂狗,因為這種喂狗發(fā)生喂狗時間恒定,狗不得胃病. 中斷中喂狗后清除那個主循環(huán)內(nèi)駐留標志,這樣: 1.如果主程序飛,則定時中斷照常工作時,將收不到那個主循環(huán)內(nèi)駐留標志,則不喂狗(硬件看門狗),若無硬件看門狗,則定時中斷數(shù)次后,強行軟件復(fù)位!!!(起到了軟件看門狗的作用) 2.若主程序不飛,且主循環(huán)強制刷新中斷標志,一般都能定時中斷,即使不能中斷, 則系統(tǒng)得不到喂狗,則硬件看門狗動作,系統(tǒng)復(fù)位. 從上2種情況分析,中斷喂狗的好處還能兼職軟件看門狗的作用!!! |
|
| 12樓: | >>參與討論 |
| 作者: hotpower 于 2006/3/4 9:21:00 發(fā)布:
"狗在外面有吃的了,它回到家之后還會餓嗎?"---回復(fù)00 狗吃肉的時候必須有主人在家中(主程序)的令牌,否則貪吃是會誤大事的. 好狗肯定會在沒得到令牌(主人已被敵人干倒)時,自盡殉葬主人的. 就像人酒后駕車一樣的道理. |
|
| 13樓: | >>參與討論 |
| 作者: hotpower 于 2006/3/4 9:56:00 發(fā)布:
"中斷喂狗論"更能掌控"程序制空權(quán)" 在"主程序喂狗論"中,最"強有的理論依據(jù)"就是---"程序跑飛了可是中斷不一定會死" 而"中斷喂狗論"恰恰就是利用了這個"理論依據(jù)"!!! 中斷一般都有自己固定不變的中斷向量地址,這樣即使主程序飛,中斷也能正確地跳入自己的軌道繼續(xù)運行. 如果每個其他事件即程序模塊都設(shè)置一個"執(zhí)行標志",即執(zhí)行過后都設(shè)置此標志. 那么,在定時(節(jié)拍)中斷中,可以從這些"執(zhí)行標志"掌握程序的運行狀況,達到檢控的目的. 若全部模塊正常運行,則清除全部標志,否則,進行硬件復(fù)位(不喂狗)或軟件復(fù)位(在沒硬件看門狗時或需要立即復(fù)位時). 由于各模塊的運行周期不定,喂狗中斷可以靈活掌握. "中斷喂狗論"和"主程序應(yīng)答喂狗論"(不同于亂喂)效果基本相同,都能達到同樣的目的,但是它的喂狗周期不定,在低功耗的系統(tǒng)中,主循環(huán)的喂狗檢測較耗電. 而且主循環(huán)飛后只能期待硬件看門狗的復(fù)位了,故一般用在有硬件看門狗的系統(tǒng)中.而前者可用于有無硬件看門狗的系統(tǒng)中(當(dāng)然要保證定時器及中斷不能被關(guān)閉,一般在主循環(huán)中刷新中斷配置較好). 當(dāng)然,"中斷喂狗論"要耗損一些在中斷中的時間,但在定時(節(jié)拍)中斷中,是很短暫的,基本不影響系統(tǒng)的性能. |
|
| 14樓: | >>參與討論 |
| 作者: BitFu 于 2006/3/4 10:32:00 發(fā)布:
支持中斷中喂狗. |
|
| 15樓: | >>參與討論 |
| 作者: hotpower 于 2006/3/4 10:45:00 發(fā)布:
BitFu的書不錯 我給徒弟買了本讓他自學(xué)... |
|
| 16樓: | >>參與討論 |
| 作者: tinytony 于 2006/3/4 10:51:00 發(fā)布:
提醒一下 外部時鐘或CRYSTAL是可能變慢或停止的,主人沒死,狗可是要關(guān)門的. |
|
| 17樓: | >>參與討論 |
| 作者: hotpower 于 2006/3/4 12:08:00 發(fā)布:
外部時鐘變慢主人在也無用 一般喂狗都是秒級的,主頻變慢也有間接測試的方法. 假使ADC或PWM及RTC等這些有規(guī)律的實踐,中斷的次數(shù)也可以等效為恒定的時鐘發(fā)生器. 用它與系統(tǒng)時鐘比對,就可間接地"測試"出系統(tǒng)時鐘的快慢. 否則,內(nèi)部RC振蕩器自動調(diào)節(jié)從何而來??? |
|
| 18樓: | >>參與討論 |
| 作者: AIRWILL 于 2006/3/5 19:42:00 發(fā)布:
hotpower 的中斷喂狗論很精彩. 只是,在 OS 中,應(yīng)該為所有主人服務(wù),如何識別 某個任務(wù)較長時間的 standby mode . 一個主人增加多個標志嗎? 但有會出現(xiàn)標志相互矛盾. |
|
| 19樓: | >>參與討論 |
| 作者: hotpower 于 2006/3/5 19:55:00 發(fā)布:
牧犬人沒這兩下如何耍大刀 哈哈...搞產(chǎn)品和教學(xué)不一樣... |
|
| 20樓: | >>參與討論 |
| 作者: maoqichun 于 2006/3/5 19:56:00 發(fā)布:
主程序常有,中斷不常有 有很多中斷是在主程序的控制下根據(jù)需要才開放的,并非開機就開中斷,定時器中斷也是如此. |
|
| 21樓: | >>參與討論 |
| 作者: hotpower 于 2006/3/5 20:00:00 發(fā)布:
一般程序都有"節(jié)拍",所以狗論是比較通用的 |
|
| 22樓: | >>參與討論 |
| 作者: hongyang01 于 2006/3/5 20:16:00 發(fā)布:
學(xué)習(xí)中 * - 本貼最后修改時間:2006-3-5 20:20:25 修改者:hongyang01 |
|
| 23樓: | >>參與討論 |
| 作者: pjzhao 于 2006/3/7 15:29:00 發(fā)布:
精彩 |
|
| 24樓: | >>參與討論 |
| 作者: sky134579 于 2006/3/7 19:08:00 發(fā)布:
好好學(xué)習(xí)!向大俠看齊! |
|
| 25樓: | >>參與討論 |
| 作者: yewuyi 于 2006/3/8 8:49:00 發(fā)布:
我認為不需要搞那么復(fù)雜 主程序中清狗,并不斷刷新中斷狀態(tài)字也沒多大問題,現(xiàn)在不帶內(nèi)部看門狗的MCU好象越來越少了。 在主程序中設(shè)置令牌,到中斷中清狗固然很好,但主程序中各級子程序都需要有相應(yīng)標志,我個人認為這大大增加了設(shè)計復(fù)雜度,還是簡單一點才好,沒必要搞的那么復(fù)雜…… |
|
| 26樓: | >>參與討論 |
| 作者: raidy_liu 于 2006/3/8 9:36:00 發(fā)布:
重要的是讓狗成為真正的看門狗 其實程序中如何喂狗,要根據(jù)具體的程序流程,沒有千篇一律的,只是要把握一個原則:讓狗成為真正的看門狗 |
|
| 27樓: | >>參與討論 |
| 作者: chenlr217 于 2006/3/8 13:30:00 發(fā)布:
喂狗理論 |
|
| 28樓: | >>參與討論 |
| 作者: yewuyi 于 2006/3/8 15:31:00 發(fā)布:
BitFu出什么書了? hotpower 發(fā)表于 2006-3-4 10:45 AVR 單片機 ←返回版面 BitFu的書不錯 我給徒弟買了本讓他自學(xué)... |
|
| 29樓: | >>參與討論 |
| 作者: fungvy 于 2006/3/8 17:26:00 發(fā)布:
主程序死掉了,但中斷可能依然還活著 奉上周航慈老前輩的一片文章,讓大家了解“主程序死掉了,但中斷可能依然還活著”的道理。 MCS51系列單片機軟件抗干擾技術(shù)中的誤區(qū) 作者:周航慈 摘要:文章指出了一種廣泛流傳的誤解:在MCS-51系列單片機中,只要用指令使程序從起始地址開始執(zhí)行,就可以復(fù)位單片機,擺脫干擾。通過一個簡單的實驗,揭示了軟件復(fù)位的可靠方法。 有的單片機(如8098)有專門的復(fù)位指令,某些增強型MCS-51系統(tǒng)單片機雖然沒有復(fù)位指令,但片內(nèi)集成了WATCHDOG電路,故抗干擾也不成問題。而普及型MCS-51系列單片機(如8031和8032)既然無復(fù)位指令,又不帶硬件WATCHDOS,如果沒有外接硬件WATCHDOG電路,就必須采用軟件抗干擾技術(shù)。常用的軟件抗干擾技術(shù)有:軟件陷阱、指令冗余、軟件WATCHDOG等,它們的作用是在系統(tǒng)受干擾時能及時發(fā)現(xiàn),再用軟件的方法使系統(tǒng)復(fù)位。所謂軟件復(fù)位就是用一系列指令來模仿復(fù)位操作,這就是MCS-51系列單片機所特有的軟件復(fù)位技術(shù)。 現(xiàn)用一簡單的實驗說明,實驗電路如附圖所示。接于仿真插座P1.0的發(fā)光二極管LED0用來表示主程序的工作情況,接于P1.1的發(fā)光二極管LED1用于表示低級中斷子程序的工作情況,接于P1.2的發(fā)光二極管LED2用來表示高級中斷子程序的工作情況,接于P3.2口的按鈕用來設(shè)立干擾標志,程序檢測到干擾標志后故意進入死循環(huán)或掉進陷井,模仿受干擾的情況,從而檢驗各種復(fù)位方法的實際效果。初始化程序如下: ORG 0000H STAT: LJMP MAIN ;復(fù)位入口地址 ORG 0003H LJMP PX0 ;按鈕中斷向量(低級中斷) ORG 000BH LJMP PT0 ;T0中斷向量(低級中斷) ORG 001BH LJMP PT1 ;T1中斷向量(高級中斷) ORG 0030H MAIN: CLR EA MOV SP,#7 MOV P1,#0FFH MOV P3,#0FFH MOV TMOD,#11H CLR 00H ;干擾標志初始化 SETB ET0 SETB ET1 SETB EX0 SETB PT1 SETB TR0 SETB TR1 SETB EA LOOP: CPL P1.0 ;主程序發(fā)光二極管LED0閃爍 MOV R6,#80H MOV R7,#0 TT1: DJNZ R7,TT1 DJNZ R6,TT1 SJMP LOOP PX0: SETB 00H ;設(shè)立干擾標志,模擬發(fā)生干擾 RETI PT0: CPL P1.1 ;低級中斷程序發(fā)光二極管LED1閃爍 RETI PT1: CPL P1.2 ;高級中斷程序發(fā)光二極管LED2閃爍 RETI END 實驗步驟如下: 1. 按上述程序啟動執(zhí)行,三個發(fā)光二極管都應(yīng)閃爍(否則應(yīng)先排除故障),表示主程序和各中斷子程序正常。因模擬干擾標志未加檢測,故不受按鈕影響。 2. 修改主程序如下,按下按鈕后主程序即掉入死循環(huán)中。 LOOP: CPL P1.0 MOV R6,#80H MOV R7,#0H TT1: DJNZ R7,TT1 DJNZ R6,TT1 JNB 00H,LOOP ;受干擾否? STOP:LJMP STOP ;掉入死循環(huán)。 這時可以看到,主程序停止工作(LED0停止閃爍),而兩個中斷子程序繼續(xù)運行(LED1和LED2繼續(xù)閃爍)。 3. 將定時器T1用作軟件WATCHDOG,將30H單元用作軟件WATCHDOG計數(shù)器。主程序中加入一條復(fù)位軟件WATCHDOG的指令。 LOOP: CPL P1.0 MOV 30H,#0 ;復(fù)位軟件WATCHDOG計數(shù)器 MOV R6,#80H MOV R7,#0H TT1: DJNZ R7,TT1 DJNZ R6,TT1 JNB 00H,LOOP ;受干擾否? STOP:LJMP STOP ; 掉入死循環(huán)。 T1中斷子程序修改如下: PT1: CPL P1.2 ;高級中斷程序發(fā)光二極管閃爍 INC 30H MOV A,30H ADD A,#0FDH JC ERR ;達到3次否? RETI ERR: LJMP STAT ;軟件WATCHDOG動作 當(dāng)按下按鈕前,程序正常運行(三個LED全閃)。按下按鈕后,主程序能迅速恢復(fù)工作,但兩個中斷子程序被封鎖,不再工作。過程如下:主程序檢測到干擾后進入死循環(huán),不能執(zhí)行復(fù)位30H單元的操作,T1中斷使30H不斷增值,計數(shù)到3時,軟件WATCHDOG執(zhí)行動作,執(zhí)行一條LJMP指令,使程序從頭執(zhí)行。MAIN過程中清除了干擾標志(表示干擾已經(jīng)過去),使主程序迅速恢復(fù)工作。按理說MAIN過程中也重新設(shè)定了各個中斷,并開放了它們,為什么中斷不能恢復(fù)工作呢?這是因為中斷激活標志的復(fù)位工作被遺忘了,因 |
|
| 30樓: | >>參與討論 |
| 作者: tubie 于 2006/3/8 22:46:00 發(fā)布:
喂狗的目的是為了讓主循環(huán)正常,主循環(huán)死了,中斷還有可能發(fā)生 |
|
| 31樓: | >>參與討論 |
| 作者: hotpower 于 2006/3/8 22:55:00 發(fā)布:
暈菜~~~沒見過只有中斷沒有主程序的系統(tǒng)??? |
|
| 32樓: | >>參與討論 |
| 作者: 陳雙君 于 2006/3/9 8:28:00 發(fā)布:
定時器中1MS一次 定時器中1MS一次 |
|
| 33樓: | >>參與討論 |
| 作者: linwei1234 于 2006/3/10 22:21:00 發(fā)布:
神經(jīng)失常才會跑飛的! 神經(jīng)失常才會跑飛的!目前還沒有真正能解結(jié)此問題的吧? 這些都是微處理器的缺陷!我想不久將會解結(jié)這些問題的! |
|
| 34樓: | >>參與討論 |
| 作者: tqdyx 于 2006/3/11 14:01:00 發(fā)布:
什么地方喂無所謂,看具體情況 如果主程序是只有初始化的死循環(huán),喂了也沒什么意義。要在中斷中喂的話,要把握時間的可預(yù)測性。 |
|
| 35樓: | >>參與討論 |
| 作者: tubie 于 2006/3/11 23:48:00 發(fā)布:
程序即使跑飛了,中斷還是有可能發(fā)生的。 |
|
| 36樓: | >>參與討論 |
| 作者: hotpower 于 2006/3/12 0:49:00 發(fā)布:
我真是被暈死了...無話可說!!! |
|
| 37樓: | >>參與討論 |
| 作者: hotpower 于 2006/3/12 1:13:00 發(fā)布:
拿周航慈的書來論證,哪_reset_()函數(shù)是干什么吃的??? /*------------------------------------------------------------------------------------------*/ #define _intjmp_(ADDR) DPTR = (void *)ADDR;_icall_(__reset_code__) //中斷隱身函數(shù)_intjmp_()聲明 #define _reset_() DPTR = __reset_code__ + 5;_icall_(__reset_code__) //軟復(fù)位函數(shù)_reset_()聲明 _db_(__reset_code__, "\xc0\x82\xc0\x83\x32\xe4\xc0\xe0\xc0\xe0\x32");//裝載數(shù)據(jù)DB 0xc0..0x32 /*-------------------------------------------------------------------------------------------- 裝載代碼 __reset_code__: PUSH DPL;//非典的軟復(fù)位函數(shù)入口(執(zhí)行2次RETI) PUSH DPH RETI;//_intjmp_()函數(shù)調(diào)用到此為止中斷退出并跳入子程序隱身(讓出中斷) CLR A;//經(jīng)典的軟復(fù)位函數(shù)入口(執(zhí)行1次RETI) PUSH ACC PUSH ACC RETI;//_reset_()函數(shù)調(diào)用從此處跳入0x0000開始執(zhí)行 看來再說也無用了... "程序即使跑飛了,中斷還是有可能發(fā)生的"毒害太深了... 偽本征函數(shù)——keil c51頭文件intrins.h的擴容工程 第三版 |
|
| 38樓: | >>參與討論 |
| 作者: 不起眼 于 2006/3/12 19:43:00 發(fā)布:
呵呵,這也爭論。 如果你僅僅為了養(yǎng)狗,你可以在中斷喂狗。別忘了你養(yǎng)狗的目的是什么? 既然養(yǎng)狗就要讓他盡可能大的起作用。原則就是即不餓著,也不撐著。 這需要技巧。如果怕麻煩,干脆不養(yǎng)算了。 |
|
| 39樓: | >>參與討論 |
| 作者: ljxh401 于 2006/3/13 10:06:00 發(fā)布:
1 那還不是一樣了…………既然要設(shè)置標志,還不如去喂狗…… 等于說,告訴鄰居,你要記得幫我喂狗噢……如果有一天沒有告訴鄰居,那么狗就回來咬主人了…… 可以連坐 保證兩個啊 |
|
| 40樓: | >>參與討論 |
| 作者: gwnpeter 于 2006/3/15 22:48:00 發(fā)布:
我的方式 呵呵,使用中庸之道把 我得是使用定時器每隔一段時間置一下位,然后在主函數(shù)里面的superLoop結(jié)構(gòu)中檢測置位,并喂狗狗! |
|
| 41樓: | >>參與討論 |
| 作者: fzy_666 于 2006/3/20 12:11:00 發(fā)布:
看怎么喂 中斷喂狗和主程序喂狗要看程序怎么寫: 如果中斷是不常用的,那在主程序中喂狗比較好 如果定時中斷的,我認為在中斷中喂狗比較方便 本人在一般情況下中斷是一直開的,在主程序中作標志,在中斷中喂狗,本人還沒有用過主程序中喂狗的,呵呵,見笑了!! |
|
| 42樓: | >>參與討論 |
| 作者: xah_98765 于 2006/3/20 15:01:00 發(fā)布:
支持中斷喂狗 平時都在主程序中喂狗,在中斷中喂狗能起到軟件陷阱的作用,就看你的中斷服務(wù)程序的執(zhí)行時間了.兩者有機結(jié)合,就能達到好的效果. |
|
| 43樓: | >>參與討論 |
| 作者: xinzha 于 2006/3/20 22:35:00 發(fā)布:
狗只是看著不讓你的軟件跑飛。 中斷屬于一種異常,一般情況下所有異常都會得到正確的執(zhí)行,即使你的系統(tǒng)發(fā)生了一些不可預(yù)知的錯誤導(dǎo)致軟件跑飛,每次中斷還是會準確地進入,這個時候喂狗等于你把看門狗硬件給禁掉一樣。 不過在中斷中應(yīng)該可以自己搞個軟件狗,可以防止程序跑飛,并且能夠盡量不硬件復(fù)位丟失目前軟件中的一些信息。 |
|
| 44樓: | >>參與討論 |
| 作者: mxh0506 于 2006/3/22 22:13:00 發(fā)布:
支持xinzha 狗只是看著不讓你的軟件跑飛。 中斷屬于一種異常,一般情況下所有異常都會得到正確的執(zhí)行,即使你的系統(tǒng)發(fā)生了一些不可預(yù)知的錯誤導(dǎo)致軟件跑飛,每次中斷還是會準確地進入,這個時候喂狗等于你把看門狗硬件給禁掉一樣。 不過在中斷中應(yīng)該可以自己搞個軟件狗,可以防止程序跑飛,并且能夠盡量不硬件復(fù)位丟失目前軟件中的一些信息。 =============================================== 看門狗不過就是一種超時復(fù)位機制,系統(tǒng)中有一個這樣的硬件機制用來防止程序失常就夠了.在有硬WDT守護的任務(wù)中,再添加軟超時守護其它任務(wù)即可 |
|
| 45樓: | >>參與討論 |
| 作者: fanjunfeng 于 2006/3/23 9:38:00 發(fā)布:
頂一下 以前沒太注意這方面問題,又增長見識了。 |
|
| 46樓: | >>參與討論 |
| 作者: sjm2005 于 2006/3/24 22:17:00 發(fā)布:
學(xué)習(xí)了 大家各抒己見,好啊。真的學(xué)習(xí)了。 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |