PIC16F87X單片機中斷系統(tǒng)應(yīng)用須關(guān)注的問題
在單片機初始加電時,自動將 PCLATH清0,以避免其內(nèi)容出現(xiàn)隨機值,也就是為了避免在以后的程序運行過程中CPU發(fā)生不可預(yù)料的跳轉(zhuǎn),而造成程序的“跑飛”。由此可見,寄存器 PCLATH對于程序的安全運行是至關(guān)重要的,不可輕視。程序一旦進入服務(wù)程序后,PCLATH的當(dāng)前值為何就無從考證,實際上就失去了對于PCLATH 內(nèi)容的知情權(quán)。只好像單片機初始上電那樣將其清0,重新把它強行“拉入”知情范圍(對應(yīng)程序中第7條指令)。
PCLATH的內(nèi)容在2種情況下會影響到程序的走向:第1種情況是當(dāng)執(zhí)行GOTO和CALL這2條跳轉(zhuǎn)指令時,11位地址碼來源于指令碼中,決定程序存儲器頁面的(PC值的)最高2 位,來源于PCLATH4:3>,即這種情況下只有PCLATH的2位影響程序走向。單單就這一種情況而言,只要用戶程序不超過第0頁(或稱頁0)的2KB范圍,對于程序員來說,PC值的最高2位可以忽略,因而PCLATH寄存器PCLATH4:3>的2位也可以忽略。第2種情況是,以PCL為目標(biāo)的算術(shù)運算、邏輯運算或傳送操作指令(PIC16系列單片機的指令系統(tǒng)中具備14條這樣的指令),在操作過程中,自動用 PCLATH寄存器的低5位裝載PC的高5位PC12:8>,影響程序走向的PCLATH內(nèi)容就多達5位。即使對于用戶程序不超過(第0頁范圍內(nèi)的)2KB的情況,也至少會有3位影響到程序的走向。對于程序員來說,PCLATH的內(nèi)容就不可忽略,必須保護。
總而言之,對于寄存器PCLATH的保護和處理(對應(yīng)程序中陰影標(biāo)出的部分指令,即第5~9條)并不是什么情況下都是必需的,但是在編寫中斷服務(wù)程序時,統(tǒng)一安排這些指令也沒有任何壞處。只要主程序和中斷服務(wù)程序中都不需要修改PCLATH寄存器的內(nèi)容,就可以不保護它。具體地說,只有當(dāng)同時滿足以下2個條件時,陰影標(biāo)出的部分指令(即第5~9條)才可以省略。
(1) 在主程序和中斷服務(wù)程序中不都存在跨頁跳轉(zhuǎn)。例如:用戶程序沒有使用第0頁2KB空間之外的程序存儲器,或者用戶程序雖然超出了2KB的范圍,但是,在主程序和中斷服務(wù)程序中沒有同時用到GOTO或CALL指令,都能滿足該條。
(2) 在主程序和中斷服務(wù)程序中沒有同時使用以PCL為目標(biāo)的操作指令(比如查表)。
保護現(xiàn)場的操作次序與恢復(fù)現(xiàn)場的操作次序應(yīng)該相反。程序中的第8~11條就是按照相反的順序恢復(fù)寄存器PCLATH和 STATUS內(nèi)容的。但是,不要忘記保護現(xiàn)場時采用“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個新的問題:“MOVF W_TEMP,W”指令會影響“Z”標(biāo)志位,會破壞此前已經(jīng)被恢復(fù)的寄存器STATUS的內(nèi)容,這是我們所不希望的,也是不能容忍的。因此,在程序中利用了2條不影響標(biāo)志位的SWAP指令(即第12,13兩條指令)。雖然麻煩一點,但可以使這個問題得到圓滿的解決。
最后必須進一步強調(diào)的是,并不是所有情況下編寫的中斷服務(wù)程序中都需要現(xiàn)場保護,或者都需要像以上范例程序那樣進行現(xiàn)場保護。有些情況下僅僅保護W、STATUS和 PCLATH這3個寄存器還不夠。不過在此程序片段的基礎(chǔ)上,再增加或者減少需要保護的寄存器的個數(shù)都是輕而易舉的事。不要忘記,在保護任何文件寄存器之前都必須先把工作寄存器W保護起來才行得通。
3 需要注意的幾個問題
(1) 中斷標(biāo)志位的狀態(tài)與該中斷源是否產(chǎn)生中斷無關(guān)。換句話說,不管是否允許其中斷,只要滿足中斷的條件,中斷標(biāo)志位就會被置位。另外,也可以利用軟件將中斷標(biāo)志位置“1”或清“0”。
(2) 當(dāng)開放某一中斷源時,該中斷源就是通過中斷標(biāo)志位向CPU申請中斷的。無論什么原因,只要將中斷標(biāo)志位置位,就會產(chǎn)生中斷。如果用軟件強行將中斷標(biāo)志位置位,也會產(chǎn)生中斷。
(3) 如果在中斷被屏蔽(或禁止)的情況下,中斷標(biāo)志位被置位,只要不被清除就會一直潛伏下來,那么,一旦解除屏蔽,就會立即產(chǎn)生中斷。
(4) 如果在中斷被禁止的情況下,中斷標(biāo)志位已經(jīng)被置位,但是,假如在允許其中斷之前將它清除,那么,即使解除禁止,它也不會產(chǎn)生中斷。
(5)當(dāng)CPU相應(yīng)的任何一個中斷時,全局中斷屏蔽位GIE將會自動清0;當(dāng)中斷返回時它又會自動恢復(fù)為1。如果在中斷處理期間用軟件將已經(jīng)復(fù)位的GIE重新置位,這時再出現(xiàn)中斷請求,就可以形成中斷嵌套。也就是說,如果在響應(yīng)某一中斷期間又響應(yīng)了其他中斷請求,就形成了中斷嵌套。發(fā)生中斷嵌套時,前一中斷處理過程被暫停而進入后一中斷處理,當(dāng)后一中斷過程被處理完畢之后,才會繼續(xù)處理前一中斷。照此方式,還可以形成多級嵌套,甚至自身嵌套。不過嵌套的級數(shù)絕對不能超過硬件堆棧的深度。
(6) 對于中斷響應(yīng)和處理時間有嚴(yán)格要求的應(yīng)用,保護現(xiàn)場的指令安排也應(yīng)考慮延時問題。
(7) 如果同時發(fā)生多個中斷請求,得到優(yōu)先處理的中斷完全取決于在中斷服務(wù)程序中檢查中斷源的順序。原因是各個中斷源之間不存在優(yōu)先級別之分。
如果清除中斷標(biāo)志位的指令安排在中斷服務(wù)程序的尾部,就有可能丟失響應(yīng)在處理中斷期間該中斷源第2次中斷請求的機會。
評論