• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 單片機中斷多優先級的軟件擴展方法

    單片機中斷多優先級的軟件擴展方法

    ——
    作者:廣東工業大學信息工程學院 張 輝 時間:2007-09-10 來源:國外電子元器件 收藏

      摘要:為了解決MCS-51系列只能由IP設定兩級的問題,文中給出了利用軟件對進行擴展的方法,同時給出了高于兩個的多優先級軟件擴展程序。

        關鍵詞:;優先級;

    1 引言

      所謂是指當CPU正在處理某件事情的時候,外部發生的某一事件(如一個電平的變化,一個脈沖沿的發生或定時器計數溢出等)請求CPU迅速去處理,于是CPU暫時中止當前的工作,轉去處理所發生的事件。中斷服務處理完該事件以后,再回到原來被中止的地方繼續原來的工作,這樣的一個過程稱之為中斷。以8051為例,中斷系統含有5個中斷源,分別是外部中斷0請求(INT0),外部中斷1請求(INT1),定時/計數器0溢出中斷請求(T0),定時/計數器1溢出中斷請求(T1)以及串行口中斷請求(Tx/Rx)。既然系統含有5個中斷源,就有可能出現數個中斷源同時提出中斷請求的情況,這樣,設計人員必須事先根據它們的輕重緩急來為每個中斷源確定CPU對其的響應順序。然而,對于中斷優先級IP來說,只可能設定兩級優先,即控制位為1時對應的中斷源為高級中斷,反之,控制位為0時對應的為低級中斷。這樣就出現一個問題:如果一個中斷正在執行,如何才能讓它響應同級甚至是低級中斷請求呢?

    2 中斷多優先級的擴展

      根據8051的結構特點,其中斷系統中含有兩個不可尋址的“優先級生效”觸發器。一個用于指出CPU是否正在執行高優先級的中斷服務程序,這個觸發器為1時,系統將屏蔽所有的中斷請求;另一個則指出CPU是否正在執行低優先級中斷服務程序,該觸發器為1時,將阻止除高優先級以外的一切中斷請求。由此可見,若要響應同級甚至是低級中斷請求,必須使得該“優先級生效”觸發器清零。但該觸發器又是不可尋址的,所以無法用軟件直接清零。遍歷系統所提供的111條指令,只有RETI可以達到此目的。該指令可在CPU執行該指令時,一方面清除中斷響應時所置位的“優先級生效”觸發器,另一方面可從當前棧頂彈出斷點地址送入程序計數PC,從而返回主程序。

    3 軟件擴展方法

    3.1 高級中斷源響應低級中斷源的軟件設計

      現以當前IE=84H(開放外部中斷1及總控制位),IP=04H設定INT1為高優先級正在執行外部中斷1服務子程序為例來進行說明。如欲響應串行口中斷,也就是要實現高級中斷源響應低級中斷源,設計時可加入如下代碼而無須改變IP寄存器的內容:

    PUSH IE ;IE內容入棧保護

    MOV IE , #10010000B ;開放串行口中斷

    CALL PP ;繼續執行原中斷子程序,但可

    隨時響應串行口中斷請求

    ...

    POP IE ;恢復原IE內容

    RETI

    PP: RETI

    3.2 同級中斷源之間的響應

      上述代碼體現了高級中斷源(INT1)響應低級中斷源(串行口)的軟件實現方法。但是, 8051系統共含有5個中斷源,因此必須解決同優先級中斷之間的嵌套問題,具體源程序如下:

    ORG 0000H

    LJMP MAIN

    ORG 0003H

    LJMP X0 ;INT0入口地址

    ORG 000BH

    LJMP T0 ;T0入口地址

    ORG 0013H

    LJMP X1 ;INT1入口地址

    ORG 001BH

    LJMP T1 ;T1入口地址

    ORG 0023H

    LJMP SS ;串行口入口地址

    MAIN: MOV IE ,#9FH ;開放所有中斷

    MOV IP,#03H ;設定INT0、T0為高優先級

    SJMP $

    X0: PUSH DPL

    PUSH DPH

    MOV DPTR,#X0RL

    PUSH DPL

    PUSH DPH

    RETI ;(PC)=X0RL,清"高優先級生效"

    觸發器,此時可響應其它中斷請求

    X0RL:



    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 罗定市| 叙永县| 政和县| 荔波县| 卓资县| 邛崃市| 天柱县| 农安县| 兰坪| 永州市| 从化市| 米脂县| 黄冈市| 昆明市| 新宁县| 巴马| 武汉市| 墨江| 吉首市| 亚东县| 平度市| 新乡市| 府谷县| 蒲城县| 吕梁市| 肥城市| 海丰县| 太康县| 松阳县| 富川| 芷江| 宁国市| 铅山县| 聂拉木县| 民县| 清镇市| 普兰县| 崇左市| 南和县| 云和县| 孝义市|