问题标签 [irq]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
19416 浏览

networking - ixgbe:设置 RX/TX 队列的数量

我想设置 Intel 10G NIC 使用的 RX/TX 队列数。让我解释一下原因:

我在 Dell R720 系统上使用 X520 类型的 Intel 10G NIC。我正在使用 ixgbe 版本 3.6.7-k。Ubuntu 3.2.0-59 中的内核。

我在机器上 24 个内核中的 4 个上运行我的网络应用程序。目前 NIC 使用 flow-director,所以我有 24 个 TX 和 RX 队列,而大多数 IRQ 最终在运行应用程序的 4 个内核上运行。

但是,我看到一些 IRQ 正在其他 20 个队列上运行(这可能是因为 flow-director 对大约 20% 的流量进行采样,因此一些流量通过常规 RSS)。现在我不希望在其他 20 个内核上运行任何 IRQ,因为它们正在执行不同的任务,该任务被运行的 IRQ 损坏。

我尝试仅将中断的关联性设置为我使用的 4 个内核,但这不适用于 flow-director。我想更好的方法是只使用 4 个 RX/TX 队列并将它们分配给专用内核。但是我找不到在 ixgbe 驱动程序中设置 RX/TX 队列数量的方法(尽管这对于我熟悉的其他 10G 驱动程序来说非常简单,例如 Broadcom 的 bnx2x)。

任何想法?

0 投票
1 回答
1417 浏览

c - AM335x FreeRTOS 端口,无法处理 IRQ 和 SWI

我目前正在尝试将 FreeRTOS 移植到 TI AM335x 处理器,该处理器以在 BeagleBones 上使用而闻名。我能够启动、运行 GPIO 并设置一个比较匹配计时器来运行系统滴答声。如果我禁用中断,我可以看到在定时器启动后的正确时间后如何设置中断。如果我启用中断,我的应用程序会在相同的给定时间后死掉。如果我尝试产生一个任务,也就是调用 SWI 处理程序,应用程序也会死掉。这让我相信向量表不可用或设置不正确。SWI 和 IRQ 的 ROM 异常向量的内容为 4030CE08h 和 4030CE18h。在 RAM 中再次执行一些分支,TRM 说:

用户代码可以将任何异常重定向到自定义处理程序,方法是将其地址写入从 4030CE24h 到 4030CE3Ch 的适当位置,或者覆盖从 4030CE04h 到 4030CE1Ch 地址之间的分支(加载到 PC)指令。

因此,我的 vIRQHandler 函数地址被写入 4030CE38h。人们希望这已经足够了,但遗憾的是没有。我怀疑我的 boot.s 文件中有问题,但是我的程序集从未如此出色,我正在努力理解代码。boot.s 和项目的其余部分是从 OMAP3 端口启动的。靴子:

启动的分支为每种模式设置一个堆栈并清除 bss,不确定这是否相关。这是似乎与我相关的代码,我已经更新了单词以适应 AM335 而不是 OMAP3。

设置 IRQ 处理程序:

如果有人对组装新手有任何指示,那将是非常受欢迎的,因为我完全被卡住了:)

0 投票
1 回答
104 浏览

c - 将中断请求扩展到其他处理器

如何将现有的中断请求扩展到其他处理器?已经有一个在特定处理器上发出并启用的现有请求。我想扩展这个 IRQ,它基于一个硬件计数器触发,这样每个处理器都存在一个 IRQ,如果任何一个 IRQ 被触发,它们将被汇集到已经存在的 IRQ 及其处理程序。本质上,我正在尝试创建一个 IRQ 多路复用器。有没有人有这方面的经验?

更好的解释是所有处理器的 IRQ 都是相同的。因此,我想在新的 .c 文件中将已请求并启用的 IRQ(在单独的 .c 文件中请求、启用和处理)更改为 percpu IRQ

0 投票
1 回答
174 浏览

kernel - 尽管我的 ISR 处理程序运行良好,但 IRQ 处理程序不起作用

