微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

简单的Linux驱动程序,无需中断即可捕获中断并通知用户代码

如何解决简单的Linux驱动程序,无需中断即可捕获中断并通知用户代码

这很可能是重复的,但我还没有找到与我的水平相当的问答或示例...

我正在尝试将中断处理添加到简单的Linux驱动程序(当前仅对某些硬件寄存器实现mmap)。我现在想在用户空间中保留尽可能多的功能,以实现开发的灵活性。因此,我只希望内核驱动程序处理(并清除)IRQ,并实现pollread文件操作,以便用户代码可以有效地等待它。

我不打算轮询或读取多个线程,因此我不在乎它是单次唤醒还是广播。我确实关心在轮询开始之前发生中断的情况:这应该导致下一次轮询(或读取)立即返回。

我的问题是有关ISR和文件操作之间的同步的。哪种同步对象或模式合适?我见过的示例主要涉及“等待队列”,如果中断发生在检查之后,但在轮询进入队列之前,则可能会产生竞争条件。

(从RTOS的背景来看,我想要的是ISR可以引发的二进制信号量,并且可以挂起poll(或read)操作。我不确定在Linux中是否可用?)>

谢谢

解决方法

为完整起见,我将深入研究LDD3,为我自己的问题画一个答案。

快速答案:UIO

正如伊恩·雅培(Ian Abbott)所说。就是这种情况。

长答案:“等待队列”做正确的事

我误解了poll_wait()的功能,它实际上并没有等待,而只是以某种神奇的方式在队列中注册了轮询。在锁定状态下调用它是安全的(也是正常的)。因此没有比赛条件。

行为良好的驱动程序将同时实现pollread

此外:LDD3很旧。它早于Platform和DevRes以及驱动程序编写者应了解的许多其他内容。是否有现代的替代品(不一定免费)?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。