Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C ISR中的事件通知_C_Linux_Epoll - Fatal编程技术网

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);