问题标签 [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.
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)。
任何想法?
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 处理程序:
如果有人对组装新手有任何指示,那将是非常受欢迎的,因为我完全被卡住了:)
c - 将中断请求扩展到其他处理器
如何将现有的中断请求扩展到其他处理器?已经有一个在特定处理器上发出并启用的现有请求。我想扩展这个 IRQ,它基于一个硬件计数器触发,这样每个处理器都存在一个 IRQ,如果任何一个 IRQ 被触发,它们将被汇集到已经存在的 IRQ 及其处理程序。本质上,我正在尝试创建一个 IRQ 多路复用器。有没有人有这方面的经验?
更好的解释是所有处理器的 IRQ 都是相同的。因此,我想在新的 .c 文件中将已请求并启用的 IRQ(在单独的 .c 文件中请求、启用和处理)更改为 percpu IRQ
kernel - 尽管我的 ISR 处理程序运行良好,但 IRQ 处理程序不起作用
我正在研究中断处理。我的中断描述符表如下:
idt加载过程如下:
我的 isr_handler C 函数被调用。但是,irq_handler C 函数永远不会被调用。我不明白为什么只有 irq 处理部分不起作用。请帮忙。
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 间隔几乎没有变化。
assembly - SAMA5D3 上的中断处理
好吧,伙计们,
我正试图在 ARM 组装上切齿,但我不能完全理解中断的概念。在此之前,我使用过 AVR 中断,其中编写了代码以将中断向量显式链接到要跳转到的子程序或段:
但是,在使用 Atmel SAMA5D3 系列时,我不知道如何完成类似的事情。我知道前 8 个中断向量位于前 8 个程序计数器地址(reset
at0x00
到fiq
at 0x1C
),但我无法找到一个好的、严肃的、易于理解的资源来了解各个外设中断的方式(SPI、UART、TC 模块)映射到标准化的 ARM 向量表。
也就是说,假设在代码中我将 UART 配置为能够引发中断。当它抛出中断时会发生什么?irq
条目 ( )的地址是否0x18
包含设备特定向量表的位置?供应商和设备特定的外设如何通过核心标准化表断言中断?
我已经查阅了 SAMA5D3 和 ARM ARM 的数据表,但我没有发现太多让初学者更容易的东西。如果有任何不清楚的地方,我深表歉意,并为避开集会而感到羞耻。
编辑:
从SAMA5D3 数据表,第 118 页,它指出:
假设:
- 高级中断控制器已被编程,AIC_SVR 寄存器加载了相应的中断服务程序地址并启用了中断。
- ARM 中断异常向量地址处的指令需要与向量配合使用:
LDR PC, [PC, # -&F20]
置位时
nIRQ
,如果位“I”CPSR
为0,则顺序如下:
CPSR
存储在 中,程序计数器的SPSR_irq
当前值加载到中断链接寄存器 (R14_irq
) 中,程序计数器 (R15
) 加载 0x18。在地址 0x1C 的取指期间的下一个周期中,ARM 内核调整R14_irq
,将其递减 4。- ARM 内核进入中断模式(如果尚未这样做)。
- 当加载在地址 0x18 的指令被执行时,程序计数器会加载读入的值
AIC_IVR
。
这是可以理解的。通过阅读本文加上查看寄存器编号,我将外围中断源(即SPI0/1
)编号放入 的INTSEL
字段中AIC_SSR
,然后听起来我将 ISR 的地址存储到 中AIC_SVR
。
有两个问题,其中一个是我不理解LDR PC, [PC, # -&F20]
需要存在并与 处的irq
向量地址兼容的向量指令 ( ) 0x18
。
另一个问题是,如何启用多个中断?只有一个INTSEL
域和源向量寄存器,那么如何在这个系统上运行多个中断处理程序呢?
伙计们,我继续道歉,如果我没有得到这个,但我至少试着做我的功课。
c - PIT 不向 IRQ0 发送中断
这可能是一个愚蠢的问题,但我一直在关注编写小型操作系统的教程。到目前为止,我已经设置了中断描述符表、注册处理程序的方法、默认处理程序(将 int 编号打印到屏幕)并将 PIC 重新映射到中断 0x20 及以上。
我只是将可编程间隔计时器设置为 50Hz,但它不会生成任何 IRQ0。我已经在描述符表中的中断 32 处设置了计时器处理程序,但是如果我手动生成中断:__asm__ volatile ("int $0x20);
我会在屏幕上打印“Tick:0x00000001”。
这是我的 timer.c 文件:
linux - enable_irq_wake 和 enable_irq 的区别
我的驱动正在使用可以唤醒设备的irq,enable_irq_wake就足够了,或者我需要先enable_irq然后设置enable_irq_wake。看了看这些函数的定义,不太明白。
我尝试使用这两种组合它似乎没有任何效果。我的意思是只使用 enable_irq_wake,在其他情况下使用 enable_irq 然后 enable_irq_wake。
谢谢
hardware - 如何在多个设备之间在物理硬件上共享单个 irq 线
我想知道如何在多个设备之间共享一条 irq 线,我的意思是它们如何在硬件级别进行物理连接,他们是否为此使用多个 APIC 控制器,或者使用了哪些其他方法。
linux - 如何分配 IRQS
我对 PCI 和 IRQS 有一些疑问。
IRQ 是如何分配给连接到 PCI 总线的设备的,它是在引导时由 BIOS 分配的,还是总线选择它或总线控制器自动选择它,谁负责选择 IRQS 编号?
当设备连接到 PCI 总线时,设备可以填充 PCI 控制器配置寄存器中的 IRQ 字段吗?
Linux 内核可以分配和更改连接设备的 IRQS 吗?
像 USB 控制器或 SATA 控制器这样的设备控制器怎么样?我们如何将 IRQ 分配给控制器,因为它连接了多个设备,以及连接到同一个控制器的多个设备如何使用 IRQS?
Linux 如何识别在机器运行时连接到机器的设备,以及如何为它们分配 IRQ 编号以及谁负责?