我正在使用BeagleBone Black,它具有可通过内核模块配置的gpio引脚 . 在教育方面,我正在开发一个能够在gpio状态变化上附加中断的模块 .

我的想法是我在Python中有一个接口,它将pid发送到设备(内核模块),从而等待来自内核空间的硬件中断信号以执行某个动作(方法) .

所以逻辑如下:

  • Python进程设置一个可在信号SIGIO上调用的处理函数

  • Python进程将他的pid和gpio引脚ID发送到内核模块

  • 内核模块从python进程接收pid和gpio id;将gpio引脚注册到IVT表中的特定irq号(使用简单的内核函数完成此操作)并为此irq号注册内核处理函数

  • 在硬件中断(gpio状态已更改)上,调用内核处理程序函数,并通过与irq编号关联的pid找到(python)任务,并将信号作为SIGIO发送到Python进程

  • Python进程收到此信号并调用python处理函数

这很有效,但我遇到了一个问题,如果Python进程有多个处理器用于不同的gpio引脚会怎样 . 比调用所有处理函数,这是一种不好的行为 . 我在网上搜索并发现this问题,强烈建议不要进行这种内核用户空间通信,并使用轮询作为了解发生事件的方法 .

作为替代方案,我应该从特定gpio引脚的python进程中进行轮询 . 问题是,isn 't the interrupt technique better? I mean this is just a common logic, the python process isn' t等待(忙)gpio状态改变,当调用硬件中断时,他比仅仅通知事件并因此只使用cpu时间 .

我可能不知道为什么不把轮询技术看作是这样做的方法 .

我也支持一些工作代码,所以如果需要一些澄清,我可以展示它 .

谢谢你的帮助 .