编辑
我忘了将其包含在问题中(但我将其包含在标签中),我打算询问Atmel AVR的工作原理.
解决方法
如果在当前中断中设置中断使能标志,那么您可以允许进一步的中断优先级高于被执行的中断.这个“中断中断”称为嵌套中断.它通过停止执行原始服务程序并在堆栈中存储另一个寄存器序列来处理.这与嵌套子程序相似.由于堆栈指针由每个中断自动递减,并且随后由RETURN指令递增,所以在第二个中断完成之后,第一个中断服务程序被恢复,并且以正确的顺序对中断进行处理.中断可以嵌套到任何深度,仅受堆栈可用内存量的限制.
例如,在下图中,线程A正在运行.中断IRQx导致中断处理程序Intx运行,这被IRQy及其处理程序Inty抢占. Inty返回一个导致线程B运行的事件; Intx返回一个导致Thread C运行的事件.
对于硬件中断,优先级中断控制器芯片(PIC)是旨在使设备向cpu呈现自己的地址的任务的硬件芯片. PIC还评估与其连接的设备的优先级.现代PIC也可以被编程以防止产生低于期望水平的中断.
更新:嵌套中断在Atmel AVR上的工作原理
在进入中断向量之前,AVR硬件清除SREG中的全局中断标志.因此,正常情况下,处理程序内部的中断仍然禁用,直到处理程序退出,其中RETI指令(由编译器作为中断处理程序的正常函数结尾的一部分发出)将最终重新启用进一步的中断.因此,中断处理程序通常不嵌套.对于大多数中断处理程序,这是所需的行为,有些甚至是为了防止无限递归中断(如UART中断或电平触发的外部中断)而需要的.
在极少的情况下,尽管在中断处理程序中尽可能早地重新启用全局中断标志,可能需要嵌套中断,以便不要超过绝对需要的任何其他中断.这可以使用在中断处理程序开头的sei()指令来完成,但是在编译器生成的函数序言中仍然留下几条指令,以禁用全局中断运行.可以指示编译器通过以下方式声明处理程序,在中断处理程序的开始处插入SEI指令:
ISR(XXX_vect,ISR_NOBLOCK) { ... }
其中XXX_vect是MCU类型的有效中断向量的名称.
另外,看看这个Application Note有关Atmel AVRs中断的更多信息.