c++ - BeagleBone Black 从用户空间获取中断

标签 c++ embedded-linux beagleboard beagleboneblack

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

正如我在《AM335x SitaraTM Processors - Technical Reference Manual》的“25.3.3 Interrupt Features”一章看到的

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

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

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

到此为止一切正常,但我能找到的所有文档都是基于使用 linux 内核头文件(“linux/gpio.h”和“linux/interrupt.h”),而且似乎不能用于用户空间程序,仅在模块中。或者 examples使用内核驱动程序并监视 sysfs 中的状态文件以实现中断。这可能行得通,但速度很慢并且需要大量资源。

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

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

谢谢!

最佳答案

不幸的是,真正的中断不可能进入用户空间。这就是为什么所有与中断相关的代码都写在内核模块或内核本身中的原因。不过通常这是可以的。 ISR 应设计得尽可能快,并将实际处理安排在以后的时间。这类似于您上面提到的 sysfs 中的状态文件。然而,对于您来说,easyBlack 库似乎支持将 GPIO 内存空间映射到用户空间,然后允许您轮询引脚的状态。显示的示例将非常处理密集,因为主 while 循环中没有休眠。这意味着该进程将占用调度程序允许的尽可能多的 CPU 时间。

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

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

您的用户空间软件可以打开相应 GPIO 的“值”文件,并且可以对该文件描述符使用“轮询”功能。这将允许您的软件阻塞,直到 GPIO 发生变化,然后采取相应行动,从而为您提供用户空间中的伪中断功能。

关于c++ - BeagleBone Black 从用户空间获取中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26841530/

相关文章:

c++ - #include 指令的限制范围

c - 如何知道linux调度器时间片?

android - 在 Android 上自定义/系统挂载点

python - 如何通过 BeagleBone 上的 GPIO 引脚生成声音信号

beagleboard - 无法在 BeagleBone Black 上访问 192.168.7.2

c++ - 如何在 QGraphicsScene 上绘制填充多边形

c++ - ADO 和异常处理

c++ - 在编译时选择一个变量

linux - tiny6410 friendlyarm 连接到电容式 lcd 但触摸在 linux 中不起作用

python - beagleboard 可以运行 python 或 Ruby 程序吗?