新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > PIC中斷編寫

        PIC中斷編寫

        作者: 時間:2016-11-13 來源:網絡 收藏
        中斷服務程序: void interrupt ISR(void);

        其中的函數名“ISR”可以改成任意合法的字母或數字組合。

        本文引用地址:http://www.104case.com/article/201611/316101.htm

        中斷函數可以被放置在原程序的任意位置。PICC 在最后進行代碼連接時會自動將其定位到0x0004 中斷入口處,實現中斷服務響應。編譯器也會實現中斷函數的返回指令“retfie”。

        示例:

        void interrupt ISR(void) { //中斷服務程序

        if (T0IE && T0IF){//判TMR0 中斷

        T0IF = 0; //清除TMR0 中斷標志 //在此加入TMR0 中斷服務

        }

        if (TMR1IE && TMR1IF){ //判TMR1 中斷T

        MR1IF = 0; //清除TMR1 中斷標志

        //在此加入TMR1 中斷服務

        }

        } //中斷結束并返回

        PICC 會自動加入代碼實現中斷現場的保護,并在中斷結束時自動恢復現場,所以編程員無需象編寫匯編程序那樣加入中斷現場保護和恢復的額外指令語句。但如果在中斷服務程序中需要修改某些全局變量時,是否需要保護這些變量的初值將由編程員自己決定和實施。

        用C 語言編寫中斷服務程序必須遵循高效的原則:

        · 代碼盡量簡短,中斷服務強調的是一個“快”字。

        · 避免在中斷內使用函數調用。雖然PICC 允許在中斷里調用其它函數,但為了解決遞歸調用的問題,此函數必須為中斷服務獨家專用。既如此,不妨把原本要寫在其它函數內的代碼直接寫在中斷服務程序中。

        · 避免在中斷內進行數學運算。數學運算將很有可能用到庫函數和許多中間變量,就算不出現遞歸調用的問題,光在中斷入口和出口處為了保護和恢復這些中間臨時變量就需要大量的開銷,嚴重影響中斷服務的效率。

        中檔系列PIC 單片機的中斷入口只有一個,因此整個程序中只能有一個中斷服務函數。(PIC18有兩個中斷向量,PIC16只有一個)

        《MPLAB? C30C 編譯器用戶指南》

        7.3.1 編寫中斷服務程序的要領

        ? 不帶參數并以void 返回值類型聲明ISR (強制)
        ? 不要通過一般程序調用ISR (強制)
        ? 不要用ISR 調用其他函數(建議)
        MPLAB C30 的ISR 和任何其他C 函數一樣,可以有局部變量,可以訪問全局變量。但是, ISR 需要聲明為沒有參數,沒有返回值。這是必須的,因為ISR 作為對硬件中斷或陷阱的響應,對它的調用與一般C 程序異步(即ISR 不是按通常的方式調用的,因此不能有參數和返回值)。
        ISR 只能通過硬件中斷或陷阱調用,不能通過其他C 函數調用。ISR 使用中斷返回(RETFIE)指令退出函數,而不是使用一般的RETURN 指令。不恢復現場使用RETFIE 指令退出中斷服務程序會破壞處理器資源,如status 寄存器的值。最后,由于中斷響應時間的原因,建議不要使用ISR 調用其他函數。

        7.6 中斷響應時間


        有兩個因素影響中斷源發生到執行ISR 代碼第一條指令之間的周期數。這兩個因素是:
        ? 處理器處理中斷時間 — 處理器識別中斷并跳轉到中斷向量第一個地址的時間。這個值與具體器件和所使用中斷源有關。
        ? ISR 代碼 — MPLAB C30 在ISR 中保存它使用的寄存器,這包括工作寄存器和RCOUNT 特殊功能寄存器。而且,如果ISR 調用一個普通的函數,編譯器要保存所有的工作寄存器和RCOUNT,即使在ISR 中沒有顯式使用這些寄存器。必須要保存這些寄存器,因為一般來說,編譯器不知道被調用函數使用了哪些資源。



        關鍵詞: PIC中斷編

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 乌恰县| 漳浦县| 花莲市| 秦皇岛市| 台山市| 京山县| 六安市| 高安市| 英山县| 西乌珠穆沁旗| 井陉县| 通河县| 涿鹿县| 崇信县| 财经| 教育| 江口县| 固原市| 平南县| 壤塘县| 连城县| 南溪县| 建宁县| 酒泉市| 兰溪市| 宁安市| 德昌县| 磐安县| 叙永县| 桐城市| 黄龙县| 金湖县| 德格县| 红桥区| 阿拉善盟| 方城县| 江油市| 苗栗市| 宁安市| 浦北县| 福贡县|