BeagleBone Black从用户空间获得中断

BeagleBone Black get interrupts from user-space

本文关键字:中断 空间 用户 Black BeagleBone      更新时间:2023-10-16

我使用C++库(easyBlack)通过/dev/mem处理GPIO。

正如我在"AM335x SitaraTM处理器-技术参考手册"的"25.3.3中断功能"一章中看到的那样

为了在GPIO引脚上发生定义事件(电平或逻辑转换)时向主机处理器生成中断请求,GPIO配置寄存器必须按如下方式编程:

•GPIO通道的中断必须在GPIO_IRQSTATUS_SET_0和/或GPIO_IRQSTATUS_SET_1寄存器中启用。

•必须在GPIO_LEVELDETECT0、GPIO_LEVEL DETECT1、GPIO_RISINGDETECT和GPIO_FALLINGDETECCT寄存器中选择输入GPIO上触发中断请求的预期事件。

到目前为止,一切正常,但我能找到的所有文档都是基于linux内核头文件("linux/gpio.h"answers"linux/interrupt.h"),而且似乎不能用于用户空间程序,只能用于模块中。或者使用内核驱动程序并监视sysfs中的状态文件来实现中断的示例。这可能奏效,但速度较慢,需要大量资源。

除了使用多线程来查看是否更改所需引脚的值之外,还有其他选择吗?(这个其他库是怎么做的?github.com/jackmitch/libsoc)

也许将easyBlack编译为内核模块?

谢谢!

不幸的是,在用户空间中不可能获得真正的中断。这就是为什么所有依赖中断的代码都是在内核模块或内核本身中编写的。通常情况下,这是可以的。ISR在设计上应尽可能快,并将实际处理留到以后安排。这与您在上面提到的sysfs中的状态文件类似。然而,对于您来说,easyBlack库似乎支持将GPIO内存空间映射到用户空间的内存,然后允许您轮询引脚的状态。所示的示例将是极其密集的处理,因为在main while循环中没有睡眠。这意味着进程将占用调度器允许的cpu时间。

由于Beaglebone运行的是嵌入式Linux内核,我假设已经编写了一个libGPIO驱动程序来支持GPIO。LibGPIO是linux内核中的一个框架,它抽象了不同GPIO设备的一些血腥细节,并提供了一个标准接口。请尝试在目录/sys/class/gpio中查找。这应该为您提供GPIO或GPIO芯片的列表。

以下是GPIOsysfs文档https://www.kernel.org/doc/Documentation/gpio/sysfs.txt

您的Userspace软件可以打开相应GPIO的"value"文件,并可以在该文件描述符上使用"poll"功能。这将允许您的软件阻塞,直到GPIO发生变化,然后相应地采取行动,从而在用户空间中为您提供伪中断功能。