从我读到的都用于注册中断处理程序.我request_irq在内核代码中看到了很多调用,但是甚至没有一个__interrupt调用.是否__interrupt有办法从用户空间注册处理程序?
我正在尝试在AT91SAM9M10-EKES评估板上编程GPIO IRQ.我成功注册了IRQ,IRQ正在运行.但是,有些中断被遗漏了.我送26,而我只得到22.
代码:
static irqreturn_t wiegand_interrupt(int irq, void *dev_id){
atomic_inc(&counter);
printk(KERN_WARNING "IRQ recieved, counting... %d\n",atomic_read(&counter));
return 0;
}
irq1 = gpio_to_irq(AT91_PIN_PA21);
if (irq1 < 0) {
err = irq1;
printk("Unable to get irq number for GPIO %d, error %d\n",AT91_PIN_PA21, err);
goto fail;
}
err = request_irq(irq1,wiegand_interrupt,0 ,"wiegand",NULL);
irq2 = gpio_to_irq(AT91_PIN_PA20);
if (irq2 < 0) {
err = irq2;
printk("Unable to get irq number for GPIO %d, error %d\n",AT91_PIN_PA21, err);
goto fail;
}
err = request_irq(irq2,wiegand_interrupt,0 ,"wiegand",NULL);
Run Code Online (Sandbox Code Playgroud)
这不是整个驱动程序,但这是处理IRQ的实际部分.如果有人在代码中发现问题,或者可以建议一种方法来了解我失去4个中断的原因,请回复.我被困在这几个小时...... :(
谢谢.拉蒙.
我在 4 核 intel 机器上有一个多队列 NIC 卡,并且我将 NIC 卡的每个队列绑定在 cpu 核心上(设置 /proc/irq/xxx/smp_affinity) 假设 core0 上的queue0,core1 上的queue1 等等。
据说软中断将在发生硬件中断的同一内核上调用。为什么 ksoftirqd 无法在我的机器上并行运行?只有一个内核线程(如 ksoftirqd/2)将使用 100% 的内核,但其他线程为 0%
当我使用
cat /proc/interrupts | grep eth1
Run Code Online (Sandbox Code Playgroud)
我可以看到所有的包甚至都分发到了所有的NIC队列。
更新:
如果你能读懂中文,这里有一个100%软中断问题的解决方案 http://hi.baidu.com/higkoo/item/42ba6c353bc8aed76d15e9c3(请参见#7)如果不能,哪个博客说你可以添加另一张卡,这个问题将会得到解决
黑客的不可靠指南Linux内核声明了这一点
你可以告诉你是在硬件中断,因为in_irq()返回true.
小心.请注意,如果禁用中断,这将返回误报(见下文).
是in_irq()不是在Linux内核2.6.32或更新的x86上的hardirq上下文中可能返回非零的情况?
在我使用内核2.6.32(Debian 6)和3.4(OpenSUSE 12.1)的实验中,in_irq()从进程上下文调用时总是返回0,即使它是在local_irq_disable()和之间调用的local_irq_enable().当我使用禁用中断而不是中断的自旋锁功能时,结果是相同的local_irq*.
从内核的源代码来看,我目前看不出如何in_irq()能够返回误报.任何人都可以澄清一下吗?
编辑:我也尝试了两个*_irqsave()和*_irq()spinlock API以及local_irq_save()/ local_irq_restore(),结果是相同的,即in_irq()中断被禁用时返回0.通过clix86 上的机器指令显式禁用中断也不会强制in_irq()返回非零值.
我是Linux Kernel的新手.目前,我查看了闲置代码,并提出质疑.当处理器在他们自己的runqueue中没有任何taks时,它可能进入空闲模式,特定WFI(中断的wating).(我所提到的只是ARM体系结构而不是X86.所以X86有些问题.)在保持WFI状态之后,也许其他处理器(非空闲)想要将他们的任务分散到这个空闲处理器(通过负载平衡).那时繁忙的处理器使任务变得很有意义.在我看来,当任务被移植时,空闲处理器应该唤醒immidiatley来处理任务.对?但是,我找不到任何唤醒空闲处理器的代码,但只找到了关于将任务注册到空闲处理器的runqueue的代码.
我想知道在给出新任务时唤醒处理器背后的机制是什么.或者它只是将任务从一个队列移动到另一个队列而不是让它被一些不可预测的IRQ唤醒?
请告诉我真相:)
我正在为Linux中的PCIe卡编写设备驱动程序.我试图在我的驱动程序中使用中断.
读取PCI配置寄存器的"IRQ线"部分(偏移量0x3C)报告设备的分配IRQ线为11.lspci -b -vv还报告我的设备的中断号码是11.
继续它变得奇怪... cat /sys/bus/pci/devices/<my_device>/irq报告中断号是19.lspci -vv还报告中断号为19.
在我的驱动程序中请求11不起作用.如果我在驱动程序中请求19,我就可以很好地捕获中断.
是什么赋予了?
谢谢!!!
我一直在研究x86上的中断,以及内核如何使用中断处理程序处理各种中断。但是,有一件事使我感到困惑。
我知道中断可能是由硬件生成的,例如磁盘和计时器中断,也可能是CPU异常,例如页面错误,除零异常等。令我感到困惑的是,一些int代码用于处理这两种情况(INT 08 -特别是0F)。例如,拉尔夫·布朗(Ralf Brown)的列表说INT 09h中断是KEYBOARD DATA READY硬件中断和COPROCESSOR SEGMENT OVERRUN异常的两倍。
所以我的问题是,给定此类中断,中断处理程序如何知道要处理的中断?
我正在使用Linux 3.6.0的x86系统.对于某些实验,我需要知道IRQ如何映射到矢量.我从很多书中学到说,向量0x0到0x20用于陷阱和异常,从向量0x20开始用于外部器件中断.这也在源代码Linux/arch/x86/include/asm/irq_vectors.h中定义
但是,令我困惑的是,当我检查do_IRQ函数时,http: //lxr.linux.no/linux+v3.6/arch/x86/kernel/irq.c#L181 我发现IRQ是由查找"vector_irq"数组:
unsigned int __irq_entry do_IRQ(struct pt_regs *regs)
{
struct pt_regs *old_regs = set_irq_regs(regs);
/* high bit used in ret_from_ code */
unsigned vector = ~regs->orig_ax;
unsigned irq;
...
irq = __this_cpu_read(vector_irq[vector]); // get the IRQ from the vector_irq
// print out the vector_irq
prink("CPU-ID:%d, vector: 0x%x - irq: %d", smp_processor_id(), vector, irq);
}
Run Code Online (Sandbox Code Playgroud)
通过使用printk检测代码,我得到的vector-irq映射如下所示,我不知道为什么这是映射.我虽然映射应该是(irq + 0x20 = vector),但似乎并非如此.
from: Linux/arch/x86/include/asm/irq_vector.h
* Vectors 0 ... 31 : system traps and exceptions - hardcoded events
* Vectors …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试将FreeRTOS移植到TI AM335x处理器,该处理器以在BeagleBones上使用而闻名.我能够启动,运行GPIO并设置比较匹配计时器以运行系统滴答.如果我禁用中断,我可以看到在定时器启动后的正确时间后如何设置中断.如果我启用了中断,我的应用程序会在相同的时间后死掉.如果我尝试生成一个任务,也就是调用SWI处理程序,应用程序也会死掉.这使我相信矢量表不可用或设置不正确.SWI和IRQ的ROM异常向量具有4030CE08h和4030CE18h的协议.TRM在RAM中再次执行一些分支,它说:
用户代码可以将任何异常重定向到自定义处理程序,方法是将其地址写入4030CE24h到4030CE3Ch的适当位置,或者覆盖4030CE04h到4030CE1Ch之间地址之间的分支(加载到PC)指令.
因此,我的vIRQHandler函数地址写入4030CE38h.人们希望这已经足够了,但遗憾的是没有.我怀疑我的boot.s文件有问题,但是我的程序集从来没有那么好,我很难理解代码.boot.s和项目的其余部分是从OMAP3端口启动的.靴子:
.section .startup,"ax"
.code 32
.align 0
b _start /* reset - _start */
ldr pc, _undf /* undefined - _undf */
ldr pc, _swi /* SWI - _swi */
ldr pc, _pabt /* program abort - _pabt */
ldr pc, _dabt /* data abort - _dabt */
nop /* reserved */
ldr pc, _irq /* IRQ - read the VIC */
ldr pc, _fiq /* FIQ - _fiq */
_undf: .word 0x4030CE24 /* undefined */
_swi: …Run Code Online (Sandbox Code Playgroud)