Linux内核模块在硬件中断时向进程发送信号

2024-09-26 17:59:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是BeagleBoneBlack,它的gpio引脚可通过内核模块配置。出于教育目的,我正在开发一个模块,能够在gpio状态改变时附加中断。在

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

逻辑如下:

  • Python进程在signalSIGIO
  • Python进程将他的pidgpiopin id发送到内核模块
  • 内核模块从python进程接收一个pidgpio id;将gpio pin注册到IVT表中的特定irq编号(用简单的内核函数实现),并为这个irq编号注册一个内核处理函数
  • 在硬件中断时(gpio状态已更改),内核处理程序函数将被调用,并通过与irq相关联的pid找到(python)任务,并将信号作为SIGIO发送到python进程
  • Python进程接收到这个信号并调用Python处理程序函数

这很好用,但我遇到了一个问题,如果Python进程有多个用于不同gpio管脚的处理程序呢。而不是调用所有的处理程序函数,这是一个错误的行为。我在网上搜索发现了一个this问题,强烈建议他不要进行这种内核用户空间通信,并使用轮询作为了解事件发生的方式。在

作为替代方案,我应该在python进程中对特定的gpio进行轮询。问题是,中断技术不是更好吗?我的意思是这只是一个常见的逻辑,python进程并不等待(忙)gpio状态的改变,当调用硬件中断时,他被告知事件,因此只有than使用cpu时间。在

我可能不明白到底是怎么回事,这就是为什么不把轮询技术作为实现这一目标的方法。在

我还备份了一些工作代码,所以如果它需要一些澄清,我可以展示它。在

谢谢你的帮助。在


Tags: 方法函数id处理程序gpio硬件信号进程

热门问题