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

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

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

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

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

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

答案1

如果我理解您的问题,这篇文章听起来就像您正在寻找的内容。文章标题为:用户空间中的设备驱动程序

摘抄

UIO驱动程序

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

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

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

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

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

答案2

与 @RBerteig 的思路相同,BeagleBone Black 包含可编程实时单元 (PRU)32位微控制器

看起来并没有一个庞大的社区充分利用这些东西。我什至不确定是否有一个好的编译器。与 SBC 和微控制器或微控制器板组装相比的优点是 PRU 代码可以来自主 ARM,并且共享内存非常方便。

不能说我已经使用过这个,甚至不能说我已经在 BeagleBone Black 上运行了更多示例,但这个问题中表达的需求可能是可以推动具有这些需求的开发人员走向黑色且远离 Pi。

答案3

跳出框框思考一下,这可能是使用类似ala 模式板。这是一个包含完整 Arduino 的“pi 板”。您可以构建硬实时响应、位总线协议或其他深度嵌入逻辑以在其 AVR 处理器中运行,并通过较高延迟的通道与 Linux 中的进程进行通信。

ala 模式并不是唯一可用的现成硬件选择。提供 Linux 和 Arduino 的类似 Arduino 模型是Arduino云它既有基于 MIPS 的嵌入式 Linux SOC,也有 AVR。 Arduino 还宣布Arduino Tre基于 ARM SOC,但它已经“即将推出”一年了。如果 RPi 和 Arduino 都可以从更大的马力中受益,那么还有优度,具有四核 ARM CORTEX-A9 和运行 Linux 或 Android 的 GPU,以及与上一代相同的 Atmel ARM CORTEX-M3 芯片Arduino 到期

如果您的问题适合这种分区,您将获得直接在金属上运行的深度嵌入式系统的所有优势,您和 GPIO 引脚之间没有操作系统层,同时仍然拥有完整的 Linux 内核来处理网络、业务逻辑、用户界面以及复杂的硬件(例如磁盘驱动器和视频)。如果 Arduino 的功能不足以支持您的低级处理,那么可以考虑许多替代的深度嵌入式芯片和模块,几乎所有这些芯片和模块都具有 UART、I2C 甚至 USB 可用于与 Linux 端通信东西的。

这种架构的优点之一是您可能根本不需要接触 Linux 内核。硬实时代码在内核之外的自己的 CPU 中运行,两者之间的通信可以使用现有的驱动程序和协议。

相关内容