我的问题是,尽管使用了良好的计时功能,包括我的ndelay
的{{1}}和我自己的linux/delay.h
(如下所示),打开和关闭GPIO引脚的时间仍然太长了)使用accurate_ndelay
中的ktime_get_ns()
。
我的内核版本是Armbian的4.19.38,在OrangePi Zero上运行。
linux/ktime.h
当我测量实际延迟时(如示波器所示,不是不良软件)。延迟不是预期的350ns,而是920ns。对于WS2812来说,这是770ns太多了!
答案 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以及设备的上升和下降时间也会带来延迟。