首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我能实现类似于Linux用户空间中的中断的功能吗?

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

Unix & Linux用户
提问于 2014-05-21 15:45:11
回答 3查看 7.9K关注 0票数 26

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

我所知道的最接近的是信号,它可以触发一个处理程序来中断线程的正常流,但是,在内核将线程带到前台之前,处理程序将不会接收到信号,这在信号发生后可能有几毫秒的时间--触发信号也不那么健壮;我需要一个应用程序或一个内核模块来发送信号,我不能只把它三次连接到GPIO引脚上。

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

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

EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2014-05-22 00:52:30

如果我明白你的问题,这件艺术品听起来就像你要找的东西。这篇文章的标题是:用户空间中的设备驱动程序

节选

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

  • 将设备内存区域指示给用户空间。
  • 登记设备中断,并向用户空间提供中断指示。

然后,内核空间UIO组件通过一组sysfs条目(如/dev/uioXX )公开设备。用户空间组件搜索这些条目,读取设备地址范围并将它们映射到用户空间内存。用户空间组件可以执行所有设备管理任务,包括来自设备的I/O。但是,对于中断,它需要对设备条目执行阻塞读(),这将导致内核组件使用户空间应用程序休眠,并在接收到中断时唤醒它。

我从来没有这样做过,所以我不能给你更多的指导,但我认为这可能会对你的探索有所帮助。

票数 11
EN

Unix & Linux用户

发布于 2014-05-23 14:07:22

按照@RBerteig的思路,BeagleBone黑包含可编程实时单元(PRU) 32位微控制器

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

我不能说我已经使用过这个,甚至我已经在我的BeagleBone黑人上运行了更多的例子,但是在这个问题中表达的需求可能是这样的事情之一,它可以促使开发人员将这些需求推向黑色,远离Pi。

票数 3
EN

Unix & Linux用户

发布于 2014-05-22 05:11:38

跳出框框思考一下,这可能是像ala模式板这样的应用的一个很好的例子。这是一个“圆周板”,包含一个完整的Arduino。您将构建硬实时响应、位重击总线协议或其他深嵌入式逻辑,以便在其AVR处理器中运行,并通过更高的延迟通道与Linux中的进程进行通信。

ala模式并不是唯一可用的硬件选择。提供Linux和Arduino的类似的Arduino模型是Arduino Yún,它既有基于MIPS的嵌入式Linux,也有一个AVR。Arduino还宣布了基于ARM SOC的阿杜诺特,但它已经“很快”发布了一年。如果RPi和Arduino都能从更多的马力中获益的话,还有UDOO,它有一个四核臂皮质--A9和GPU,运行Linux或Android,以及与阿迪诺到期上相同的爱特梅尔臂皮层M3芯片。

如果您的问题适合于这种分区,那么您将得到以下所有优点:一个深嵌入式系统直接在金属上运行,在您和GPIO引脚之间没有OS层,而后面仍然有一个完整的Linux内核来处理网络、业务逻辑、用户界面以及磁盘驱动器和视频等复杂硬件。如果Arduino不足以支持您的低级别处理,那么有许多可供选择的深嵌入式芯片和模块可供考虑,几乎所有这些芯片和模块都有UART、I2C,甚至USB可用于与Linux端进行通信。

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

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/136274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档