gpt4 book ai didi

将 GPIO 引脚控制在 150ns 的容差范围内

转载 作者:行者123 更新时间:2023-11-30 14:38:26 25 4
gpt4 key购买 nike

我的问题是,尽管使用了良好的计时功能,包括来自 linux/delay.hndelay 和我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com