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

PIC單片機的中斷問(wèn)答

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

7. 如果同時(shí)發(fā)生多個(gè)中斷請求,則中斷處理的順序取決于中斷程序中的檢查順序。

8. 若要防止中斷請求被丟失:則要注意下面兩種情況:如果同一中斷發(fā)生間隔時(shí)間大于該中斷服務(wù)的處理時(shí)間,則可能出現中斷事件被忽略(體現在中斷服務(wù)的過(guò)程中,標志位被連續發(fā)生來(lái)兩次置位),例如:中斷事件發(fā)生的時(shí)間間隔為30ms,中斷服務(wù)處理加上跳轉判斷的時(shí)間為50ms,則情況將會(huì )如下所示:

[中斷次數----------1][中斷次數----------2][中斷次數----------3][中斷次數----------4]

[處理次數------------------------1][處理次數------------------------2][處理次數------------------------4]

如果在中斷處理一開(kāi)始就清除IF,那么如上圖所示,中斷事件3、4 在處理次數2的過(guò)程中發(fā)生來(lái)兩次,那么即使IF清除發(fā)生在中斷次數3發(fā)生之前,也將丟失第三次中斷。

另外,即使中斷出現的時(shí)間間隔大于中斷服務(wù)的時(shí)間間隔,如果清除中斷標志位的指令安排在中斷服務(wù)子程序的尾部,就有可能造成丟失該中斷請求(即兩次中斷標志置位的事件只對應一條清除指令和一次中斷處理。

9. 在進(jìn)行查表操作時(shí)必須禁止CPU響應中斷,以避免中斷返回時(shí)跳轉到不希望的地址上去。

三、一個(gè)疑惑

一個(gè)疑問(wèn):一些書(shū)上提到:如果對寄存器INTCON進(jìn)行“讀-改-寫(xiě)”操作的時(shí)候,要事先將GIE清0,再對INTCON進(jìn)行操作,然后將GIE恢復為1

即BCF INTCON,GIE

BSF INTCON,XX

BSF INTCON,GIE

所提到的理由是:當CPU正在執行一條對INTCON寄存器進(jìn)行“讀-改-寫(xiě)”操作的指令時(shí),如果恰好發(fā)生了中斷請求,則中斷服務(wù)程序會(huì )被執行兩次。這是因為當中斷請求發(fā)生后INTCON寄存器的GIE寄存器會(huì )被硬件自動(dòng)清零(屏蔽所有中斷),并且程序轉入中斷例程入口(0004h)。當GIE被清零后,這時(shí)如果CPU正在執行一條對INTCON“讀-改-寫(xiě)”的指令時(shí),則GIE位還會(huì )被寫(xiě)會(huì )操作重新置1,這樣就會(huì )造成CPU兩次進(jìn)入中斷服務(wù)程序。

該段解釋晦澀難懂,根據中斷發(fā)生過(guò)程的時(shí)序(PICmicro中檔單片機系列參考手冊的第8-2頁(yè)):在第n個(gè)指令周期里,CPU檢測到IF標志位為1,則在n+1個(gè)周期內將自動(dòng)使得GIE=0,該周期內既不取指也不執行指令,然后在n+2個(gè)指令周期里,0004h指針裝入PC指針,該周期也不運行其他指令,只完成0004H->(PC)的取指過(guò)程,第n+3個(gè)指令周期里,CPU執行0004h地址的指令碼,并同時(shí)取0005h的指令碼。

顯然,作者提到的“當GIE被清零后,這時(shí)如果CPU正在執行一條對INTCON“讀-改-寫(xiě)”的指令時(shí),則GIE位還會(huì )被寫(xiě)會(huì )操作重新置1,這樣就會(huì )造成CPU兩次進(jìn)入中斷服務(wù)程序?!钡慕忉尨嬖谙旅娴膯?wèn)題:GIE被硬件自動(dòng)清零時(shí)的那個(gè)周期,是一個(gè)空運行周期,CPU并不執行指令,下一個(gè)周期也是空運行周期,不過(guò)是完成將0004h地址中的代碼取指操作。然后就開(kāi)始了0004h地址的代碼的執行操作和0005h地址代碼的取指過(guò)程。那么GIE在被硬件自動(dòng)清零后要想置會(huì )1,只有兩種方法:RETFIE指令使GIE自動(dòng)置1;通過(guò)軟件指令對GIE人為置1。顯然,如果對GIE人為置1的指令執行在對該標志位清零前,那么會(huì )出現前文所述的中斷嵌套(設該中斷為A),如果沒(méi)有其他中斷發(fā)生且執行順序先于中斷A且對中斷A的標志清零的話(huà),那么中斷A的嵌套是一個(gè)死循環(huán)。就不是執行兩次的問(wèn)題了----因為同一個(gè)中斷嵌套時(shí),GIE在自動(dòng)清零被軟件置一永遠都發(fā)生在清除IF之前,那么IF一直得不到清除,而GIE又幾乎一直都是1。

作者所說(shuō)的情況似乎是這樣的:讀改寫(xiě)INTCON指令按如下過(guò)程分解:讀INTCON的時(shí)候,GIE先是為1的,此時(shí)發(fā)生了中斷,GIE被硬件清零,開(kāi)始執行中斷服務(wù)程序,然后再I(mǎi)F標志沒(méi)有清除之前,執行INTCON的其他位的修改和寫(xiě)回操作,也將中斷發(fā)生前的GIE讀為1的信息寫(xiě)回GIE,這樣,CPU被迫發(fā)生了第二次中斷。顯然,這樣是將BSF INTCON, XX指令分解得支離破碎---本來(lái)一個(gè)指令周期可以完成的指令被跨了多個(gè)指令周期;而且一個(gè)指令周期的指令被CPU在不同地址處分解執行讀改寫(xiě)過(guò)程。

如果不是這樣的話(huà),那么作者的解釋就自相矛盾:“當CPU正在執行一條對INTCON寄存器的‘讀-改-寫(xiě)’操作的指令時(shí),如果恰好發(fā)生了中斷請求 ”與“當GIE被清零后,這是如果CPU正在執行一條對INTCON‘讀-改-寫(xiě)’的指令時(shí)”相互矛盾。

總之,我對這里的理解存在一些疑惑,請斑竹及各位前輩指點(diǎn)。


上一頁(yè) 1 2 3 下一頁(yè)

評論


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