【发布时间】:2017-01-20 06:34:12
【问题描述】:
我正在尝试在内核中为用户界面正确注册中断。
令人惊讶的是,我在内核中没有找到很多示例。
中断处理程序
static irqreturn_t irq_handler(int irq, void *dev_id)
{
struct el_irq_dev *el_irq = &el_irq_devices[0];
printk("irq in\n");
spin_lock(&el->my_lock,flags);
clear_interrupt()
some_buffer[buf_wr] = ch;
el_irq->buf_wr++;
if (el_irqbuf_wr >= 16)
el_irqbuf_wr = 0;
spin_unlock(&el->my_lock,flags);
wake_up_interruptible(&el->pollw);
return IRQ_HANDLED;
}
ioctl 等待中断
static long el_device_ioctl( struct file *filp,
unsigned int ioctl_num,
unsigned long ioctl_param)
{
struct el_irq_dev *el_irq = &el_irq_devices[0];
switch (ioctl_num) {
case IOCTL_WAIT_IRQ: <<<---- using ioctl (no poll) to wait on interrupt
wait_event_interruptible(el_irq->pollw, &el_irq->buf_wr != &el_irq->buf_rd) ;
spin_lock(&el_irq->my_lock);
if (el_irq->buf_wr != &el_irq->buf_rd)
{
my_value=some_buffer[el_irq->buf_rd];
el_irq->buf_rd++;
if (el_irq->buf_rd >= 16)
el_irq->buf_rd = 0;
}
spin_unlock(&el_irq->my_lock);
copy_to_user(ioctl_param,&my_value,sizeof(my_value));
default:
break;
}
return 0;
}
我的问题是:
- 我们是否应该将 fpga 中的中断清除 (clear_interrupt() ) 放在中断中 在 wake_up 之前还是之后?我们可以将清除中断放在用户空间处理程序(IOCTL_WAIT_IRQ)中,而不是在 中断处理程序?
- 正如您在代码中看到的,我使用循环缓冲区来处理用户空间处理程序丢失中断的情况。这真的是必需的还是我们可以假设没有遗漏? 换句话说,假设永远不会错过中断是否合理?这样 ioctl 调用永远不会看到超过 1 个等待中断?如果是 - 也许我不需要中断处理程序和 ioctl 处理程序之间的缓冲机制。
谢谢你, 然
【问题讨论】:
-
为什么你首先需要所有这些?
-
我们有 fpga 内存空间,而是在用户空间中执行大部分驱动程序,并且只是从内核向用户空间发出中断信号
-
什么样的内存?一般用途?为什么不在内核驱动中使用 DMA 呢?
标签: linux-kernel interrupt-handling ioctl