代码之家  ›  专栏  ›  技术社区  ›  user435739

级别触发中断处理和嵌套中断

  •  1
  • user435739  · 技术社区  · 11 年前

    [更新问题,因为GIC v2有3个寄存器ACK、EOIR、DIR]

    这是最基本的问题,我需要其他人来澄清并声明下面的顺序是正确的。

    在接下来的拱形中,

      [Core] ----- [ Interrupt Controller ] --Level Triggered -- [Device]
    
    • a.设备提高电平并通知中断控制器
    • b.中断控制器触发中断的核心。(假设核心的中断已启用)
    • c.假设中断控制器是GIC(与ARM一起使用),并且它有3个寄存器
    1. -中断停用(GICC_DIR)
    2. -中断ACK(返回IRQ编号),(GICC_IAR)
    3. -中断结束寄存器(GICC_EOIR)

    注意:在GICv2实现中,将GICC_CTLR.EOImode设置为1可分离优先级下降和中断停用操作。
    参考文献:3中断处理和优先级划分(ARM IHI 0048B.b ID072613)

    现在需要确认的点,

    • d.在Core没有确认中断以获得IRQ之前,中断保持挂起状态,设备中断线至中断控制器级别为高
    • e.核心禁用其中断。Core Do ACK get IRQ,no change in interrupt line from device.核心确认得到IRQ,设备中断线路没有变化。

    现在这里可能有两个案例。

    • A.核心屏蔽GIC上的特定中断,但在设备上不做任何事情,这将清除设备上的中断。Core启用其中断
    • B.核心将GICC_EOImode设置为1,并将中断id写入EOIR。Core启用其中断

    基于(A)或(B)

    Q1.中断是否会从中断控制器再次引发到核心?

    现在怎么办 interrupt nesting 在这种情况下工作?

    1 回复  |  直到 11 年前
        1
  •  0
  •   Community kfsone    4 年前

    问题1。 中断会从中断控制器再次引发到核心吗?

    当然,它将被重新提出。这是级别触发中断的一个属性。没有 状态 在中断控制器中。它很难判断中断是被重新引发还是持续存在。特别是,中断可能已经服务了很短的时间,并且GIC不会看到 高-低-高 转换以区分新的中断源和现有的中断源。

    问题2。 如果在(e)核心直接执行(g)之后,中断是否会从中断控制器再次引发到核心

    这似乎与上述问题相同。可能有一个液位触发装置 服务 该设备使中断线为高电平。例如,中断可能是 FIFO不为空 。如果 国际货币基金组织 有两个条目,第一次读取可能无法清除中断。

    看见 level triggered interrupts 在维基百科上。 维修此设备后。。。 。您必须始终使用 电平触发 中断。中断控制器(GIC)不知道外围设备是如何工作的。在控制器中设置假设将限制其使用。

    现在,在这种情况下,如何中断嵌套工作。

    目前尚不清楚是什么在筑巢。例如 国际货币基金组织 例如,您可以读取设备中的条目数,也可以读取并检查 中断状态 每次读取后。当 阅读 清除中断,可以重新启用中断源。

    独立IRQ源的嵌套是标准的。在步骤 f ,IRQ服务例程必须为设备提供服务,直到该级别未被驱动为止。这个 irqActive 可以读取0x300-0x304处的位以确定IRQ服务是否完成。然后,级别触发的ISR返回。如果在任何时候被抢占,控制器将检测到新的电平源,或者ISR将继续为外围设备提供服务。

    • 设备升高线路通知GIC。
    • GIC向ARM内核发出信号并跳到向量。
    • 矢量读取GIC中断ACK并跳转到ISR。
    • 液位例行程序禁用 水平IRQ 并重新启用中断。
    • 水平常规服务设备直到 irq活动 低的(此处可能优先于其他ISR)。
    • 屏蔽中断,重新启用 数量 源,并返回给调用者。

    如果在最后一步(或之前)发生了额外的服务项目,则会出现 背靠背 电平中断。这将是频繁的,因为在同一时间段内必须发生多个中断源。这是典型的 中断嵌套 。整个系统会更忙,但延迟会更好。

    部分 3.2.1优先级下降和中断停用 具有以下步骤来禁用电平中断,

    1. 读取IAR—活动中断的初始读取。
    2. 写入EOIR-将其从 优先事项 ; 允许优先级较低的嵌套。
    3. 写DIR-说它有 结束了 (或已维修)。

    当确定实际设备已被服务时,中断被重新启用。如果您希望只允许更高优先级的中断,那么写入 EOIR 将延迟到ISR结束;较高优先级的中断将自然地抢占电平中断。

    编辑:

    现在这里可能有两个案例。

    A.核心屏蔽GIC上的特定中断,但在设备上不做任何事情,这将清除设备上的中断。Core启用其中断

    如果中断被屏蔽,它将不会重新断言。

    B.核心将GICC_EOImode设置为1,并将中断id写入EOIR。Core启用其中断

    编写 地球自转仪 将从 活动+挂起 只是 忙碌的 并且中断将重新进行(如果您所做的只是“B”)。

    在里面 interrupt nesting ,Linux很自然地完成了图片的第一部分。当有两个活动ISR(右侧)时,这是一种可选配置;在“IRQ-k”期间,必须重新启用中断。要做到这一点需要更多的堆栈,并且您将不得不修改现有的Linux afaik。

    第2版: 这个 GICC_CTRL.EOImode =1 令人困惑。这将 中断服务 来自 优先级下降 部分如果您有一个带有关键部分和非关键部分的中断,您可以将这些阶段分开。写信给 地球自转仪 在关键部分之后放弃优先级。然后 目录 寄存器表示中断服务已完成。我总是会离开 GICC_CTRL.EOImode=0 因为我认为这是不必要的。手册文档是从中断控制器的角度编写的,而不是使用它的CPU(因此是程序员的心理模型);停用表示电流 红外热像仪 行,而不是一般的中断。