新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機_C語言函數_中斷函數(中斷服務程序)

        單片機_C語言函數_中斷函數(中斷服務程序)

        作者: 時間:2016-11-24 來源:網絡 收藏
        在開始寫中斷函數之前,我們來一起回顧一下,單片機中斷系統

        中斷的意思(學習過微機原理與接口技術的同學,沒學過單片機,也應該知道),我們在這里就不講了,首先來回憶下中斷系統涉及到哪些問題。

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

        (1)中斷源:中斷請求信號的來源。(8051有3個內部中斷源T0,T1,串行口,2個外部中斷源INT0,INT1(這兩個低電平有效,上面的那個橫杠不知道怎么加上去))

        (2)中斷響應與返回:CPU采集到中斷請求信號,怎樣轉向特定的中斷服務子程序,并在執行完之后返回被中斷程序繼續執行。期間涉及到CPU響應中斷的條件,現場保護,現場恢復。

        (3)優先級控制:中斷優先級的控制就形成了中斷嵌套(8051允許有兩級的中斷嵌套,優先權順序為INT0,T0,INT1,T1,串行口),同一個優先級的中斷,還存在優先權的高低。優先級是可以編程的,而優先權是固定的。

        80C51的原則是①同優先級,先響應高優先權②低優先級能被高優先級中斷③正在進行的中斷不能被同一級的中斷請求或低優先級的中斷請求中斷。

        80C51的中斷系統涉及到的中斷控制有中斷請求,中斷允許,中斷優先級控制

        (1)3個內部中斷源T0,T1,串行口,2個外部中斷源INT0,INT1

        (2)中斷控制寄存器:定時和外中斷控制寄存器TCON(包括T0、T1,INT0、INT1),串行控制寄存器SCON,中斷允許寄存器IE,中斷優先級寄存器IP

        具體的是什么,包括哪些標志位,在這里不講了,所有書上面都會講。

        在這里我們講下注意的事項

        (1)CPU響應中斷后,TF0(T0中斷標志位)和TF1由硬件自動清0。

        (2)CPU響應中斷后,在邊沿觸發方式下,IE0(外部中斷INT0請求標志位)和IE1由硬件自動清零;在電平觸發方式下,不能自動清楚IE0和IE1。所以在中斷返回前必須撤出INT0和INT1引腳的低電平,否則就會出現一次中斷被CPU多次響應。

        (3)串口中斷中,CPU響應中斷后,TI(串行口發送中斷請求標志位)和RI(接收中斷請求標志位)必須由軟件清零。

        (4)單片機復位后,TCON,SCON給位清零。

        C51語言允許用戶自己寫中斷服務子程序(中斷函數)

        首先來了解程序的格式:

        void 函數名() interrupt m [using n]

        {}

        關鍵字interrupt m [using n]表示這是一個中斷函數

        m為中斷源的編號,有五個中斷源,取值為0,1,2,3,4,中斷編號會告訴編譯器中斷程序的入口地址,執行該程序時,這個地址會傳個程序計數器PC,于是CPU開始從這里一條一條的執行程序指令。

        n為單片機工作寄存器組(又稱通用寄存器組)編號,共四組,取值為0,1,2,3

        中斷號 中斷源
        0 外部中斷0
        1 定時器0
        2 外部中斷1
        3 定時器1中斷
        4 串行口中斷

        這5個中斷源的中斷入口地址為:(在上一篇文章中講到的ROM前43個存儲單元就是他們,這40個地址用來存放中斷處理程序的地址單元,每一個類中斷的存儲單元只有8B,顯然不是中斷處理的程序,而是存放著中斷處理程序的真正地址)

        INT0:0003H 0

        T0:000BH 1

        INT1:0013H 2

        T1: 001BH3

        串口: 0023H 4

        中斷向量(中斷入口地址)= 中斷號x8 +3

        前面m意思很清楚,不同的m值表示這個函數是針對不同的中斷源,比如m為1是表示它是定時器0的中斷函數,

        如void time0() interrupt 1{}

        那么后面的using n 又是什么意思呢?在正在執行一個特定任務時,有更緊急的事情需要CPU來處理,涉及到中斷優先權。高優先權中斷低優先權正在處理的程序,所以最好給每個優先程序分配不同的寄存器組。

        CPU正在處理某個事件,突然另外一個事件需要處理,于是進入中斷后,而你不想將現在執行的程序的各寄存器狀態入棧,那么可以把這個中斷程序放入另一個寄存器組,如切換到1組,然后退出中斷時,再切回到0組(原來的程序在0組)。

        為了更好的了解這里意思,你可以看看工作寄存器組的作用是什么。

        下面的注意事項轉自網絡上其他朋友的文章(整理下,重復的去掉了,寫的非常好):

        (1)中斷函數不能進行參數傳遞
        (2)中斷函數沒有返回值
        (3)在任何情況下都不能直接調用中斷函數

        (4)中斷函數使用浮點運算要保存浮點寄存器的狀態。
        (5)如果在中斷函數中調用了其它函數,則被調用函數所使用的寄存器必須與中斷函數相同,被調函數最好設置為可重入的。
        (6)C51編譯器對中斷函數編譯時會自動在程序開始和結束處加上相應的內容,具體如下:在程序開始處對ACC、B、DPH、DPL和PSW入棧,結束時出棧。中斷函數未加using n修飾符的,開始時還要將R0~R1入棧,結束時出棧。如中斷函數加using n修飾符,則在開始將PSW入棧后還要修改PSW中的工作寄存器組選擇位。
        (7)C51編譯器從絕對地址8m+3處產生一個中斷向量,其中m為中斷號,也即interrupt后面的數字。該向量包含一個到中斷函數入口地址的絕對跳轉。
        (8)中斷函數最好寫在文件的尾部,并且禁止使用extern存儲類型說明。防止其它程序調用。

        (9)在設計中斷時,要注意的是哪些功能應該放在中斷程序中,哪些功能應該放在主程序中。一般來說中斷服務程序應該做最少量的工作,這樣做有很多好處。首先系統對中斷的反應面更寬了,有些系統如果丟失中斷或對中斷反應太慢將產生十分嚴重的后果,這時有充足的時間等待中斷是十分重要的。其次它可使中斷服務程序的結構簡單,不容易出錯。中斷程序中放入的東西越多,他們之間越容易起沖突。簡化中斷服務程序意味著軟件中將有更多的代碼段,但可把這些都放入主程序中。中斷服務程序的設計對系統的成敗有至關重要的作用,要仔細考慮各中斷之間的關系和每個中斷執行的時間,特別要注意那些對同一個數據進行操作的ISR.



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 宜黄县| 潜江市| 常熟市| 孟村| 逊克县| 淮北市| 巴青县| 肇东市| 阿克陶县| 环江| 新丰县| 门头沟区| 江安县| 滦南县| 浦县| 德令哈市| 普兰店市| 巫溪县| 定州市| 牙克石市| 武义县| 德清县| 正宁县| 岗巴县| 岢岚县| 喀喇沁旗| 慈溪市| 中超| 古浪县| 扶沟县| 莱州市| 上虞市| 延边| 舒城县| 望奎县| 腾冲县| 永丰县| 宜章县| 建平县| 上高县| 天全县|