C ISR中的事件通知
我正在尝试实现这个功能C ISR中的事件通知,c,linux,epoll,C,Linux,Epoll,我正在尝试实现这个功能 unsigned int (*poll) (struct file *filp, poll_table *wait); 我的司机。 我已使用将设备的文件描述符添加到等待队列中 poll_wait(filp, &myqueue, wait); 一旦数据被复制到内核缓冲区,就会产生一个中断。 如何在ISR中唤醒poll_wait()进程?这取决于您的设备。通常,当某些数据可用时,设备可以生成一个中断,然后将调用中断句柄函数,在中断句柄函数中,检查设备的寄存器以验证
unsigned int (*poll) (struct file *filp, poll_table *wait);
我的司机。
我已使用将设备的文件描述符添加到等待队列中
poll_wait(filp, &myqueue, wait);
一旦数据被复制到内核缓冲区,就会产生一个中断。
如何在ISR中唤醒poll_wait()进程?这取决于您的设备。通常,当某些数据可用时,设备可以生成一个中断,然后将调用中断句柄函数,在中断句柄函数中,检查设备的寄存器以验证是否有可用数据。根据第页,中断处理程序中的驱动程序应使用
唤醒(&myqueue)代码>叫醒服务员
poll_wait(file, q, pt)
为轮询/选择系统调用注册等待队列q。司机
当新数据可用时,应唤醒等待队列
这最好用一个例子来说明。下面是一个投票的例子
函数返回文件描述符的状态(是否可以
读取或写入)并注册两个可用于唤醒的等待队列
轮询/选择呼叫
然后,当数据再次可用时,驾驶员应呼叫:
LDD3手册在“6.2.2.简单睡眠”中描述了唤醒
当然,画面的另一半正在苏醒。其他的
执行线程(不同的进程或中断处理程序,
也许)必须为您执行唤醒,因为您的过程是
当然,睡着了。唤醒睡眠进程的基本功能是
叫醒你。它有几种形式(但我们只看其中的两种)
他们(现在):
wake_up唤醒在给定队列上等待的所有进程(尽管情况比这稍微复杂一点,我们将在后面看到)。另一种形式(唤醒可中断)仅限于执行可中断睡眠的进程。一般来说,这两种睡眠是无法区分的(如果您使用的是可中断睡眠);实际上,惯例是使用wait\u event时使用wake\u up,使用wait\u event\u interruptable时使用wake\u interruptable
这是什么操作系统内核?@vonbrand Debian 2.6.32如果是userland代码,那么文件是一个设备应该没有什么区别。它在内核空间中
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);
void wake_up(wait_queue_head_t *queue);
void wake_up_interruptible(wait_queue_head_t *queue);