Embedded 当一个ISR正在运行而另一个中断发生时会发生什么?

Embedded 当一个ISR正在运行而另一个中断发生时会发生什么?,embedded,interrupt,avr,Embedded,Interrupt,Avr,如果ISR正在运行,并且发生另一个中断,会发生什么情况?第一个中断会被中断吗?第二个中断会被忽略吗?还是在第一次ISR完成时发射 编辑 我忘了把它包括在问题中(但我把它包括在标签中),我想问一下这在Atmel AVR上是如何工作的。中断的工作方式: 代码设置“全局中断启用”位;没有它,就不会发生中断 当发生导致中断的事件时,将设置一个标志 当注意到中断标志时,“全局中断启用”位被清除 运行相应的ISR “全局中断启用”位被重新设置 现在回到步骤2,除非在ISR期间已经设置了中断标志;然后回到步骤

如果ISR正在运行,并且发生另一个中断,会发生什么情况?第一个中断会被中断吗?第二个中断会被忽略吗?还是在第一次ISR完成时发射

编辑
我忘了把它包括在问题中(但我把它包括在标签中),我想问一下这在Atmel AVR上是如何工作的。

中断的工作方式:

  • 代码设置“全局中断启用”位;没有它,就不会发生中断

  • 当发生导致中断的事件时,将设置一个标志

  • 当注意到中断标志时,“全局中断启用”位被清除

  • 运行相应的ISR

  • “全局中断启用”位被重新设置

  • 现在回到步骤2,除非在ISR期间已经设置了中断标志;然后回到步骤3

  • 所以要回答这个问题:当第一个ISR完成时,第二个ISR将运行


    希望这有帮助

    通常情况下,中断服务例行程序会继续进行,直到完成,而在大多数系统中不会被中断。但是,如果我们有一个更大的系统,其中几个设备可能会中断微处理器,则可能会出现优先级问题

    如果在当前中断中也设置了中断启用标志,则可以允许比正在执行的中断优先级更高的中断。这种“中断的中断”称为嵌套中断。它是通过停止执行原始服务例程并在堆栈上存储另一个寄存器序列来处理的。这与嵌套子例程类似。由于每个中断都会自动递减堆栈指针,然后返回指令会自动递增堆栈指针,因此在第二个中断完成后,第一个中断服务例程将继续,并且中断将按正确的顺序进行服务。中断可以嵌套到任何深度,仅受堆栈可用的内存量的限制

    例如,在下图中,线程A正在运行。中断IRQx导致中断处理程序Intx运行,这被IRQy及其处理程序Inty抢占。Inty返回导致线程B运行的事件;Intx返回导致线程C运行的事件

    对于硬件中断,优先级中断控制器芯片(PIC)是设计用于简化设备向CPU呈现其自身地址的任务的硬件芯片。PIC还评估与其连接的设备的优先级。现代PIC还可以编程,以防止产生低于所需水平的中断

    更新:嵌套中断如何在Atmel AVR上工作 在输入中断向量之前,AVR硬件将清除SREG中的全局中断标志。因此,在处理程序退出之前,中断通常在处理程序内保持禁用状态,其中RETI指令(由编译器作为中断处理程序的正常函数尾声的一部分发出)最终将重新启用进一步的中断。因此,中断处理程序通常不嵌套。对于大多数中断处理程序来说,这是理想的行为,对于某些中断处理程序来说,为了防止无限递归中断(如UART中断或电平触发的外部中断),甚至需要这种行为

    在极少数情况下,嵌套中断可能需要在中断处理程序中尽早重新启用全局中断标志
    ,以避免延迟超过绝对需要的任何其他中断。这可以在中断处理程序的开头使用sei()指令来完成,但这仍然会在编译器生成的函数序言中留下很少的指令在禁用全局中断的情况下运行。通过以下方式声明处理程序,可以指示编译器在中断处理程序的开头插入SEI指令:

    ISR(XXX_vect, ISR_NOBLOCK)
    {
      ...
    }
    
    其中XXX_vect是MCU类型的有效中断向量的名称


    此外,请查看此页,了解有关Atmel AVRs中断的更多信息。

    您是在谈论多个相同的中断还是不同的中断?不同的CPU会做出不同的反应,对于某些CPU,反应将取决于中断控制器、编程方式,有时还取决于中断类型。如果你把问题的范围缩小,我们也许能给出一个好的答案。一张图片、一张快速中断的图片和一张使用NVIC的手臂皮层都会有不同的功能。@BenjiWiebe我在你编辑后更新了我的答案。你没有提供足够的信息-CPU本身只是故事的一部分。最终是软件可以允许或不允许嵌套中断。所以发生什么完全取决于你。对于某些处理器来说可能是这样,但是现在很多处理器都有多个中断优先级,在这种情况下,高优先级中断会抢占低优先级中断,就像中断抢占正常任务一样。你的描述对8位微芯片PIC芯片非常具体。@WoutervanOoijen真的吗?它也适用于8位Atmel MCU。这让我想起了我们在基于Z80的系统上遇到的一个恼人的错误。我们将RTC连接到NMI pin以实现实时计数。问题是,RTC每秒发出50%的标记和50%的空间。再加上不可屏蔽中断本身也是不可屏蔽的,0.5s的标记很快就会导致堆栈崩溃和系统挂起:/我认为如果您区分CPU、中断控制器和