PIC中斷編寫(xiě)
示例:
void interrupt ISR(void) { //中斷服務(wù)程序
} //中斷結束并返回
PICC 會(huì )自動(dòng)加入代碼實(shí)現中斷現場(chǎng)的保護,并在中斷結束時(shí)自動(dòng)恢復現場(chǎng),所以編程員無(wú)需象編寫(xiě)匯編程序那樣加入中斷現場(chǎng)保護和恢復的額外指令語(yǔ)句。但如果在中斷服務(wù)程序中需要修改某些全局變量時(shí),是否需要保護這些變量的初值將由編程員自己決定和實(shí)施。
· 代碼盡量簡(jiǎn)短,中斷服務(wù)強調的是一個(gè)“快”字。
· 避免在中斷內使用函數調用。
· 避免在中斷內進(jìn)行數學(xué)運算。數學(xué)運算將很有可能用到庫函數和許多中間變量,就算不出現遞歸調用的問(wèn)題,光在中斷入口和出口處為了保護和恢復這些中間臨時(shí)變量就需要大量的開(kāi)銷(xiāo),嚴重影響中斷服務(wù)的效率。
中檔系列PIC 單片機的中斷入口只有一個(gè),因此整個(gè)程序中只能有一個(gè)中斷服務(wù)函數。(PIC18有兩個(gè)中斷向量,PIC16只有一個(gè))
《MPLAB? C30C 編譯器用戶(hù)指南》
7.3.1 編寫(xiě)中斷服務(wù)程序的要領(lǐng)
? 不帶參數并以void 返回值類(lèi)型聲明ISR (強制)
? 不要通過(guò)一般程序調用ISR (強制)
? 不要用ISR 調用其他函數(建議)
MPLAB C30 的ISR 和任何其他C 函數一樣,可以有局部變量,可以訪(fǎng)問(wèn)全局變量。但是, ISR 需要聲明為沒(méi)有參數,沒(méi)有返回值。這是必須的,因為ISR 作為對硬件中斷或陷阱的響應,對它的調用與一般C 程序異步(即ISR 不是按通常的方式調用的,因此不能有參數和返回值)。
ISR 只能通過(guò)硬件中斷或陷阱調用,不能通過(guò)其他C 函數調用。ISR 使用中斷返回(RETFIE)指令退出函數,而不是使用一般的RETURN 指令。不恢復現場(chǎng)使用RETFIE 指令退出中斷服務(wù)程序會(huì )破壞處理器資源,如status 寄存器的值。最后,由于中斷響應時(shí)間的原因,建議不要使用ISR 調用其他函數。
7.6 中斷響應時(shí)間
有兩個(gè)因素影響中斷源發(fā)生到執行ISR 代碼第一條指令之間的周期數。這兩個(gè)因素是:
? 處理器處理中斷時(shí)間 — 處理器識別中斷并跳轉到中斷向量第一個(gè)地址的時(shí)間。這個(gè)值與具體器件和所使用中斷源有關(guān)。
? ISR 代碼 — MPLAB C30 在ISR 中保存它使用的寄存器,這包括工作寄存器和RCOUNT 特殊功能寄存器。而且,如果ISR 調用一個(gè)普通的函數,編譯器要保存所有的工作寄存器和RCOUNT,即使在ISR 中沒(méi)有顯式使用這些寄存器。必須要保存這些寄存器,因為一般來(lái)說(shuō),編譯器不知道被調用函數使用了哪些資源。
評論