如何在不浪费CPU时间的情况下实现阻塞调用?

时间:2013-11-12 11:39:32

标签: linux interrupt

我有一些硬件资源在完成后触发中断。 我想实现一个函数activateHw(),它只在动作结束时返回(意味着,当触发中断时),但我不希望它浪费CPU时间(没有中断轮询)。基本上,我想要的是:

bool activateHw() {
    trigger_hw();
    sleep_until_interrupt_arrived();
    return true;
}

如何在Linux中实现这一目标?

2 个答案:

答案 0 :(得分:2)

如果您正在编写内核模块,则可以使用request_irq()来设置回调/中断处理程序。您的中断处理程序可以将数据写入字符设备。您的阻塞功能只需要在角色设备上调用poll系统调用。它会阻塞并睡眠,直到数据可用。

查看gpio.txt,具体说明如何通过配置应触发中断的边缘来设置gpio引脚以写入/sys/.../gpioxx/value。如果程序不是太时间关键,这也可以用于用户空间代码。

here is a SO question that seemed related

答案 1 :(得分:1)

我建议你使用等待队列。在中断处理程序中,您唤醒等待的线程。这样你就不会浪费资源(例如使用自旋锁)。

看看this tutorial

看一下linux源码,一个示例用法是/drivers/char/hpet.cdrivers/char/rtc.c