新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > PIC16F87X單片機中斷系統應用須關注的問題

        PIC16F87X單片機中斷系統應用須關注的問題

        作者: 時間:2012-04-10 來源:網絡 收藏

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

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

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

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

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

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

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

        3 需要注意的幾個

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

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

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

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

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

        (6) 對于中斷響應和處理時間有嚴格要求的,保護現場的指令安排也應考慮延時問題。

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

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


        上一頁 1 2 3 4 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 黎城县| 景泰县| 洪江市| 嘉善县| 忻州市| 英德市| 平顺县| 磐石市| 新晃| 菏泽市| 和硕县| 深州市| 上高县| 远安县| 宜黄县| 石门县| 吉安县| 夏津县| 台山市| 鹤峰县| 南京市| 于田县| 昆明市| 邵阳县| 宝坻区| 酒泉市| 邵东县| 紫云| 安乡县| 健康| 达州市| 同江市| 崇阳县| 丽江市| 桓台县| 长宁县| 西昌市| 拉孜县| 唐山市| 休宁县| 竹山县|