我喜欢采样由Raspberry Pi的引脚生成的信号。我取得了高采样率难以实现的经验。什么是最好的方式来在Linux下采样周期gpio引脚?
首先我用Python(超慢)做了一个快速的方法。然后我改为ANSI C + bcm2835.h lib。我获得了显着的业绩增长。
现在我问自己这个问题:如何在Linux下做最好的采样?
我的尝试是在用户空间进行的。但是,切换到内核空间呢?我可以写一个简单的字符设备内核模块。在这个模块中,定期检查引脚。如果状态改变了一些信息被放入缓冲区。该I/O缓冲区由用户空间中的应用程序读取的同步文件进行轮询。对我来说,最好的解决方案是,如果引脚检查可以用固定频率完成(采样周期对于信号处理应该是恒定的)。
的设置为,这可能是:
@kernel:字符模块+内核线程+ GPIO设备树接口+ DSP以恒定的采样时间
@user空间:I/O的应用程序从读出的同步字符模块
想法/提示?
如果您在GPIO更改时可以使用某种中断,那么在内核中执行此操作将会非常有用。如果你要编写一个内核模式的线程,那么你在用户空间中的实时线程会更好。 – rodrigo
如果你想在用户空间中这样做,你需要确保你有最近的内核并安装了'libgpiod'。 – 0andriy
libgpiod正在使用“gpio.h”内核接口。字符模块像文件一样从引脚读取。 ppoll + timeout用于验证是否发生更改。 lib bcm2845正在使用存储器映射来访问GPIO寄存器。我认为这是最快的方法,因为mmu仅将逻辑地址转换为物理地址。 使用mmap在检查引脚时避免了设备层。读取循环内存的一部分的组合mmap +线程是什么? –