新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > PIC 中斷 服務(wù)程序

        PIC 中斷 服務(wù)程序

        作者: 時間:2016-11-23 來源:網(wǎng)絡(luò) 收藏
        中斷服務(wù)程序有一個特殊的定義方法: void interrupt ISR(void)其中的函數(shù)名“ISR”可以改成任意合法的字母或數(shù)字組合,但其入口參數(shù)和返回參數(shù)類型必須是“void”型,亦即沒有入口參數(shù)和返回參數(shù),且中間必須有一個關(guān)鍵詞“interrupt”中斷函數(shù)可以被放置在原程序的任意位置。因為已有關(guān)鍵詞“interrupt”聲明,PICC 在最后進行代碼連接時會自動將其定位到0x0004 中斷入口處,實現(xiàn)中斷服務(wù)響應(yīng)。編譯器也會實現(xiàn)中斷函數(shù)的返回指令“retfie”。

        一個簡單的中斷服務(wù)示范函數(shù)如下:

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

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

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

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

        }

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

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

        //在此加入TMR1 中斷服務(wù)

        }

        } //中斷結(jié)束并返回

        PICC 會自動加入代碼實現(xiàn)中斷現(xiàn)場的保護,并在中斷結(jié)束時自動恢復(fù)現(xiàn)場,所以編程員無需象編寫匯編程序那樣加入中斷現(xiàn)場保護和恢復(fù)的額外指令語句。但如果在中斷服務(wù)程序中需要修改某些全局變量時,是否需要保護這些變量的初值將由編程員自己決定和實施。用C 語言編寫中斷服務(wù)程序必須遵循高效的原則:

        z 代碼盡量簡短,中斷服務(wù)強調(diào)的是一個“快”字。

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

        z 避免在中斷內(nèi)進行數(shù)學(xué)運算。數(shù)學(xué)運算將很有可能用到庫函數(shù)和許多中間變量,就算不出現(xiàn)遞歸調(diào)用的問題,光在中斷入口和出口處為了保護和恢復(fù)這些中間臨時變量就需要大量的開銷,嚴重影響中斷服務(wù)的效率。

        中檔系列PIC 單片機的中斷入口只有一個,因此整個程序中只能有一個中斷服務(wù)函數(shù)。



        關(guān)鍵詞: PIC中斷服務(wù)程

        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 西贡区| 红安县| 丽江市| 菏泽市| 定远县| 类乌齐县| 方城县| 白银市| 海林市| 凭祥市| 卓尼县| 响水县| 卫辉市| 北流市| 简阳市| 壤塘县| 双流县| 资中县| 武陟县| 葫芦岛市| 漳浦县| 闸北区| 巴马| 万山特区| 博白县| 齐河县| 博野县| 双峰县| 甘南县| 灵武市| 浠水县| 东港市| 仁布县| 淮北市| 绿春县| 扎兰屯市| 平原县| 鄢陵县| 从江县| 犍为县| 白水县|