处理具有相同优先级的中断
Handle interrupts with same priority
如果我在 AVR 微控制器中有一组外围设备具有相同的优先级,微控制器是否使用循环作为中断子系统的合适仲裁机制?
否则,它如何管理同时发生的具有相同优先级的中断?
ATmega328PB 数据表的第 9 节标题为 "AVR CPU Core",它说:
All interrupts have a separate interrupt vector in the interrupt vector table.
The interrupts have priority in accordance with their interrupt vector position. The lower the interrupt vector address, the higher the priority.
视情况而定。
例如"classical" AVR微控制器有简单的一级中断控制器。这意味着,当中断为 运行ning 时,SREG 中的中断标志被清除,从而阻止来自 运行ning 的任何其他中断。 IRET 指令再次启用此标志,并且
主代码一条指令执行完后,下一条中断准备执行。
当多个中断请求同时有效时,则只选择中断向量地址最低的那个。
例如,参考ATMega328P datasheet(第6.7节复位和中断处理,第15页):
The lower the address the higher is the priority level.
因此,如果中断请求标志未被清除,或在中断处理程序 return 之前重新置位,相同的中断将再次 运行,并且具有更高中断向量地址的中断处理程序可能永远不会已执行。
但是在最新版本的架构中有一个更高级的中断控制器,它允许启用循环调度,并分配给一个更高级别的中断(允许它被执行,即使另一个中断处理程序运行宁)。
例如ATmega3208(参考the datasheet,第12节。CPU中断控制器):
All interrupt vectors other than NMI are assigned to priority level 0 (normal) by default. The user may override this by assigning one of these vectors as a high priority vector. The device will have many normal priority vectors, and some of these may be pending at the same time. Two different scheduling schemes are available to choose which of the pending normal priority interrupts to service first: Static and round robin
所以,答案是:仔细阅读您正在使用的部件的数据表。
如果我在 AVR 微控制器中有一组外围设备具有相同的优先级,微控制器是否使用循环作为中断子系统的合适仲裁机制?
否则,它如何管理同时发生的具有相同优先级的中断?
ATmega328PB 数据表的第 9 节标题为 "AVR CPU Core",它说:
All interrupts have a separate interrupt vector in the interrupt vector table. The interrupts have priority in accordance with their interrupt vector position. The lower the interrupt vector address, the higher the priority.
视情况而定。
例如"classical" AVR微控制器有简单的一级中断控制器。这意味着,当中断为 运行ning 时,SREG 中的中断标志被清除,从而阻止来自 运行ning 的任何其他中断。 IRET 指令再次启用此标志,并且 主代码一条指令执行完后,下一条中断准备执行。
当多个中断请求同时有效时,则只选择中断向量地址最低的那个。
例如,参考ATMega328P datasheet(第6.7节复位和中断处理,第15页):
The lower the address the higher is the priority level.
因此,如果中断请求标志未被清除,或在中断处理程序 return 之前重新置位,相同的中断将再次 运行,并且具有更高中断向量地址的中断处理程序可能永远不会已执行。
但是在最新版本的架构中有一个更高级的中断控制器,它允许启用循环调度,并分配给一个更高级别的中断(允许它被执行,即使另一个中断处理程序运行宁)。
例如ATmega3208(参考the datasheet,第12节。CPU中断控制器):
All interrupt vectors other than NMI are assigned to priority level 0 (normal) by default. The user may override this by assigning one of these vectors as a high priority vector. The device will have many normal priority vectors, and some of these may be pending at the same time. Two different scheduling schemes are available to choose which of the pending normal priority interrupts to service first: Static and round robin
所以,答案是:仔细阅读您正在使用的部件的数据表。