粵振百科
單片機(jī)中斷多優(yōu)先級(jí)的軟件擴(kuò)展方法
中斷多優(yōu)先級(jí)的擴(kuò)展
根據(jù)8051的結(jié)構(gòu)特點(diǎn),其中斷系統(tǒng)中含有兩個(gè)不可尋址的“優(yōu)先級(jí)生效”觸發(fā)器。一個(gè)用于指出CPU是否正在執(zhí)行高優(yōu)先級(jí)的中斷服務(wù)程序,這個(gè)觸發(fā)器為1時(shí),系統(tǒng)將屏蔽所有的中斷請(qǐng)求;另一個(gè)則指出CPU是否正在執(zhí)行低優(yōu)先級(jí)中斷服務(wù)程序,該觸發(fā)器為1時(shí),將阻止除高優(yōu)先級(jí)以外的一切中斷請(qǐng)求。由此可見,若要響應(yīng)同級(jí)甚至是低級(jí)中斷請(qǐng)求,必須使得該“優(yōu)先級(jí)生效”觸發(fā)器清零。但該觸發(fā)器又是不可尋址的,所以無(wú)法用軟件直接清零。遍歷系統(tǒng)所提供的111條指令,只有RETI可以達(dá)到此目的。該指令可在CPU?qǐng)?zhí)行該指令時(shí),一方面清除中斷響應(yīng)時(shí)所置位的“優(yōu)先級(jí)生效”觸發(fā)器,另一方面可從當(dāng)前棧頂彈出斷點(diǎn)地址送入程序計(jì)數(shù)PC,從而返回主程序。
軟件擴(kuò)展方法
高級(jí)中斷源響應(yīng)低級(jí)中斷源的軟件設(shè)計(jì)
現(xiàn)以當(dāng)前IE=84H(開放外部中斷1及總控制位),IP=04H設(shè)定INT1為高優(yōu)先級(jí) 正在執(zhí)行外部中斷1服務(wù)子程序?yàn)槔齺?lái)進(jìn)行說(shuō)明。如欲響應(yīng)串行口中斷,也就是要實(shí)現(xiàn)高級(jí)中斷源響應(yīng)低級(jí)中斷源,設(shè)計(jì)時(shí)可加入如下代碼而無(wú)須改變IP寄存器的內(nèi)容:
PUSH IE ;IE內(nèi)容入棧保護(hù)
MOV IE , #10010000B ;開放串行口中斷
CALL PP ;繼續(xù)執(zhí)行原中斷子程序,但可
隨時(shí)響應(yīng)串行口中斷請(qǐng)求
...
POP IE ;恢復(fù)原IE內(nèi)容
RETI
PP: RETI
同級(jí)中斷源之間的響應(yīng)
上述代碼體現(xiàn)了高級(jí)中斷源(INT1)響應(yīng)低級(jí)中斷源(串行口)的軟件實(shí)現(xiàn)方法。但是, 8051系統(tǒng)共含有5個(gè)中斷源,因此必須解決同優(yōu)先級(jí)中斷之間的嵌套問(wèn)題,具體源程序如下:
view plaincopy to clipboardprint?
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 ;設(shè)定INT0、T0為高優(yōu)先級(jí)
SJMP $
X0: PUSH DPL
PUSH DPH
MOV DPTR,#X0RL
PUSH DPL
PUSH DPH
RETI ;(PC)=X0RL,清"高優(yōu)先級(jí)生效"
觸發(fā)器,此時(shí)可響應(yīng)其它中斷請(qǐng)求
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)先級(jí)生效"
觸發(fā)器,此時(shí)可響應(yīng)其它中斷請(qǐng)求
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)先級(jí)生效”
觸發(fā)器,此時(shí)可響應(yīng)其它中斷請(qǐng)求
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)先級(jí)生效"
觸發(fā)器,此時(shí)可響應(yīng)其它中斷請(qǐng)求
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)先級(jí)生效"
觸發(fā)器,此時(shí)可響應(yīng)其它中斷請(qǐng)求
SSRL: · ;串行口子程序的真實(shí)入口地址
·
·
·
POP DPH
POP DPL
RETI
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 ;設(shè)定INT0、T0為高優(yōu)先級(jí)
SJMP $
X0: PUSH DPL
PUSH DPH
MOV DPTR,#X0RL
PUSH DPL
PUSH DPH
RETI ;(PC)=X0RL,清"高優(yōu)先級(jí)生效"
觸發(fā)器,此時(shí)可響應(yīng)其它中斷請(qǐng)求
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)先級(jí)生效"
觸發(fā)器,此時(shí)可響應(yīng)其它中斷請(qǐng)求
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)先級(jí)生效”
觸發(fā)器,此時(shí)可響應(yīng)其它中斷請(qǐng)求
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)先級(jí)生效"
觸發(fā)器,此時(shí)可響應(yīng)其它中斷請(qǐng)求
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)先級(jí)生效"
觸發(fā)器,此時(shí)可響應(yīng)其它中斷請(qǐng)求
SSRL: · ;串行口子程序的真實(shí)入口地址
·
·
·
POP DPH
POP DPL
RETI
上述程序利用IP寄存器給出了兩級(jí)優(yōu)先級(jí),其中INT0、T0為高優(yōu)先級(jí),INT1、T1串行口為低優(yōu)先級(jí)。為使某中斷能響應(yīng)同級(jí)甚至低級(jí)中斷,只要在中斷服務(wù)子程序中用RETI指令清除相應(yīng)的不可尋址的“優(yōu)先級(jí)生效”觸發(fā)器即可。程序一開始的兩條PUSH指令的作用是對(duì)原始數(shù)據(jù)進(jìn)行入棧保護(hù)(如此時(shí)DPTR中的數(shù)據(jù)不需保留,則這兩條壓棧指令也可不要,相應(yīng)的彈棧指令也可不要),然后將其真實(shí)子程序入口地址入棧,并經(jīng)RETI出棧后彈給PC指針,以便在執(zhí)行完RETI后正確執(zhí)行真實(shí)子程序。當(dāng)該中斷服務(wù)子程序執(zhí)行完畢后,RETI將返回主程序斷點(diǎn)處以繼續(xù)執(zhí)行原來(lái)程序。
結(jié)束語(yǔ)
本文所闡述的多優(yōu)先級(jí)擴(kuò)展方法是純軟件方法,該方法只需在程序中加入為數(shù)不多的相應(yīng)代碼,便可進(jìn)行各種中斷嵌套(如同優(yōu)先級(jí)響應(yīng)或高優(yōu)先級(jí)響應(yīng)低優(yōu)先級(jí)等)。此方法的代價(jià)是要花費(fèi)更多的中斷響應(yīng)時(shí)間,但相對(duì)于添加硬件擴(kuò)展的方法而言,這點(diǎn)代價(jià)還是值得的。