<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è) > 嵌入式系統 > 設計應用 > 單片機中斷問(wèn)題30例

單片機中斷問(wèn)題30例

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

定時(shí)器1中斷:當定時(shí)器1計數到FFFF溢出時(shí)

串口中斷:串口接收到一幀?;虬l(fā)送完一幀數據都會(huì )產(chǎn)生中斷。

你網(wǎng)上找一下TCON和SCON。什么條件讓中斷標志位的值改變。 那么就會(huì )進(jìn)入中斷服務(wù)程序去。

23、51,如果中斷函數比較長(cháng),執行到一半又觸發(fā)了這個(gè)中斷,程序會(huì )停止從頭執行,還是執行結束后響應中

答:

51中,中斷分高低兩個(gè)優(yōu)先級,高優(yōu)先級的中斷能打斷低優(yōu)先級的中斷。

但同級中斷是不能打斷同級中斷的!無(wú)論該中斷函數有多長(cháng),在執行到一半這個(gè)中斷又發(fā)生了,還是要等到該中斷函數執行完畢,并再執行了一條主程序指令后才會(huì )再次進(jìn)入該中斷。

不過(guò),若樓主恰好在這個(gè)低優(yōu)先級中斷服務(wù)程序中修改了該中斷為高優(yōu)先級,那么如果該中斷函數比較長(cháng),執行到一半又觸發(fā)了這個(gè)中斷,則該中斷函數就會(huì )被重新從頭開(kāi)始執行(中斷嵌套)。這是因為除串口中斷以外的其他中斷,在 CPU 響應該中斷,程序轉入該中斷函數前就已經(jīng)將該中斷的中斷標志清零了。

另外,51的串口中斷比較特別,因為需要軟件清除串口中斷標志,所以只要在未清串口中斷標志前,是不會(huì )發(fā)生上述這樣的中斷嵌套的。

24、求51程序,兩個(gè)計數器,主要是中斷函數的函數名以及初始化設置

答:

void into_into() interrupt 1 定時(shí)器0中斷入口函數

{

。。。。中斷服務(wù)程序。。。。

TH0=0;//

TL0=0;// 重新給T0賜值

}

void into_into() interrupt 3 定時(shí)器1中斷入口函數

{

。。。。中斷服務(wù)程序。。。。

TH1=0;//

TL1=0;// 重新給T1賜值

}

void to_to()

{

TMOD=0x11; //頂時(shí)器T0和T1工作方式1

TH0=0;//

TL0=0;// T0賜初值

TH1=0;//

TL1=0// T1賜初值

TR0=1;// 開(kāi)始記數

ET0=1;// 允許T0中斷

TR1=1;// 開(kāi)始記數

ET1=1;// 允許T1中斷

EA=1; // 打開(kāi)總中斷

}

void main()