我正在研究中断处理。我的中断描述符表如下:

idt加载过程如下:

我的 isr_handler C 函数被调用。但是,irq_handler C 函数永远不会被调用。我不明白为什么只有 irq 处理部分不起作用。请帮忙。

0 投票
1 回答
301 浏览

c - 如何提高 LPC1788 微控制器调用 CAN IRQ 的速率?

我正在使用 IAR Embedded Workbench IDE 为 NXP LPC1788 微控制器开发一个应用程序,其中一个要求是尽快从 CAN1 端口接收 CAN 消息。我的问题是,在 CAN IRQ 的一次调用开始和下一次调用开始之间似乎存在约 270 微秒的延迟,即使微控制器似乎只需要约 30 微秒来处理中断。

除了这个中断之外,我还安排了每 50 微秒一次的定期定时器中断,该中断处理接收到 CAN 和 USB 消息。但是,如果没有要处理的 CAN 或 USB 消息,则此中断例程需要约 3 微秒,如果有则只需约 80 微秒。

正因为如此,我想知道为什么 CAN IRQ 的触发速度不能超过每 270 微秒,以及我能做些什么来解决这个问题。

USB 中断对性能的影响可以忽略不计,因为 USB 消息比 CAN 消息更不频繁地到达,而且我确定即使从未触发此中断也会出现此问题。

目前,我的应用程序似乎能够处理平均到达间隔时间约为 300 us 的 CAN 消息(测试以 1 ms 的间隔生成 3 条消息,处理了大约 500,000 条消息,丢弃率为 0%)。

此代码初始化 CAN:

这用于运行 CAN:

这是 CAN IRQ 代码:

COMMS_NotifyCANMessageReceived代码:

这是我的定时器中断代码,每 50 微秒触发一次:

以下是运行应用程序时典型事件日志的摘录,消息之间的平均到达间隔时间为 200 us:

在哪里:

  • 0xAAAAAAAA表示 CAN IRQ 的开始。
  • 0xBBBBBBBB表示 CAN IRQ 的结束。
  • 0x88888888表示interpretMessage在定时器 IRQ 内将要处理一条 CAN 报文。
  • 0x99999999表示我们已经从interpretMessage.

您可以看到,尽管消息每 200 us 到达,但 CAN IRQ 仅每约 270 us 为它们提供服务。这会导致接收队列不断增加,直到最终消息开始被丢弃。

任何帮助,将不胜感激。

编辑 1

我也许还应该提到我的 CAN 外围设备被编程为以 500 kBaud 的速率运行。此外,我的应用程序涉及回显接收到的 CAN 消息,因此任何到达端口 1 的消息都会在端口 2 上重新传输。

编辑 2

CAN 和 TIMER_0 中断例程具有相同的优先级:

编辑 3

我可以确认问题仍然存在,即使我禁用定时器中断并且让 CAN IRQ 除了将接收到的 CAN 消息复制到 RAM 并释放接收缓冲区之外什么也不做,中断之间的 ~270 us 间隔几乎没有变化。

0 投票
1 回答
551 浏览

assembly - SAMA5D3 上的中断处理

好吧,伙计们,

我正试图在 ARM 组装上切齿,但我不能完全理解中断的概念。在此之前,我使用过 AVR 中断,其中编写了代码以将中断向量显式链接到要跳转到的子程序或段:

但是,在使用 Atmel SAMA5D3 系列时,我不知道如何完成类似的事情。我知道前 8 个中断向量位于前 8 个程序计数器地址(resetat0x00fiqat 0x1C),但我无法找到一个好的、严肃的、易于理解的资源来了解各个外设中断的方式(SPI、UART、TC 模块)映射到标准化的 ARM 向量表。

也就是说,假设在代码中我将 UART 配置为能够引发中断。当它抛出中断时会发生什么?irq条目 ( )的地址是否0x18包含设备特定向量表的位置?供应商和设备特定的外设如何通过核心标准化表断言中断?

