首页 > 解决方案 > .Net Core 似乎以大约 1000 / 秒的速度读取 GPIO 引脚。如何走得更快?

问题描述

我编写了一个 C# .Net Core 3.1 应用程序来读取 Orange Pi Zero 的 GPIO 上的引脚状态变化。我正在使用 System.Devices.Gpio IoT 库。我正在运行 Armbian Focal(基于 Ubuntu 20.04)。

我正在尝试读取方波信号的频率,这会使 GPIO 上的引脚上升和下降。所以我试图读取 1 秒内出现了多少个上升(或下降)边沿。

我已经尝试在循环中轮询引脚,并注册到事件/回调以进行引脚更改,但我似乎无法以每秒大约 1000 次(1 Khz)的速度读取

不幸的是,我需要每秒至少阅读 5000 次(最好是更多)。

我认为限制不在硬件方面。我认为这是事实,即 .Net Core 运行在 CLR 之上,这是一个额外的层,会减慢速度。

我正在考虑用 Python 编写应用程序的这一部分(我将把应用程序的其余部分留在 C#/.Net Core 中),但我不知道它是否会加快速度?我知道 Python 是当今 SBC 的一种事实上的编程语言,这就是我考虑它的原因(大量的社区支持和示例)。但它是一种解释性语言。它不会比编译的C#慢吗?但是话又说回来,也许 Python 直接与 Linux 对话,这与通过 CLR 的 C# .Net Core 不同。Python 也融入了 Ubuntu,所以这种紧密集成可能有一些好处。

我知道 C 语言是最快的,但也是最难编写的语言(除了汇编语言)。我对 C 和 Python 都不太熟悉,但我认为 Python 的学习曲线不会那么陡峭。

总而言之,我的问题是:我可以在 .Net Core 中做些什么来加快读取 GPIO 的速度吗?也许使用第三方库而不是 System.Devices.Gpio 有帮助(我对此表示怀疑)?限制可能是在硬件上还是在 Amrbian(Ubuntu)中(我怀疑)?我是否应该费心在 Python 中尝试它,还是会浪费时间而我应该直接使用 C 语言?

抱歉,我知道我的问题可能不符合 StackOverflow 政策。我只是想知道是否有人在读取 GPIO 引脚状态变化非常快(如测量 KHz 范围内的频率)方面有任何经验 - 在橙色或树莓派或类似的东西上......

我会很感激任何指示。

谢谢你。

标签: python.net-coreraspberry-pigpioorange-pi

解决方案


尽管用更快的语言(可能是 Python,肯定是 C)重新编写代码会有所帮助,但最后我们决定放置一个硬件辅助(正如我读过的其他帖子中的一些建议)。我们将使用Raspberry Pi 射频频率计数器解决方案。

不过,感谢@r_ahlskog和 PMF 的输入。非常感谢。


推荐阅读