黑色田鼠骨板从用户空间获取中断

3
我正在使用 C++库(easyBlack) 通过 /dev/mem 处理 GPIO。
如我在“AM335x SitaraTM 处理器 - 技术参考手册”的“25.3.3 中断功能”章节中所见,
为了在 GPIO 引脚上发生定义的事件(电平或逻辑转换)时向主机处理器生成中断请求,必须按以下方式编程 GPIO 配置寄存器:
• 在 GPIO_IRQSTATUS_SET_0 和/或 GPIO_IRQSTATUS_SET_1 寄存器中启用 GPIO 通道的中断。
• 在 GPIO_LEVELDETECT0、GPIO_LEVELDETECT1、GPIO_RISINGDETECT 和 GPIO_FALLINGDETECT 寄存器中选择输入 GPIO 上预期的事件以触发中断请求。
直到这里都没问题,但我能找到的所有文档都是基于Linux内核头文件(“linux/gpio.h”和“linux/interrupt.h”),似乎不能用于用户空间程序,只能在模块中使用。或者示例使用内核驱动程序并监视sysfs中的状态文件以实现中断。这可能有效,但速度较慢,需要大量资源。

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

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

谢谢!

1个回答

1
很遗憾,在用户空间中无法获得真正的中断。这就是为什么所有依赖于中断的代码都是在内核模块或内核本身中编写的原因。通常情况下,这是可以接受的。中断服务例程应该尽可能快地完成,并将实际处理留给稍后安排的时间。这与您上面提到的sysfs中的statefile类似。对于您来说,看起来easyBlack库支持将GPIO内存空间映射到用户空间,然后允许您轮询引脚的状态。所显示的示例将非常处理密集型,因为主while循环中没有休眠。这意味着该进程将占用调度程序允许的所有CPU时间。
由于Beaglebone正在运行嵌入式Linux内核,我假设已编写了一个libGPIO驱动程序来支持GPIO。LibGPIO是Linux内核中的框架,它抽象了不同GPIO设备的某些细节并呈现了标准接口。尝试查看目录/sys/class/gpio。这应该为您提供GPIO或GPIO芯片的列表。
以下是GPIOsysfs文档的翻译:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接