?? 請問irq中斷過程是怎樣的?.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0060)http://www.embedinfo.com/chinese/support/faqhtm/18000007.htm -->
<HTML><HEAD><TITLE>請問IRQ中斷過程是怎樣的?</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<STYLE>BODY {
FONT-WEIGHT: normal; FONT-SIZE: 10pt; LINE-HEIGHT: 15px; FONT-STYLE: normal; FONT-FAMILY: "宋體","System"; TEXT-DECORATION: none
}
TABLE {
FONT-SIZE: 10pt; LINE-HEIGHT: 1.6; FONT-FAMILY: "宋體","System"
}
P {
FONT-SIZE: 10.5pt; FONT-FAMILY: "宋體","System"
}
</STYLE>
<META content="MSHTML 6.00.2800.1106" name=GENERATOR></HEAD>
<BODY leftMargin=0 topMargin=0><!-- embest help header --><IMG height=73
src="請問IRQ中斷過程是怎樣的?.files/Faq.gif" width=778 border=0> <!-- embest help header --><!-- 文章顯示 -->
<DL><D>
<P align=center><B><FONT face=黑體 color=#000000
size=4>請問IRQ中斷過程是怎樣的?</FONT></B></P></DL><!-- 問題 -->
<TABLE cellSpacing=0 cellPadding=5 width="94%" bgColor=white border=0>
<TBODY>
<TR>
<TD width="5%"> </TD>
<TD colSpan=2>
<HR color=#999999>
</TD></TR>
<TR>
<TD width="5%"> </TD>
<TD vAlign=top width="10%"><FONT color=blue>問題:</FONT></TD>
<TD width="85%"><FONT color=blue>IRQ中斷過程</FONT></TD></TR></TBODY></TABLE><!-- 回答 -->
<DIV>
<TABLE cellSpacing=0 cellPadding=5 width="94%" bgColor=white border=0>
<TBODY>
<TR></TR>
<TR>
<TR>
<TD width="5%"> </TD>
<TD width="95%" colSpan=2>
<HR color=#999999>
</TD></TR>
<TR>
<TD width="5%"> </TD>
<TD vAlign=top width="10%"><FONT color=black>回答:</FONT></TD>
<TD width="85%"><FONT color=black>標準中斷步驟(IRQ):
<BR>1. AIC已經(jīng)正確編程,AIC_SVR也已經(jīng)寫入正確的中斷服務(wù)程序的入口地址。且中斷已經(jīng)使能
<BR>2. 地址0x18(IRQ的中斷向量地址)的指令為
<BR>LDR PC,[PC,#&F20]
<BR>當NIRQ到來,且CPSR的I位為0時,步驟如下:
<BR>① CPSR被拷貝到SPSR_irq,當前程序計數(shù)器PC的值被保存到IRQ鏈接寄存器(R14_irq),同時PC(R15)自身也被賦予了新值0x18。在接下來的時鐘里(處理器向0x1C取指令),ARM核使R14_ irq減4
<BR>②ARM內(nèi)核進入IRQ模式
<BR>③當指令LDR PC,[PC,#&F20]得到執(zhí)行(ARM為流水線結(jié)構(gòu),當前PC之前還有兩條指令)后,
<BR>PC被賦予了AIC_IVR的內(nèi)容。讀取AIC_IVR具有如下作用:
<BR>·將當前中斷設(shè)置為被掛起的最高優(yōu)先級中斷,并把它作為最高優(yōu)先級的中斷;當前中斷級別則 <BR>設(shè)置為此中斷的優(yōu)先級。
<BR>·將NIRQ的信號撤消(即使系統(tǒng)沒有用到向量功能,也必須去讀AIC_IVR,以便將NIRQ撤消)。
<BR>·如果中斷為邊沿觸發(fā),則讀取AIC_IVR會自動將中斷清除 <BR>·將當前的中斷的優(yōu)先級推入堆棧
<BR>·返回當前中斷的AIC_SVR的值。
<BR>④上述步驟將程序跳到了對應(yīng)的中斷服務(wù)程序。接下來的第一步是保存鏈接寄存器LR(R14_irq)
<BR>和SPSR(SPSR_irq)。如果需要在中斷返回時,把LR的值直接賦給程序計數(shù)器,則LR首先要減去4
<BR>才能保存。否則在中斷返回時,LR要首先減去4之后才能拷貝給PC。
<BR>⑤清零CPSR的位I就可以使其他中斷不被屏蔽,再施加的NIRQ可以被內(nèi)核接受。只要發(fā)生的中斷的
<BR>優(yōu)先級高于當前中斷的優(yōu)先級,嵌套中斷就會發(fā)生。
<BR>⑥接著中斷例程可以保存相應(yīng)的寄存器以保護現(xiàn)場。如果此時有高優(yōu)先級中斷發(fā)生,則處理器將
<BR>重復(fù)執(zhí)行從步驟①開始的動作。要注意的是,如果中斷是電平敏感的,那么在中斷結(jié)束前要清除 <BR>中斷源。
<BR>⑦在退出中斷前要首先置位CPSR的位I,以便屏蔽其他中斷,保證多個中斷有序地完成。
<BR>⑧在結(jié)束中斷之前還必須執(zhí)行一次對AIC_EOICR的寫操作,向AIC表明中斷已經(jīng)完成。存放于堆棧
<BR>的前一個當前中斷優(yōu)先級將被彈出并作為當前中斷優(yōu)先級。如果此時系統(tǒng)又有一個掛起的中斷,
<BR>其優(yōu)先級比剛才結(jié)束的中斷的優(yōu)先級低(或相等)、但又高于從堆棧彈出來的中斷的優(yōu)先級,則
<BR>將重新施加NIRQ;但是,中斷步驟不會立即開始,因為此時CPSR的I位是置位的。
<BR>⑨SPSR(SPSR_irq)被恢復(fù)。最后是鏈接寄存器LR恢復(fù)到PC。程序返回到中斷發(fā)生前之處。 SPSR
<BR>也恢復(fù)為CPSR,中斷屏蔽狀態(tài)恢復(fù)為SPSR所指明的狀態(tài)。
<BR>注:SPSR的位I是很重要的。如果在SPSR恢復(fù)之后為置位狀態(tài),則表明ARM核正要屏蔽中斷,在執(zhí)
<BR>行屏蔽指令時被中斷。因此,SPSR恢復(fù)后,屏蔽指令得以完成,亦即I被置位, <BR>因而IRQ 被屏蔽。
</FONT></TD></TR></TBODY></TABLE></DIV></BODY></HTML>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -