我有一些硬件资源在完成后触发中断。
我想实现一个函数activateHw()
,它只在动作结束时返回(意味着,当触发中断时),但我不希望它浪费CPU时间(没有中断轮询)。基本上,我想要的是:
bool activateHw() {
trigger_hw();
sleep_until_interrupt_arrived();
return true;
}
如何在Linux中实现这一目标?
答案 0 :(得分:2)
如果您正在编写内核模块,则可以使用request_irq()
来设置回调/中断处理程序。您的中断处理程序可以将数据写入字符设备。您的阻塞功能只需要在角色设备上调用poll
系统调用。它会阻塞并睡眠,直到数据可用。
查看gpio.txt,具体说明如何通过配置应触发中断的边缘来设置gpio引脚以写入/sys/.../gpioxx/value。如果程序不是太时间关键,这也可以用于用户空间代码。
答案 1 :(得分:1)
我建议你使用等待队列。在中断处理程序中,您唤醒等待的线程。这样你就不会浪费资源(例如使用自旋锁)。
看一下linux源码,一个示例用法是/drivers/char/hpet.c
或drivers/char/rtc.c
。