我正在使用PCIe卡。当PCIe卡引发MSI中断时,将调用ISR处理程序。在ISR例程中,wake_up_interruptible将唤醒V4L2线程。但是,ISR中的wake_up_interruptible和v4l2线程中的wait_event_interruptible之间的持续时间为20毫秒至30毫秒。时间是使用Linux内核中的do_gettimeofday()函数测量的。下面是代码片段:
File1.c
struct timeval t0;
irqreturn_t irq_hanlder(int irq, void *data)
{
...
...
do_gettimeofday(&t0);
printk("wake_up_interruptible: Time in micro_sec:%d\n",t0.tv_usec);
atomic_set (&flag, 1);
wake_up_interruptible(&my_wq);
...
...
return IRQ_HANDLED;
}
File2.c
struct timeval t1;
static int v4l2_thread(void *handle)
{
...
while(1)
{
...
wait_event_interruptible(my_wq, (atomic_read (&flag)));
atomic_set (&flag, 0);
do_gettimeofday(&t1);
printk("wait_event_interruptible: Time in micro_sec:%d\n",t1.tv_usec);
...
}
...
return 0;
}
执行上述代码段代码后,wake_up_interruptible和wait_event_interruptible之间的持续时间约为20毫秒至30毫秒。 我已经使用了wake_up_interruptible_sync()而不是wake_up_interruptible,这也是相同的行为。
查询:
1)为什么linux内核要花大约20毫秒到30毫秒的时间来唤醒正在file2.c中休眠的线程?
2)在Linux中还有其他方法可以处理唤醒线程吗?
3)如何减少唤醒和中断之间的时间 wait_event_interruptible吗?
先谢谢了。
关于, 库尔卡尼。