我已经查阅了 SAMA5D3 和 ARM ARM 的数据表,但我没有发现太多让初学者更容易的东西。如果有任何不清楚的地方,我深表歉意,并为避开集会而感到羞耻。

编辑:

SAMA5D3 数据表,第 118 页,它指出:

假设:

  1. 高级中断控制器已被编程,AIC_SVR 寄存器加载了相应的中断服务程序地址并启用了中断。
  2. ARM 中断异常向量地址处的指令需要与向量配合使用:

LDR PC, [PC, # -&F20]

置位时nIRQ,如果位“I”CPSR为0,则顺序如下:

  1. CPSR存储在 中,程序计数器的SPSR_irq当前值加载到中断链接寄存器 ( R14_irq) 中,程序计数器 ( R15) 加载 0x18。在地址 0x1C 的取指期间的下一个周期中,ARM 内核调整R14_irq,将其递减 4。
  2. ARM 内核进入中断模式(如果尚未这样做)。
  3. 当加载在地址 0x18 的指令被执行时,程序计数器会加载读入的值AIC_IVR

这是可以理解的。通过阅读本文加上查看寄存器编号,我将外围中断源(即SPI0/1)编号放入 的INTSEL字段中AIC_SSR,然后听起来我将 ISR 的地址存储到 中AIC_SVR

有两个问题,其中一个是我不理解LDR PC, [PC, # -&F20]需要存在并与 处的irq向量地址兼容的向量指令 ( ) 0x18

另一个问题是,如何启用多个中断?只有一个INTSEL域和源向量寄存器,那么如何在这个系统上运行多个中断处理程序呢?

伙计们,我继续道歉,如果我没有得到这个,但我至少试着做我的功课。

0 投票
1 回答
934 浏览

c - PIT 不向 IRQ0 发送中断

这可能是一个愚蠢的问题,但我一直在关注编写小型操作系统的教程。到目前为止,我已经设置了中断描述符表、注册处理程序的方法、默认处理程序(将 int 编号打印到屏幕)并将 PIC 重新映射到中断 0x20 及以上。

我只是将可编程间隔计时器设置为 50Hz,但它不会生成任何 IRQ0。我已经在描述符表中的中断 32 处设置了计时器处理程序,但是如果我手动生成中断:__asm__ volatile ("int $0x20);我会在屏幕上打印“Tick:0x00000001”。

这是我的 timer.c 文件:

0 投票
1 回答
2993 浏览

linux - enable_irq_wake 和 enable_irq 的区别

我的驱动正在使用可以唤醒设备的irq,enable_irq_wake就足够了,或者我需要先enable_irq然后设置enable_irq_wake。看了看这些函数的定义,不太明白。

我尝试使用这两种组合它似乎没有任何效果。我的意思是只使用 enable_irq_wake,在其他情况下使用 enable_irq 然后 enable_irq_wake。

谢谢

0 投票
1 回答
986 浏览

hardware - 如何在多个设备之间在物理硬件上共享单个 irq 线

我想知道如何在多个设备之间共享一条 irq 线,我的意思是它们如何在硬件级别进行物理连接,他们是否为此使用多个 APIC 控制器,或者使用了哪些其他方法。

0 投票
1 回答
1130 浏览

linux - 如何分配 IRQS

我对 PCI 和 IRQS 有一些疑问。

IRQ 是如何分配给连接到 PCI 总线的设备的,它是在引导时由 BIOS 分配的,还是总线选择它或总线控制器自动选择它,谁负责选择 IRQS 编号?

当设备连接到 PCI 总线时,设备可以填充 PCI 控制器配置寄存器中的 IRQ 字段吗?

Linux 内核可以分配和更改连接设备的 IRQS 吗?

像 USB 控制器或 SATA 控制器这样的设备控制器怎么样?我们如何将 IRQ 分配给控制器,因为它连接了多个设备,以及连接到同一个控制器的多个设备如何使用 IRQS?

Linux 如何识别在机器运行时连接到机器的设备,以及如何为它们分配 IRQ 编号以及谁负责?