作者热门文章
- html - 我的下拉菜单的内容关闭得太快
- c# - 使用 Html Agility Pack 从网页中的表中获取值而不使用 "SelectNode'
- html - 内容容器下的 CSS 下拉菜单
- html - 如何停止嵌套列表重叠父列表?
我的问题是,尽管使用了良好的计时功能,包括来自 linux/delay.h
的 ndelay
和我的 GPIO 引脚,但打开和关闭 GPIO 引脚花费的时间太长。自己的accurate_ndelay(如下所示)使用linux/ktime.h
中的ktime_get_ns()
。
我的内核版本是 4.19.38,使用 Armbian,在 OrangePi Zero 上运行。
static inline void accurate_ndelay(uint16_t ns){
uint64_t s = ktime_get_ns();
uint64_t e = s + ns;
while(ktime_get_ns() < e);
}
static inline void unsafe_bit2812(struct WS2812* ws2812, uint8_t b){
if(b){
gpio_set_value(ws2812->pin, 1);
accurate_ndelay(ws2812->t0h);
gpio_set_value(ws2812->pin, 0);
accurate_ndelay(ws2812->t0l);
} else {
gpio_set_value(ws2812->pin, 1);
accurate_ndelay(ws2812->t1h);
gpio_set_value(ws2812->pin, 0);
accurate_ndelay(ws2812->t1l);
}
}
当我测量现实世界的延迟时(如我的示波器所示,不错的软件)。延迟不是预期的350ns,而是920ns。对于 WS2812 来说 770ns 太多了!
最佳答案
时间非常紧迫。 OrangePi Zero 的运行频率为 1.2 GHz,因此 150 ns 是 180 个时钟周期。这并没有给你时间做太多事情。
要做的第一件事是使用 ktime_get_ns() 来测量 gpio_set_value() 调用需要多长时间。或者消除延迟并用示波器测量。您可能已经知道答案了,如果您延迟 350ns 并测量 920ns,那么大约需要 600ns。
您正在调用 gpio_set_value(),它会引入安全、可移植的 Linux gpio 库。最大可能的性能是为 GPIO 编写自己的驱动程序,该驱动程序直接进入硬件寄存器并设置两个状态,并带有延迟,作为单个操作。
即使使用自定义驱动程序,驱动 GPIO 的时钟以及设备的上升和下降时间也会带来延迟。
关于将 GPIO 引脚控制在 150ns 的容差范围内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56610084/
我是一名优秀的程序员,十分优秀!