ISR中的事件通知

时间:2014-03-13 11:15:50

标签: c linux epoll

我正在尝试实现这个功能

unsigned int (*poll) (struct file *filp, poll_table *wait);

在我的司机。 我已使用

将设备的文件描述符添加到等待队列中
poll_wait(filp, &myqueue, wait);

只要将数据复制到内核缓冲区,就会产生中断。 如何在ISR中唤醒poll_wait()进程?

2 个答案:

答案 0 :(得分:2)

根据http://tali.admingilde.org/dhwk/vorlesung/ar01s08.html页面,中断处理程序中的驱动程序应使用wake_up(&myqueue);来唤醒服务员。

 poll_wait(file, q, pt)
  

注册等待队列q以进行轮询/选择系统调用。司机   当新数据可用时,应该唤醒等待队列。

     

最好用一个例子来说明。以下example_poll   function返回文件描述符的状态(是否可以   读取或写入)并注册两个可用于唤醒的等待队列   轮询/选择呼叫。

unsigned int example_poll(struct file * file, poll_table * pt)
 {
    unsigned int mask = 0;
    if (data_avail_to_read) mask |= POLLIN | POLLRDNORM;
    if (data_avail_to_write) mask |= POLLOUT | POLLWRNORM;
    poll_wait(file, &read_queue, pt);
    poll_wait(file, &write_queue, pt);
    return mask;
 }
  

然后,当数据再次可用时,驱动程序应调用:

 data_avail_to_read = 1;  
 wake_up(&read_queue);

LDD3手册介绍了http://www.makelinux.net/ldd3/chp-6-sect-2" 6.2.2中的wake_up。简单的睡眠"

  

当然,图片的另一半正在醒来。其他   执行线程(不同的进程或中断处理程序,   或许)必须为你执行唤醒,因为你的过程是   当然,睡着了。唤醒睡眠过程的基本功能是   叫做wake_up。它有几种形式(但我们只看两个   他们现在):

void wake_up(wait_queue_head_t *queue);
void wake_up_interruptible(wait_queue_head_t *queue);
  

wake_up唤醒等待给定队列的所有进程(虽然情况稍微复杂一点,我们稍后会看到)。另一种形式(wake_up_interruptible)将自身限制为执行可中断睡眠的进程。一般来说,这两者是难以区分的(如果你使用可中断的睡眠);实际上,如果使用wait_event,则使用wake_up,如果使用wait_event_interruptible,则使用wake_up_interruptible。

答案 1 :(得分:1)

取决于您的设备。通常,当某些数据可用时,设备可以生成中断,然后调用中断句柄函数,在中断句柄函数中,检查设备的寄存器以验证是否有可用的数据。