更新问题: GIC v2有3个寄存器ACK,EOIR,DIR
这是最基本的问题,我需要其他人来澄清,并说明下面的顺序是正确的。
在下面的拱门里,
[Core] ----- [ Interrupt Controller ] --Level Triggered -- [Device]注意:在GICv2实现上,将GICC_CTLR.EOImode设置为1可以分隔优先级删除和中断失活操作。
参考:3中断处理和优先级(ARM IHI 0048B.b ID072613)
现在需要确认的要点,
现在这里可以有两个案子了。
以(A)或(B)为基础
Q1。中断是否会再次从中断控制器引发到核心?
在这种情况下,中断嵌套将如何工作呢?
发布于 2014-01-03 18:35:18
Q1.是否会再次将中断从中断控制器引发到核心?
当然,它将被重新提出。这是一个属性的级别触发中断。中断控制器中没有状态。很难判断中断是否已重新引发,或是否持续存在。特别是,中断可能被服务了很短的时间,GIC将不会看到高-低-高转换来区分新的中断源和现有的中断源。
Q2.如果在(e)核后直接执行(g),中断是否会再次从中断控制器引发到核心?
这似乎与上述问题相同。可能有一个水平触发设备,其中维护设备使中断线保持在很高的位置。例如,中断可能是FIFO,而不是空。如果FIFO有两个条目,则第一个读取可能不会清除中断。
参见维基百科的电平触发中断。在维修这个设备之后..。您必须始终使用电平触发中断为设备提供服务。中断控制器(GIC)不知道外围设备是如何工作的。在控制器中放置假设将限制其使用。
在这种情况下,如何中断嵌套工作。
还不清楚是什么筑巢。例如,在上面的FIFO示例中,您可以读取设备的条目数,或者在每次读取之后读取并检查中断状态。当读取清除中断时,重设中断源是可以的.
不同IRQ源的嵌套是标准的。在步骤f中,IRQ服务例程必须服务于设备,直到没有驱动该级别为止。可以读取0x300-0x304的http://infocenter.arm.com/help/topic/com.arm.doc.ddi0375a/Chddcejh.html位以确定IRQ服务是否完成。然后该级别触发ISR返回。如果它在任何时候被抢占,控制器将检测到一个新的电平源,或者ISR将继续为外围设备服务。
如果在最后一步(或就在前面)发生额外的服务项目,就会有一个背对背的中断。这将是频繁的,因为多个中断源将不得不在同一时间内发生。这是典型的中断嵌套。整个系统将更加繁忙,但延迟会更好。
第3.2.1节优先级删除和中断停用有以下步骤禁用级别中断,
当确定实际设备已被服务时,中断将重新启用.如果您希望只允许较高优先级的中断,那么对EOIR的写入将延迟到ISR结束;高优先级中断自然会抢占级别中断。
编辑:
现在这里可以有两个案子了。 核心屏蔽了GIC上的特定中断,但在设备上不做任何操作,这将清除设备上的中断。核心启用它的中断。
如果中断被屏蔽,它将不会重新断言。
核心设置GICC_EOImode =1,并将中断id写入EOIR。核心启用它的中断。
编写EOIR将从active+pending转换为仅处于活动状态,中断将重新启动(如果您所做的只是'B')。
在中断嵌套中,Linux自然地完成了图片的第一部分。当有两个活动的ISR (右侧)时,这是一个可选的配置;在“IRQ”期间,必须重新启用中断。这样做需要更多的堆栈,您必须修改股票Linux。
Edit2: GICC_CTRL.EOImode =1令人困惑。这将中断服务与优先级删除部分分离开来。如果您有一个具有关键部分和非关键部分的中断,您可以将这些阶段分开。在关键部分后写到EOIR,以降低优先级。然后DIR寄存器表示中断服务已经完成。我总是离开GICC_CTRL.EOImode=0,因为我不认为这是必要的。手动文档是从中断控制器的角度编写的,而不是使用中断控制器的CPU (因此也是程序员的心智模型);失活意味着当前的IRQ行,而不是一般的中断。
https://stackoverflow.com/questions/19673776
复制相似问题