⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 请问irq中断过程是怎样的?.htm

📁 里面是关于arm中断的详细的资料
💻 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%">&nbsp;</TD>
    <TD colSpan=2>
      <HR color=#999999>
    </TD></TR>
  <TR>
    <TD width="5%">&nbsp;</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%">&nbsp;</TD>
    <TD width="95%" colSpan=2>
      <HR color=#999999>
    </TD></TR>
  <TR>
    <TD width="5%">&nbsp;</TD>
    <TD vAlign=top width="10%"><FONT color=black>回答:</FONT></TD>
    <TD width="85%"><FONT color=black>标准中断步骤(IRQ):&nbsp; 
      <BR>1.&nbsp;AIC已经正确编程,AIC_SVR也已经写入正确的中断服务程序的入口地址。且中断已经使能&nbsp; 
      <BR>2.&nbsp;地址0x18(IRQ的中断向量地址)的指令为&nbsp; 
      <BR>LDR&nbsp;&nbsp;&nbsp;&nbsp;PC,[PC,#&amp;F20]&nbsp; 
      <BR>当NIRQ到来,且CPSR的I位为0时,步骤如下:&nbsp; 
      <BR>①&nbsp;CPSR被拷贝到SPSR_irq,当前程序计数器PC的值被保存到IRQ链接寄存器(R14_irq),同时PC(R15)自身也被赋予了新值0x18。在接下来的时钟里(处理器向0x1C取指令),ARM核使R14_&nbsp;irq减4&nbsp; 
      <BR>②ARM内核进入IRQ模式&nbsp; 
      <BR>③当指令LDR&nbsp;&nbsp;&nbsp;&nbsp;PC,[PC,#&amp;F20]得到执行(ARM为流水线结构,当前PC之前还有两条指令)后,&nbsp; 
      <BR>PC被赋予了AIC_IVR的内容。读取AIC_IVR具有如下作用:&nbsp; 
      <BR>·将当前中断设置为被挂起的最高优先级中断,并把它作为最高优先级的中断;当前中断级别则&nbsp; <BR>设置为此中断的优先级。 
      &nbsp; <BR>·将NIRQ的信号撤消(即使系统没有用到向量功能,也必须去读AIC_IVR,以便将NIRQ撤消)。 &nbsp; 
      <BR>·如果中断为边沿触发,则读取AIC_IVR会自动将中断清除&nbsp; <BR>·将当前的中断的优先级推入堆栈&nbsp; 
      <BR>·返回当前中断的AIC_SVR的值。 &nbsp; 
      <BR>④上述步骤将程序跳到了对应的中断服务程序。接下来的第一步是保存链接寄存器LR(R14_irq)&nbsp; 
      <BR>和SPSR(SPSR_irq)。如果需要在中断返回时,把LR的值直接赋给程序计数器,则LR首先要减去4&nbsp; 
      <BR>才能保存。否则在中断返回时,LR要首先减去4之后才能拷贝给PC。 &nbsp; 
      <BR>⑤清零CPSR的位I就可以使其他中断不被屏蔽,再施加的NIRQ可以被内核接受。只要发生的中断的&nbsp; 
      <BR>优先级高于当前中断的优先级,嵌套中断就会发生。 &nbsp; 
      <BR>⑥接着中断例程可以保存相应的寄存器以保护现场。如果此时有高优先级中断发生,则处理器将&nbsp; 
      <BR>重复执行从步骤①开始的动作。要注意的是,如果中断是电平敏感的,那么在中断结束前要清除&nbsp; <BR>中断源。 &nbsp; 
      <BR>⑦在退出中断前要首先置位CPSR的位I,以便屏蔽其他中断,保证多个中断有序地完成。 &nbsp; 
      <BR>⑧在结束中断之前还必须执行一次对AIC_EOICR的写操作,向AIC表明中断已经完成。存放于堆栈&nbsp; 
      <BR>的前一个当前中断优先级将被弹出并作为当前中断优先级。如果此时系统又有一个挂起的中断,&nbsp; 
      <BR>其优先级比刚才结束的中断的优先级低(或相等)、但又高于从堆栈弹出来的中断的优先级,则&nbsp; 
      <BR>将重新施加NIRQ;但是,中断步骤不会立即开始,因为此时CPSR的I位是置位的。 &nbsp; 
      <BR>⑨SPSR(SPSR_irq)被恢复。最后是链接寄存器LR恢复到PC。程序返回到中断发生前之处。 SPSR&nbsp; 
      <BR>也恢复为CPSR,中断屏蔽状态恢复为SPSR所指明的状态。 &nbsp; 
      <BR>注:SPSR的位I是很重要的。如果在SPSR恢复之后为置位状态,则表明ARM核正要屏蔽中断,在执&nbsp; 
      <BR>行屏蔽指令时被中断。因此,SPSR恢复后,屏蔽指令得以完成,亦即I被置位,&nbsp; <BR>因而IRQ&nbsp;被屏蔽。 
      &nbsp;</FONT></TD></TR></TBODY></TABLE></DIV></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -