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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)—軟件看門(mén)狗—01

          51單片機(jī)—軟件看門(mén)狗—01

          作者: 時(shí)間:2016-11-25 來(lái)源:網(wǎng)絡(luò) 收藏
          這是第一次寫(xiě)一寫(xiě)下自己的學(xué)習(xí)的過(guò)程,這只是個(gè)開(kāi)始,呵呵,當(dāng)然沒(méi)有結(jié)束的一個(gè)開(kāi)始

          今天沒(méi)有事情,就看看單片機(jī)的書(shū),突然發(fā)現(xiàn)自己學(xué)了這么長(zhǎng)的時(shí)間還沒(méi)有用過(guò)看門(mén)狗這個(gè)東東~~表示很慚愧,(*^__^*) 嘻嘻……

          本文引用地址:http://www.ex-cimer.com/article/201611/321502.htm

          既然這是自己的第一篇文章,那就來(lái)個(gè)簡(jiǎn)單,但是也好寫(xiě)的東東吧~~~

          001.軟件看門(mén)狗

          當(dāng)程序跑飛到一個(gè)臨時(shí)構(gòu)成的死循環(huán)中時(shí),這是如果沒(méi)有人為的操作(也就是按下復(fù)位鍵),那么軟件系統(tǒng)將完全癱瘓。那么我們就要讓MCU自己實(shí)現(xiàn)監(jiān)視系統(tǒng)運(yùn)行的情況,這就是程序運(yùn)行監(jiān)視系統(tǒng)(WatchDog)。

          簡(jiǎn)單來(lái)說(shuō)吧,好比一個(gè)主人養(yǎng)了一條狗,主人在正常工作時(shí)總是不忘記每隔一段時(shí)間就喂一次狗,狗吃過(guò)東西就安靜下來(lái),這樣也就不會(huì)影響主人生活。但是如果主人打瞌睡忘記喂狗,那么時(shí)間到了,狗就餓了,發(fā)現(xiàn)主人還沒(méi)有喂它,就會(huì)大叫起來(lái),把主人吵醒。呵呵,這就是嘍。。。。。。國(guó)外把這種程序運(yùn)行監(jiān)控系統(tǒng)成為WatchDog(看門(mén)狗)。其中看門(mén)狗的特性有:

          1》本身能獨(dú)立工作,基本上不依賴于CPU(這里還要解釋一下,它占用CPU主要是那么幾微秒,既喂狗)

          2》CPU在一個(gè)固定的時(shí)間間隔和系統(tǒng)打一次交道(也就是喂狗,1中已經(jīng)提到),以表明系統(tǒng)目前正常

          3》當(dāng)CPU陷入死循環(huán)后,能即使發(fā)覺(jué)并可以使系統(tǒng)復(fù)位

          下面就是程序的設(shè)計(jì)過(guò)程了~~~

          當(dāng)系統(tǒng)陷入死循環(huán)后,什么樣的程序才能使它跳出來(lái)呢?只有比這個(gè)死程序更高級(jí)的中斷程序才能奪走死程序?qū)PU的控制權(quán)。為此,咱們可以用一個(gè)定時(shí)器來(lái)做看門(mén)狗,將它的溢出中斷設(shè)定為高優(yōu)先級(jí)中斷,然后將系統(tǒng)的其它中斷設(shè)定為低優(yōu)先級(jí)的中斷(這里一定要保證你設(shè)定的看門(mén)狗的那個(gè)中斷一定要比你程序中的其它的中斷要高?。。。。ㄟ@里的設(shè)置方法很多,但是剛才說(shuō)的原則一定要滿足?。?。那就比如說(shuō)吧,用T0作看門(mén)狗,定時(shí)約為16ms,如果你的系統(tǒng)中沒(méi)有用到INT0,那么你就不需要設(shè)置PTO了(這里我就不多解釋了~~大家懂得的)。

          當(dāng)看門(mén)狗啟動(dòng)后,系統(tǒng)工作程序必須經(jīng)常“喂它”,而且每?jī)纱蔚拈g隔不得大于16ms(這里還是上邊的例子)

          當(dāng)程序陷入死循環(huán)后,16ms之內(nèi)即可引起一次T0中斷,產(chǎn)生高優(yōu)先級(jí)中斷,從而結(jié)束死循環(huán)。同時(shí),建議在T0中斷里直接轉(zhuǎn)向出錯(cuò)處理程序,也就是在中斷向量區(qū)放置一條“LJMP ERROR”就哦了(這里用匯編語(yǔ)言好解釋~~)

          下面是用匯編寫(xiě)的看門(mén)狗程序,它包含模擬的主程序,“喂狗”(DOG)程序和空彈返回0000H(TOP)程序。

          ORG 0000H

          AJMP MAIN

          ORG 000BH

          LGMP TOP

          MAIN: MOV SP,#06H;模塊硬件復(fù)位,這些可根據(jù)系統(tǒng)對(duì)資源的使用情況增減

          MOV PSW,#OOH

          MOV SCON,#01H

          .

          .

          .

          MOV IE,#00H

          MOV IP,#00H

          MOV TMOD,#01H

          LCALLDOG ;調(diào)用DOG的時(shí)間間隔應(yīng)該小于例題中的16ms

          . ;這里就省了要添加的程序,自己根據(jù)自需要來(lái)添加就哦了,我也就不費(fèi)話了

          .

          .

          DOG: MOV TH0,#0B1H;這就是喂狗程序,這里用的是定時(shí)計(jì)數(shù)器0

          MOV TL0,#0E0H

          SETBTR0

          RET

          TOP: POP ACC ;空彈斷點(diǎn)地址,也就是先將你壓入的地址取出來(lái),然后賦予新的值

          POP ACC;這里賦值為0,你懂得,也就是要讓它返回到程序的開(kāi)頭~~

          CLR A;當(dāng)然你也可以不這樣做,這里也可以來(lái)一個(gè)調(diào)用指令,自己搞定吧!

          PUSH ACC

          PUSH ACC

          RETI;(這里是RETI,不是RET)

            到這里看門(mén)狗的都該說(shuō)清楚了~~~

            這是軟件抗干擾的方法之一,還有一種方法就是軟件陷阱技術(shù),這個(gè)也挺簡(jiǎn)單的,我也就不多贅述了~~

          提示:軟件陷阱就是一條引導(dǎo)指令強(qiáng)行將捕獲的程序引向一個(gè)指定的地址,再那里有一段專門(mén)對(duì)程序出錯(cuò)進(jìn)行處理的程序,用來(lái)使程序按既定的目標(biāo)執(zhí)行。真正的軟件陷阱由三條指令組成:

            NOP

          NOP

          LJMP ERROR




          評(píng)論


          技術(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); })();