我可以在 Linux 用户空间中实现类似于中断的功能吗?

SF.*_*SF. 25 linux embedded

我最怀念嵌入式 Linux 中“小型嵌入式”的功能之一是中断。特定引脚上出现信号,或触发其他中断源,CPU 内部所做的任何事情都会被中断,然后启动我的中断处理程序功能。在 Linux 中,一切都被缓冲,如果发生某些事情,系统只会按照自己的方式进行,当(最后)给定线程被带到前台时,其等待外部源的等待状态结束,其处理程序开始。

我所知道的最接近的是信号,它可以触发中断线程正常流程的处理程序,但是,在内核将线程置于前台之前,处理程序不会接收信号,这可能是信号发生后的许多毫秒- 触发信号也不那么可靠;我需要一个应用程序或内核模块来发送信号,我不能简单地将它连接到 GPIO 引脚。

我如何才能在 Linux 用户空间软件中实现类似于硬件中断的功能——在触发外部源条件后立即启动特定功能或将特定线程置于前台,而无需等待进程队列将我的线程置于前台?

如果你觉得这个问题太宽泛,让我们把它缩小到一个具体的例子:Raspberry Pi 板在它的一个 GPIO 引脚上接收一个信号(不一定是任意的;如果只有一些引脚可以做到这一点,那没关系。)我想要我的用户空间应用程序在尽可能短的时间内对此事件做出反应,无论是使其退出等待状态,启动处理程序函数或任何等效机制,但最重要的是在处理程序被引入之前不等待任务队列循环通过所有挂起的进程到前台,但尽快触发它。(特别是,当没有信号时,不会让系统永远锁定,处理程序进程占用 100% CPU 时间轮询输入并且永远不会屈服于操作系统。)有这样的机制吗?

slm*_*slm 10

如果我理解你的问题,这篇文章听起来就像你在找什么。这篇文章的标题是:用户空间中的设备驱动程序

摘抄

接口驱动程序

Linux 为开发基于用户空间的设备驱动程序提供了标准的 UIO(用户 I/O)框架。UIO 框架定义了一个小的内核空间组件,它执行两个关键任务:

  • 一种。将设备内存区域指示给用户空间。
  • 湾 注册设备中断并向用户空间提供中断指示。

然后,内核空间 UIO 组件通过一组 sysfs 条目(如 /dev/uioXX)公开设备。用户空间组件搜索这些条目,读取设备地址范围并将它们映射到用户空间内存。

用户空间组件可以执行所有设备管理任务,包括来自设备的 I/O。然而,对于中断,它需要对设备条目执行阻塞 read(),这会导致内核组件将用户空间应用程序置于睡眠状态,并在收到中断后将其唤醒。

我以前从未这样做过,所以我无法为您提供比这更多的指导,但我认为这可能对您的追求有所帮助。

  • 当内核为了 IO 完成而唤醒一个任务时,我相信它会得到一些优先级提升。然而,它不会为最坏情况的延迟提供硬保证,因为有很多原因使进程可运行仍然会在进程实际运行之前留下大量工作要做。但这可能是您可以从未修改的内核中获得的最佳延迟。 (2认同)