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