Windows 10 物联网GPIO中断频率
Windows 10 IoT GPIO interrupt frequency
我有一个 raspberry pi 3 和 Windows 10 物联网。我想从发送脉冲的传感器获取数据。即 Swiss Flow SF800 link。该传感器将发出与通过传感器的流量相等的脉冲量。数据表说我将发送高达 2kHz。
我的问题是 raspberry pi 上的 GPIO 会处理这么高的中断频率吗?我研究了 lightning 提供者 https://developer.microsoft.com/en-us/windows/iot/docs/lightningproviders,这应该是一个巨大的性能提升,但找不到任何关于我应该期望什么样的性能的文档。
GPIO中断暂无官方基准测试
这里是Windows IoT Lightning Performance Testing。它通过以尽可能快的速度在 0 和 1 之间切换 GPIO 5 来测试 GPIO 性能。好像至少可以达到17.4kHz
并且GPIO interrupt event should be pushed into the queue并且不会丢失。
因此,根据以上信息,对于2kHz,应用程序将能够及时处理此类速度中断事件而不会丢失。
请随意使用它,如果有任何问题,请告诉我。
最初我怀疑我需要使用闪电驱动器才能达到我需要的中断频率。事实证明,标准的收件箱驱动程序足以满足我的需要。
以下是重现我的情况的步骤:
我创建了一个简单的 Arduino 草图,可以以 10,000 Hz 的速率发出脉冲。
int dataPin = 12;
void setup() {
pinMode(dataPin, OUTPUT);
}
void loop() {
int count = 0;
while (count < 400)
{
//pulse
digitalWrite(dataPin, HIGH);
digitalWrite(dataPin, LOW);
//This delay presumably makes the pulse be 10000 Hz
delayMicroseconds(100);
count++;
}
delay(5000);
}
使用简单的 UI 创建了一个 UWP 应用程序,在页面中央有一个 TextBlock。
public sealed partial class MainPage : Page
{
private GpioController gpio;
private const int inputPinNumber = 17;
private GpioPin inputPin;
private int count;
private I2cController i2cController;
private SpiController spiController;
public MainPage()
{
this.InitializeComponent();
this.Setup();
}
private void Setup()
{
if (LightningProvider.IsLightningEnabled)
{
LowLevelDevicesController.DefaultProvider = LightningProvider.GetAggregateProvider();
}
this.gpio = GpioController.GetDefault();
this.inputPin = this.gpio.OpenPin(inputPinNumber);
if (this.inputPin.IsDriveModeSupported(GpioPinDriveMode.InputPullUp))
{
this.inputPin.SetDriveMode(GpioPinDriveMode.InputPullUp);
}
else
{
this.inputPin.SetDriveMode(GpioPinDriveMode.Input);
}
this.inputPin.ValueChanged += InputPinOnValueChanged;
}
private void InputPinOnValueChanged(GpioPin sender, GpioPinValueChangedEventArgs args)
{
var task = Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
if (args.Edge == GpioPinEdge.FallingEdge)
{
this.count++;
this.CountBlock.Text = this.count.ToString();
}
else
{
}
});
}
}
}
设置 Windows IoT 以使用直接内存映射驱动程序。
下一步是通过晶体管将 Arduino 上的引脚与 Pi 上的引脚连接起来。我这样做是为了利用 Pi 上 GPIO 引脚上的内置 Pull-Up 电阻。
当两个应用程序同时 运行 时,我每个周期只收集了大约 30 个脉冲。
返回 Windows IoT 设置并将驱动程序重置回收件箱驱动程序并重新运行两个应用程序。这次我没有漏脉
总之,收件箱驱动程序应该足以给我高达 10khz 的频率,没有任何问题。
我有一个 raspberry pi 3 和 Windows 10 物联网。我想从发送脉冲的传感器获取数据。即 Swiss Flow SF800 link。该传感器将发出与通过传感器的流量相等的脉冲量。数据表说我将发送高达 2kHz。
我的问题是 raspberry pi 上的 GPIO 会处理这么高的中断频率吗?我研究了 lightning 提供者 https://developer.microsoft.com/en-us/windows/iot/docs/lightningproviders,这应该是一个巨大的性能提升,但找不到任何关于我应该期望什么样的性能的文档。
GPIO中断暂无官方基准测试
这里是Windows IoT Lightning Performance Testing。它通过以尽可能快的速度在 0 和 1 之间切换 GPIO 5 来测试 GPIO 性能。好像至少可以达到17.4kHz
并且GPIO interrupt event should be pushed into the queue并且不会丢失。
因此,根据以上信息,对于2kHz,应用程序将能够及时处理此类速度中断事件而不会丢失。
请随意使用它,如果有任何问题,请告诉我。
最初我怀疑我需要使用闪电驱动器才能达到我需要的中断频率。事实证明,标准的收件箱驱动程序足以满足我的需要。
以下是重现我的情况的步骤:
我创建了一个简单的 Arduino 草图,可以以 10,000 Hz 的速率发出脉冲。
int dataPin = 12;
void setup() {
pinMode(dataPin, OUTPUT);
}
void loop() {
int count = 0;
while (count < 400)
{
//pulse
digitalWrite(dataPin, HIGH);
digitalWrite(dataPin, LOW);
//This delay presumably makes the pulse be 10000 Hz
delayMicroseconds(100);
count++;
}
delay(5000);
}
使用简单的 UI 创建了一个 UWP 应用程序,在页面中央有一个 TextBlock。
public sealed partial class MainPage : Page
{
private GpioController gpio;
private const int inputPinNumber = 17;
private GpioPin inputPin;
private int count;
private I2cController i2cController;
private SpiController spiController;
public MainPage()
{
this.InitializeComponent();
this.Setup();
}
private void Setup()
{
if (LightningProvider.IsLightningEnabled)
{
LowLevelDevicesController.DefaultProvider = LightningProvider.GetAggregateProvider();
}
this.gpio = GpioController.GetDefault();
this.inputPin = this.gpio.OpenPin(inputPinNumber);
if (this.inputPin.IsDriveModeSupported(GpioPinDriveMode.InputPullUp))
{
this.inputPin.SetDriveMode(GpioPinDriveMode.InputPullUp);
}
else
{
this.inputPin.SetDriveMode(GpioPinDriveMode.Input);
}
this.inputPin.ValueChanged += InputPinOnValueChanged;
}
private void InputPinOnValueChanged(GpioPin sender, GpioPinValueChangedEventArgs args)
{
var task = Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
if (args.Edge == GpioPinEdge.FallingEdge)
{
this.count++;
this.CountBlock.Text = this.count.ToString();
}
else
{
}
});
}
}
}
设置 Windows IoT 以使用直接内存映射驱动程序。
下一步是通过晶体管将 Arduino 上的引脚与 Pi 上的引脚连接起来。我这样做是为了利用 Pi 上 GPIO 引脚上的内置 Pull-Up 电阻。
当两个应用程序同时 运行 时,我每个周期只收集了大约 30 个脉冲。
返回 Windows IoT 设置并将驱动程序重置回收件箱驱动程序并重新运行两个应用程序。这次我没有漏脉
总之,收件箱驱动程序应该足以给我高达 10khz 的频率,没有任何问题。