将GPIO引脚控制在容差150ns之内

时间:2019-06-15 11:46:58

标签: c linux-device-driver gpio

我的问题是,尽管使用了良好的计时功能,包括我的ndelay的{​​{1}}和我自己的linux/delay.h(如下所示),打开和关闭GPIO引脚的时间仍然太长了)使用accurate_ndelay中的ktime_get_ns()

我的内核版本是Armbian的4.19.38,在OrangePi Zero上运行。

linux/ktime.h

当我测量实际延迟时(如示波器所示,不是不良软件)。延迟不是预期的350ns,而是920ns。对于WS2812来说,这是770ns太多了!

1 个答案:

答案 0 :(得分:1)

那是一个相当紧迫的时机。 OrangePi Zero的运行频率为1.2 GHz,因此150 ns是180个时钟周期。那不会给你时间做很多事情。

要做的第一件事是使用ktime_get_ns()仅测量gpio_set_value()调用花费的时间。或删除延迟并用示波器对其进行测量。您可能已经知道答案了,如果延迟350ns并测量到920ns,则大约需要600ns。

您正在调用gpio_set_value(),它将引入安全,可移植的Linux gpio库。可能的最大性能是为GPIO编写自己的驱动程序,该驱动程序直接进入硬件寄存器,并通过一个动作设置两个状态(带延迟)。

即使使用自定义驱动程序,时钟驱动gpio以及设备的上升和下降时间也会带来延迟。