我有几个已注册的中断分配给 gpios 和用户空间中的应用程序。如何通知应用程序发生中断以及发生了哪个中断?
可能 fasync 适用于这个目标,但我可以找到如何将信息从中断处理程序发送到用户空间应用程序的示例。
如果你能提供一些有用的例子,那就太好了。
提前致谢。
我有几个已注册的中断分配给 gpios 和用户空间中的应用程序。如何通知应用程序发生中断以及发生了哪个中断?
可能 fasync 适用于这个目标,但我可以找到如何将信息从中断处理程序发送到用户空间应用程序的示例。
如果你能提供一些有用的例子,那就太好了。
提前致谢。
您不需要花哨的内核与用户空间通信。用户空间应用程序可以使用 Sysfs 访问 GPIO。阅读它Documentation/gpio.txt
。
首先,像这样导出一个 GPIO 引脚(实际数量取决于您的设置):
# echo 23 > /sys/class/gpio/export
这将导出 GPIO 引脚 #23,从而创建/sys/class/gpio/gpio23
.
设置它的方向:
# echo in > /sys/class/gpio/gpio23/direction
如果硬件 GPIO 控制器支持中断生成,驱动程序也应该支持它,你会看到/sys/class/gpio/gpio23/edge
. 将rising
或写入此falling
文件both
以指示将创建“用户空间中断”的信号沿。现在,要中断,请使用poll(2)
系统调用 on /sys/class/gpio/gpio23/value
。然后,当poll
调用解除阻塞时,读取新值 ( /sys/class/gpio/gpio23/value
),它将是'0'
or '1'
(ASCII)。
dinesh 提供了 eepp 提出的解决方案的 C 实现,它要求 poll() 中的应用程序块。
这是一个抽象此功能的 C++ 实现,并提供回调/中断功能。请注意将回调函数作为参数的 GPIO 构造函数。这提供了 OP 所需的能力。