我有一些硬件资源在完成时会触发中断。我想实现一个activateHw()
仅在操作完成时才返回的函数(即触发中断时),但我不希望它浪费 CPU 时间(无中断轮询)。基本上,我想要的是:
bool activateHw() {
trigger_hw();
sleep_until_interrupt_arrived();
return true;
}
如何在 Linux 中实现这一点?
如果您正在编写内核模块,您可以使用它request_irq()
来设置回调/中断处理程序。您的中断处理程序可以将数据写入字符设备。您的阻塞函数只需要调用poll
字符设备上的系统调用。它将阻塞并休眠,直到数据可用。
查看gpio.txt,特别是如何通过配置应该触发中断的边缘来设置 gpio 引脚以写入 /sys/.../gpioxx/value。如果程序的时间要求不是很高,这也可以用于用户空间代码。
我建议你使用等待队列。在中断处理程序中,您唤醒等待线程。这样你就不会浪费资源(例如使用自旋锁)。
看看这个教程。
查看 linux 源代码,示例用法是/drivers/char/hpet.c
or drivers/char/rtc.c
。