PIC與51系列單片機一個顯著的區(qū)別就是:PIC只有一個中斷入口地址(為04H),而51有多個中斷源。這樣對PIC來說,無論發(fā)生何種中斷程序 將自動轉移執(zhí)行04H處的程序語句,為了區(qū)分到底是哪種中斷發(fā)生就必須在中斷服務程序中通過判斷中斷標志位來確定并轉移到相應的中斷服務 程序中。在發(fā)生中斷時,斷點地址被首先壓入硬件堆棧,而現場的一些參數須用戶通過軟件保存,必須保存的寄存器包括W寄存器、程序寄存器的高位字節(jié)PCLATH及狀態(tài)標志寄存器STATUS等,另外一些在中斷服務程序和主程序中均使用到的寄存器也必須保存,否則可能會導致不可預知的錯誤。如果需要保存的現場參數過多就會到來兩個弊端:一是造成RAM資源的浪費,特別是對RAM資源緊張的應用系統(tǒng);二是增加了中斷服務 程序的運行時間而導致中斷系統(tǒng)的實時性變差,甚至影響正常功能的實現,比如用單片機中的CCP模塊實現對高速脈沖寬度的測量,則就要求中斷服務程序的運行時間越短越好,否則會丟掉捕捉的機會而造成錯誤。因此建議在中斷服務程序中盡量不要使用主程序中用到的寄存器,將中斷中的寄存器設為專用,這樣就省去了這些寄存器的保護和恢復程序并減少出錯的幾率。
另外一個注意的是,在中斷服務程序中盡量避免使用有多級嵌套的子程序,本人在實際應用過程中曾遇到過此類問題,在很長一段時間內找不出問題的根源。PIC中檔單片機的硬件堆棧為8級,假如在主程序中調用了一個具有6級嵌套的子程序,當主程序執(zhí)行到最內層的子程序時,則8級堆棧中已用去了6級,如果剛好此時發(fā)生了中斷,則斷點被壓入堆棧,此時堆棧中保存了七個地址,又假如在中斷服務程序中存在一個二級嵌套的子程序,則堆棧將發(fā)生溢出,這必將導致程序不能正確返回到原來的地址,從而導致程序跑偏。由于該情況的發(fā)生需要滿足一定的條件,即 主程序運行到最內層的子程序時發(fā)生中斷,因而具有很大的不確定性,在產品開發(fā)開發(fā)調試階段可能根本就沒有發(fā)現有什么問題,等到產品經用戶長期使用時才開始暴露出來,但此時已經給產品在用戶心目中的形象造成了極壞的影響,損失已經無法挽回。因此作為開發(fā)人員應該特別注意。





