gpt4 book ai didi

linux-device-driver - 基于 ARM 的嵌入式 Linux 上的 GPIO IRQ

转载 作者:行者123 更新时间:2023-12-04 19:17:53 24 4
gpt4 key购买 nike

我正在尝试在 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);

这不是整个驱动程序,但这是处理 IRQ 的实际部分。
如果有人看到代码中有问题,或者可以提出一种方法来了解我为什么会丢失 4 个中断,请回复。我坚持了几个小时...... :(

谢谢。
拉蒙。

最佳答案

我假设您正在使用外部系统(可能是微 Controller 或可以切换 GPIOS 的东西)触发中断。由于我没有看到中断的真正确认,我假设外部系统不会等待处理中断来触发新的中断。

printk 是一个非常慢的函数,这就是为什么您可能会错过一些中断:当您仍在处理前一个中断时,可能会触发一个新的中断。

所以我建议不要在处理程序中使用 printk。如果你想实现这样的事情,最好使用 tasklet 或工作队列作为中断处理程序的下半部分。

我只能推荐阅读 Linux Device Drivers 的第 10 章。

哦,顺便说一句,您的 IRQ 处理程序不应返回 0,而是 IRQ_HANDLED。

关于linux-device-driver - 基于 ARM 的嵌入式 Linux 上的 GPIO IRQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7092105/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com