<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 51單片機中斷多優(yōu)先級的軟件擴展方法

51單片機中斷多優(yōu)先級的軟件擴展方法

作者: 時(shí)間:2011-12-28 來(lái)源:網(wǎng)絡(luò ) 收藏

1 引言

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

2 中斷多優(yōu)先級的擴展

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

3 軟件擴展方法

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

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

PUSH IE ;IE內容入棧保護

MOV IE , #10010000B ;開(kāi)放串行口中斷

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

隨時(shí)響應串行口中斷請求

...

POP IE ;恢復原IE內容

RETI

PP: RETI

3.2 同級中斷源之間的響應

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

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 ;開(kāi)放所有中斷

MOV IP,#03H ;設定INT0、T0為高優(yōu)先級

SJMP $

X0: PUSH DPL

PUSH DPH

MOV DPTR,#X0RL

PUSH DPL

PUSH DPH

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

觸發(fā)器,此時(shí)可響應其它中斷請求

X0RL:· ;INT0子程序的真實(shí)入口地址

·

·

·

POP DPH

POP DPL

RETI

T0: PUSH DPL

PUSH DPH

MOV DPTR,#T0RL

PUSH DPL

PUSH DPH

RETI ;(PC)=T0RL,清"高優(yōu)先級生效"

觸發(fā)器,此時(shí)可響應其它中斷請求

T0RL: · ;T0子程序的真實(shí)入口地址

·

·

·

POP DPH

POP DPL

RETI

X1: PUSH DPL

PUSH DPH

MOV DPTR,#X1RL

PUSH DPL

PUSH DPH

RETI ;(PC)=X1RL,清“高優(yōu)先級生效”

觸發(fā)器,此時(shí)可響應其它中斷請求

X1RL: · ;INT1子程序的真實(shí)入口地址

·

·

·

POP DPH

POP DPL

RETI

T1: PUSH DPL

PUSH DPH

MOV DPTR,#T1RL

PUSH DPL

PUSH DPH

RETI ;(PC)=T1RL,清"高優(yōu)先級生效"

觸發(fā)器,此時(shí)可響應其它中斷請求

T1RL: · ;T1子程序的真實(shí)入口地址

·

·

·

POP DPH

POP DPL

RETI

SS: PUSH DPL

PUSH DPH

MOV DPTR,#SSRL

PUSH DPL

PUSH DPH

RETI ;(PC)=SSRL,清"高優(yōu)先級生效"

觸發(fā)器,此時(shí)可響應其它中斷請求

SSRL: · ;串行口子程序的真實(shí)入口地址

·

·

·

POP DPH

POP DPL

RETI

上述程序利用IP寄存器給出了兩級優(yōu)先級,其中INT0、T0為高優(yōu)先級,INT1、T1串行口為低優(yōu)先級。為使某中斷能響應同級甚至低級中斷,只要在中斷服務(wù)子程序中用RETI指令清除相應的不可尋址的“優(yōu)先級生效”觸發(fā)器即可。程序一開(kāi)始的兩條PUSH指令的作用是對原始數據進(jìn)行入棧保護(如此時(shí)DPTR中的數據不需保留,則這兩條壓棧指令也可不要,相應的彈棧指令也可不要),然后將其真實(shí)子程序入口地址入棧,并經(jīng)RETI出棧后彈給PC指針,以便在執行完RETI后正確執行真實(shí)子程序。當該中斷服務(wù)子程序執行完畢后,RETI將返回主程序斷點(diǎn)處以繼續執行原來(lái)程序。

4 結束語(yǔ)

本文所闡述的多優(yōu)先級擴展方法是純軟件方法,該方法只需在程序中加入為數不多的相應代碼,便可進(jìn)行各種中斷嵌套(如同優(yōu)先級響應或高優(yōu)先級響應低優(yōu)先級等)。此方法的代價(jià)是要花費更多的中斷響應時(shí)間,但相對于添加硬件擴展的方法而言,這點(diǎn)代價(jià)還是值得的。



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>