wait_event_interruptible和wake_up_interruptible花费20毫秒到30毫秒

时间:2018-07-15 05:39:32

标签: linux v4l2

我正在使用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吗?

先谢谢了。

关于, 库尔卡尼。

0 个答案:

没有答案