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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > PIC16F87X單片機(jī)中斷系統(tǒng)應(yīng)用須關(guān)注的問題

          PIC16F87X單片機(jī)中斷系統(tǒng)應(yīng)用須關(guān)注的問題

          作者: 時(shí)間:2012-04-10 來源:網(wǎng)絡(luò) 收藏

          初始加電時(shí),自動(dòng)將 PCLATH清0,以避免其內(nèi)容出現(xiàn)隨機(jī)值,也就是為了避免在以后的程序運(yùn)行過程中CPU發(fā)生不可預(yù)料的跳轉(zhuǎn),而造成程序的“跑飛”。由此可見,寄存器 PCLATH對于程序的安全運(yùn)行是至關(guān)重要的,不可輕視。程序一旦進(jìn)入服務(wù)程序后,PCLATH的當(dāng)前值為何就無從考證,實(shí)際上就失去了對于PCLATH 內(nèi)容的知情權(quán)。只好像初始上電那樣將其清0,重新把它強(qiáng)行“拉入”知情范圍(對應(yīng)程序中第7條指令)。

          PCLATH的內(nèi)容在2種情況下會影響到程序的走向:第1種情況是當(dāng)執(zhí)行GOTO和CALL這2條跳轉(zhuǎn)指令時(shí),11位地址碼來源于指令碼中,決定程序存儲器頁面的(PC值的)最高2 位,來源于PCLATH4:3>,即這種情況下只有PCLATH的2位影響程序走向。單單就這一種情況而言,只要用戶程序不超過第0頁(或稱頁0)的2KB范圍,對于程序員來說,PC值的最高2位可以忽略,因而PCLATH寄存器PCLATH4:3>的2位也可以忽略。第2種情況是,以PCL為目標(biāo)的算術(shù)運(yùn)算、邏輯運(yùn)算或傳送操作指令(PIC16系列的指令中具備14條這樣的指令),在操作過程中,自動(dòng)用 PCLATH寄存器的低5位裝載PC的高5位PC12:8>,影響程序走向的PCLATH內(nèi)容就多達(dá)5位。即使對于用戶程序不超過(第0頁范圍內(nèi)的)2KB的情況,也至少會有3位影響到程序的走向。對于程序員來說,PCLATH的內(nèi)容就不可忽略,必須保護(hù)。

          總而言之,對于寄存器PCLATH的保護(hù)和處理(對應(yīng)程序中陰影標(biāo)出的部分指令,即第5~9條)并不是什么情況下都是必需的,但是在編寫服務(wù)程序時(shí),統(tǒng)一安排這些指令也沒有任何壞處。只要主程序和服務(wù)程序中都不需要修改PCLATH寄存器的內(nèi)容,就可以不保護(hù)它。具體地說,只有當(dāng)同時(shí)滿足以下2個(gè)條件時(shí),陰影標(biāo)出的部分指令(即第5~9條)才可以省略。

          (1) 在主程序和服務(wù)程序中不都存在跨頁跳轉(zhuǎn)。例如:用戶程序沒有使用第0頁2KB空間之外的程序存儲器,或者用戶程序雖然超出了2KB的范圍,但是,在主程序和中斷服務(wù)程序中沒有同時(shí)用到GOTO或CALL指令,都能滿足該條。

          (2) 在主程序和中斷服務(wù)程序中沒有同時(shí)使用以PCL為目標(biāo)的操作指令(比如查表)。

          保護(hù)現(xiàn)場的操作次序與恢復(fù)現(xiàn)場的操作次序應(yīng)該相反。程序中的第8~11條就是按照相反的順序恢復(fù)寄存器PCLATH和 STATUS內(nèi)容的。但是,不要忘記保護(hù)現(xiàn)場時(shí)采用“SWAPF STATUS,W”指令產(chǎn)生的多余的交換操作,在此只好再采用同樣的方法將其交換回來(對應(yīng)程序中第10條指令)。最后2條指令,將W_TEMP內(nèi)容的高、低半字節(jié)交換了2遍,才被恢復(fù)到工作寄存器W中。如果只用1條傳送指令“MOVF W_TEMP,W”又會產(chǎn)生1個(gè)新的:“MOVF W_TEMP,W”指令會影響“Z”標(biāo)志位,會破壞此前已經(jīng)被恢復(fù)的寄存器STATUS的內(nèi)容,這是我們所不希望的,也是不能容忍的。因此,在程序中利用了2條不影響標(biāo)志位的SWAP指令(即第12,13兩條指令)。雖然麻煩一點(diǎn),但可以使這個(gè)得到圓滿的解決。

          最后必須進(jìn)一步強(qiáng)調(diào)的是,并不是所有情況下編寫的中斷服務(wù)程序中都需要現(xiàn)場保護(hù),或者都需要像以上范例程序那樣進(jìn)行現(xiàn)場保護(hù)。有些情況下僅僅保護(hù)W、STATUS和 PCLATH這3個(gè)寄存器還不夠。不過在此程序片段的基礎(chǔ)上,再增加或者減少需要保護(hù)的寄存器的個(gè)數(shù)都是輕而易舉的事。不要忘記,在保護(hù)任何文件寄存器之前都必須先把工作寄存器W保護(hù)起來才行得通。

          3 需要注意的幾個(gè)

          (1) 中斷標(biāo)志位的狀態(tài)與該中斷源是否產(chǎn)生中斷無關(guān)。換句話說,不管是否允許其中斷,只要滿足中斷的條件,中斷標(biāo)志位就會被置位。另外,也可以利用軟件將中斷標(biāo)志位置“1”或清“0”。

          (2) 當(dāng)開放某一中斷源時(shí),該中斷源就是通過中斷標(biāo)志位向CPU申請中斷的。無論什么原因,只要將中斷標(biāo)志位置位,就會產(chǎn)生中斷。如果用軟件強(qiáng)行將中斷標(biāo)志位置位,也會產(chǎn)生中斷。

          (3) 如果在中斷被屏蔽(或禁止)的情況下,中斷標(biāo)志位被置位,只要不被清除就會一直潛伏下來,那么,一旦解除屏蔽,就會立即產(chǎn)生中斷。

          (4) 如果在中斷被禁止的情況下,中斷標(biāo)志位已經(jīng)被置位,但是,假如在允許其中斷之前將它清除,那么,即使解除禁止,它也不會產(chǎn)生中斷。

          (5)當(dāng)CPU相應(yīng)的任何一個(gè)中斷時(shí),全局中斷屏蔽位GIE將會自動(dòng)清0;當(dāng)中斷返回時(shí)它又會自動(dòng)恢復(fù)為1。如果在中斷處理期間用軟件將已經(jīng)復(fù)位的GIE重新置位,這時(shí)再出現(xiàn)中斷請求,就可以形成中斷嵌套。也就是說,如果在響應(yīng)某一中斷期間又響應(yīng)了其他中斷請求,就形成了中斷嵌套。發(fā)生中斷嵌套時(shí),前一中斷處理過程被暫停而進(jìn)入后一中斷處理,當(dāng)后一中斷過程被處理完畢之后,才會繼續(xù)處理前一中斷。照此方式,還可以形成多級嵌套,甚至自身嵌套。不過嵌套的級數(shù)絕對不能超過硬件堆棧的深度。

          (6) 對于中斷響應(yīng)和處理時(shí)間有嚴(yán)格要求的,保護(hù)現(xiàn)場的指令安排也應(yīng)考慮延時(shí)問題。

          (7) 如果同時(shí)發(fā)生多個(gè)中斷請求,得到優(yōu)先處理的中斷完全取決于在中斷服務(wù)程序中檢查中斷源的順序。原因是各個(gè)中斷源之間不存在優(yōu)先級別之分。

          如果清除中斷標(biāo)志位的指令安排在中斷服務(wù)程序的尾部,就有可能丟失響應(yīng)在處理中斷期間該中斷源第2次中斷請求的機(jī)會。


          上一頁 1 2 3 4 下一頁

          評論


          相關(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); })();