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