<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 有了看門狗就不會死機?

          有了看門狗就不會死機?

          作者: 時間:2016-12-02 來源:網(wǎng)絡(luò) 收藏
          死機是指CPU的程序指針進入一個死循環(huán),無法執(zhí)行正常的程序流程。其外在表現(xiàn)常常是:正常功能喪失,按鍵無響應(yīng),顯示凝固。單片機死機后,只有復(fù)全才能走出死循環(huán),執(zhí)行正常的程序流程。眾所屬知,克服死機的最有效手段是加看門狗(WatchDog)。

          目前用得最廣泛的看門狗實際上是一個特殊的定時器DogTimer。DogTimer按固定速率計時,計滿預(yù)定時間就發(fā)出溢出脈沖使單片機復(fù)位。如果每次在DogTimer溢出前強行讓DogTimer清零,就不會發(fā)出溢出脈沖。清零脈沖由CPU發(fā)出,在單片機程序中每隔一段語句放一個清DogTimer的語句——FeedDog語句,以保證程序正常運行時DogTimer不會溢出。一旦程序進入一個不含F(xiàn)eedDog語句的死循環(huán),DogTimer將溢出,導(dǎo)致單片機復(fù)位,跳出這個死循環(huán)。本文稱這種看門狗為典型看門狗,典型看門狗已被集成比,如MAX706、MAX791等[1];還有許多單片機本身集成了這種看門狗,如PIC16C57、MC68HC705等,
          有一個錯誤觀點:加了看門狗,單片機就不會死機。實際上,看門狗有時間會完全失效。當程序進入某個死循環(huán),而這個死循環(huán)中又包含F(xiàn)eedDog語句,這時DogTimer始終不會溢出,單片機始終得不到復(fù)位信號,程序也就始終跳不出這個死循環(huán)。針對這一弊端,筆者設(shè)計了雙對限看門狗和定時復(fù)位看門狗。

          雙時限看門狗有兩個定時器;一個為短定時器,一個為長定時器。短定時器定時為T1,長定時器定時為T2,0
          這樣,當程序進入某個死循環(huán),如果這個死循環(huán)包含短定時器FeedDog語句而不包含長定時器FeedDog語句,那么長定時順終將溢出,使單片機復(fù)位。巧妙安排長定時器FeedDog語句的位置,可保證出現(xiàn)死機的概率根低。在水輪發(fā)電機組微機控制裝置中的對比應(yīng)用證明了這一點[3]。

          目前幾乎所有的看門狗都是依賴于CPU(依賴于CPU FeedDog)。這可以比作:一個保險設(shè)備能否起到保險作用還依賴于被它保護的對象的行為。顯然,依賴于CPU的看門狗是不能保證單片機在分之百不死機的。

          在絕對不允許死機的裝置中,筆者設(shè)計了一種完全不依賴于CPU的看門狗——定時復(fù)位看門狗。定時復(fù)位看門狗的主體也是一個定時器,到預(yù)定時間就發(fā)出溢出脈沖,此溢出脈沖使單片機強行復(fù)位。定時復(fù)位看門狗不需要CPU FeedDog。

          簡言之,定時復(fù)位看門狗就是定時地讓單片機強行復(fù)位。這樣,即使裝置死機,其最大死機時間也不會大于定時器定時時間。顯然,只要硬件完好,這種看門狗百分之百地保證了單片機不會長時間死機。在智能電表(包括IC卡電能表、復(fù)費率電能表、多功能電能表[4])中采用了定時復(fù)位看門狗,每1秒讓CPU強行復(fù)位,迄今數(shù)十萬電表運行了近五年,無一例死機報告。

          必須指出,采用這種看門狗,CPU的編程要適應(yīng)定時復(fù)位的環(huán)境,保證定時復(fù)位不打斷那些不能打斷的程序,不造成任何誤動作。


          關(guān)鍵詞: 看門狗就死機單片

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();