2017-05-27 132 views
0

我喜欢采样由Raspberry Pi的引脚生成的信号。我取得了高采样率难以实现的经验。什么是最好的方式来在Linux下采样周期gpio引脚?

首先我用Python(超慢)做了一个快速的方法。然后我改为ANSI C + bcm2835.h lib。我获得了显着的业绩增长。

现在我问自己这个问题:如何在Linux下做最好的采样?

我的尝试是在用户空间进行的。但是,切换到内核空间呢?我可以写一个简单的字符设备内核模块。在这个模块中,定期检查引脚。如果状态改变了一些信息被放入缓冲区。该I/O缓冲区由用户空间中的应用程序读取的同步文件进行轮询。对我来说,最好的解决方案是,如果引脚检查可以用固定频率完成(采样周期对于信号处理应该是恒定的)。

的设置为,这可能是:

@kernel:字符模块+内核线程+ GPIO设备树接口+ DSP以恒定的采样时间

@user空间:I/O的应用程序从读出的同步字符模块

想法/提示?

+1

如果您在GPIO更改时可以使用某种中断,那么在内核中执行此操作将会非常有用。如果你要编写一个内核模式的线程,那么你在用户空间中的实时线程会更好。 – rodrigo

+1

如果你想在用户空间中这样做,你需要确保你有最近的内核并安装了'libgpiod'。 – 0andriy

+0

libgpiod正在使用“gpio.h”内核接口。字符模块像文件一样从引脚读取。 ppoll + timeout用于验证是否发生更改。 lib bcm2845正在使用存储器映射来访问GPIO寄存器。我认为这是最快的方法,因为mmu仅将逻辑地址转换为物理地址。 使用mmap在检查引脚时避免了设备层。读取循环内存的一部分的组合mmap +线程是什么? –

回答

1

我有一个解决方案给你。

我写了这样的模块:

https://github.com/Appyx/gpio-reflect

您可以同步读取来自GPIO引脚的任何信号。

您可以使用输出并根据您的采样率计算信号。 只需分割期间。

+0

该代码正在检测引脚的变化。这是基于事件的。我所问的问题是要在一个恒定的时基上采样一个引脚(每100ms读取引脚1,56和96)。尽管将引脚(文件源)与中断连接似乎是最先进的解决方案。 @Appyx解决方案是基于http://derekmolloy.ie/kernel-gpio-programming-buttons-and-leds/ –

+1

亚我知道,但你可以采取发送的例子,只需更换gpio功能。最好的解决方案是使用hr_timer进行持续采样,然后将值写入读取缓冲区。 – Appyx

+0

什么更好 - 使用hrtimer而不是内核线程来定期读/写一个引脚? 可以在这里找到一个很好的hrtimer示例:https://gist.github.com/maggocnx/5946907 –

相关问题