{

INIT_T0(); //定時(shí)器中斷初始化

while(1)

{

...........

}

25、請教一個(gè)單片機中斷的問(wèn)題:比如來(lái)了一個(gè)脈沖,開(kāi)始中斷,但中斷里的程序執行到一半時(shí),又來(lái)了一個(gè)脈沖,請問(wèn)這時(shí)中斷里的程序是從頭開(kāi)始呢還是繼續呢?

我的意思是程序就一個(gè)中斷A,來(lái)了一個(gè)脈沖,A執行,A執行到一半時(shí),又來(lái)了一個(gè)脈沖,通知A執行。這時(shí)A是從頭執行還是先不理會(huì )呢?

答:

需要具體情況具體分析,因為不同的單片機在中斷機制上有細微的差別,需要查他的資料。

一般來(lái)說(shuō),一個(gè)中斷源請求中斷,對CPU來(lái)說(shuō),是一次性的做了一個(gè)“中斷掛號”。假如當時(shí)因條件不滿(mǎn)足(例如CPU正在“關(guān)中斷”,即沒(méi)有打開(kāi)“中斷允許”),而沒(méi)有響應中斷,則掛號信息還在,這樣,將來(lái)一旦打開(kāi)了中斷允許,仍然會(huì )響應,只是晚了一點(diǎn)而已。

而中斷響應以后,必須有辦法把這個(gè)“中斷掛號”消除掉。有的CPU的功能是:只要響應了這個(gè)中斷,掛號就自動(dòng)消除了。也有的CPU不能自動(dòng)清除掛號,必須在中斷服務(wù)程序中編入“清除中斷掛號”的操作,否則,一旦打開(kāi)了中斷允許,它又會(huì )重復發(fā)生中斷。

現在的大多數單片機里,中斷控制器和CPU是在同一個(gè)芯片中,它可以做到自動(dòng)消除中斷掛號。而過(guò)去許多種CPU,所配用的中斷控制器是另外一個(gè)芯片,自然就無(wú)法自動(dòng)消除了。

也有的CPU中有另外一種“不掛號”的中斷請求。它必須由外界(發(fā)出中斷請求的那個(gè)設備)來(lái)保持一直不停申請,等到響應中斷的時(shí)候,再設法(例如,在中斷服務(wù)程序中發(fā)出一個(gè)輸出信號)通知那個(gè)設備撤銷(xiāo)申請。

大多數的CPU中,一旦響應中斷進(jìn)入了服務(wù)程序,就把“中斷允許”關(guān)掉了。故此時(shí)如果又有下一個(gè)中斷請求來(lái)了,不能立即響應,只能掛一個(gè)號,等以后“開(kāi)中斷”時(shí)才能再響應。如果程序員希望能夠“嵌套中斷”(即在一次中斷服務(wù)程序的執行中途又進(jìn)入了另一個(gè)中斷服務(wù)程序),就需要在服務(wù)程序內編入“開(kāi)中斷”的操作。

“嵌套中斷”原則上允許“自己嵌套自己”,也就是說(shuō),一次中斷服務(wù)程序的執行中途又被打斷并進(jìn)入了和自己一樣的中斷服務(wù)程序,并從頭到尾執行一遍,結束后返回到先前打斷的那一點(diǎn),并繼續執行后半截服務(wù)程序。這種情況會(huì )產(chǎn)生什么效果,是需要程序員自己考慮的。

也有的CPU具有“優(yōu)先次序”機制,可以在某一級的中斷服務(wù)程序里禁止優(yōu)先級不比自己高的其他中斷來(lái)打斷自己。同時(shí),也提供給程序員有“放棄優(yōu)先權”以及“修改優(yōu)先級”的靈活性。

而被優(yōu)先機制暫時(shí)“屏蔽”的那些較低優(yōu)先級的中斷申請,同樣掛號仍在,以后高優(yōu)先級的中斷結束以后,還能響應。

不過(guò)需要注意,大多數的CPU中,“中斷掛號”是只能掛一個(gè)的。也就是說(shuō),在前一次的中斷申請所掛的號還沒(méi)有被清除以前,又來(lái)了下一個(gè)中斷申請,那么,第二個(gè)掛號是掛不上的。

不過(guò)某些處理器中,中斷掛號可能分成幾個(gè)層次:CPU里面是一層,外圍針對各個(gè)具體的設備,還有另外一級“預備掛號”,那就比較復雜了。

另外多說(shuō)幾句:上面已經(jīng)說(shuō),程序員可以自己決定你的中斷服務(wù)程序允許還是不允許“嵌套”。

如果不允許,您可以采用關(guān)中斷的辦法,或者利用優(yōu)先機制,來(lái)屏蔽同一中斷源的第二個(gè)中斷請求。

這樣,第二個(gè)中斷就不會(huì )被響應。但它仍可以?huà)焐弦粋€(gè)號(只要它發(fā)生在上一個(gè)中斷掛號已經(jīng)被清除掉以后的時(shí)間)。然后,中斷服務(wù)程序結束時(shí),一般都會(huì )開(kāi)中斷并釋放優(yōu)先級屏蔽。然后,第二個(gè)中斷請求就會(huì )被響應,于是再一次執行中斷服務(wù)程序。

如果允許“嵌套”,那就會(huì )如我上面所說(shuō):

一次中斷服務(wù)程序的執行中途又被打斷并進(jìn)入了和自己一樣的中斷服務(wù)程序,并從頭到尾執行一遍,結束后返回到先前打斷的那一點(diǎn),并繼續執行后半截服務(wù)程序。



評論


相關(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>