首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >级别触发中断处理和嵌套中断

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

Stack Overflow用户
提问于 2013-10-30 04:22:24
回答 1查看 2.9K关注 0票数 1

更新问题: GIC v2有3个寄存器ACK,EOIR,DIR

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

在下面的拱门里,

代码语言:javascript
复制
  [Core] ----- [ Interrupt Controller ] --Level Triggered -- [Device]
  • 设备提升级别并通知中断控制器。
  • 中断控制器触发中断的核心。(假设核心的中断已启用)
  • c.假设中断控制器是GIC (与ARM一起使用),并且它有3个寄存器。
      • 中断停用(GICC_DIR)

      • 中断ACK (返回IRQ号),(GICC_IAR)

      • 中断寄存器结束(GICC_EOIR)

注意:在GICv2实现上,将GICC_CTLR.EOImode设置为1可以分隔优先级删除和中断失活操作。

参考:3中断处理和优先级(ARM IHI 0048B.b ID072613)

现在需要确认的要点,

  • 直到核心没有ACK中断以获得IRQ,中断仍然悬而未决,设备中断线到中断控制器级别很高
  • 核心禁用它的中断。ACK内核得到IRQ,设备中断线没有变化。

现在这里可以有两个案子了。

  • 核心屏蔽了GIC上的特定中断,但在设备上不做任何操作,这将清除设备上的中断。核心启用它的中断。
  • 核心设置GICC_EOImode =1,并将中断id写入EOIR。核心启用它的中断。

以(A)或(B)为基础

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

在这种情况下,中断嵌套将如何工作呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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将继续为外围设备服务。

  • 设备启动行通知GIC。
  • GIC信号臂核并跳转到矢量。
  • 向量读取GIC中断ACK并跳转到ISR。
  • 级别例程禁用级别IRQ并重新启用中断。
  • 将常规服务设备的级别提高到irqActive低点。(可先发制人到其他ISRs )。
  • 屏蔽中断,重新启用级别源,并返回给调用方.

如果在最后一步(或就在前面)发生额外的服务项目,就会有一个背对背的中断。这将是频繁的,因为多个中断源将不得不在同一时间内发生。这是典型的中断嵌套。整个系统将更加繁忙,但延迟会更好。

第3.2.1节优先级删除和中断停用有以下步骤禁用级别中断,

  1. 读取IAR -主动中断的初始读取。
  2. 编写EOIR -将其从优先级中删除;允许嵌套优先级较低的嵌套。
  3. 写DIR -说它已经结束(或服务)。

当确定实际设备已被服务时,中断将重新启用.如果您希望只允许较高优先级的中断,那么对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行,而不是一般的中断。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19673776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档