【问题标题】:BeagleBone Black get interrupts from user-spaceBeagleBone Black 从用户空间获取中断
【发布时间】:2014-11-10 10:23:57
【问题描述】:

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

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

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

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

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

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

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

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

谢谢!

【问题讨论】:

    标签: c++ embedded-linux beagleboard beagleboneblack


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-19
      • 1970-01-01
      • 2017-09-17
      • 2014-09-19
      • 2016-11-30
      • 1970-01-01
      • 2015-01-09
      • 1970-01-01
      相关资源
      最近更新 更多