Управление выводом GPIO в пределах 150 нс допуска - PullRequest
0 голосов
/ 15 июня 2019

Моя проблема в том, что включение и выключение моего вывода GPIO занимает слишком много времени, несмотря на использование хороших функций хронометража, включая ndelay из linux/delay.h и мой собственный accurate_ndelay, который (как показано ниже) использует ktime_get_ns() изlinux/ktime.h.

Моя версия ядра 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);
  }
}

Когда я измеряю реальную задержку (как показывает мой осциллограф, неплохое программное обеспечение),Задержка - не ожидаемые 350 нс, а 920 нс.Что для WS2812 - это 770 нс слишком много!

1 Ответ

1 голос
/ 10 июля 2019

Это довольно сжатые сроки.OrangePi Zero работает на частоте 1,2 ГГц, поэтому 150 нс - это 180 тактов.Это не дает вам времени на многое.

Первое, что нужно сделать, это использовать ktime_get_ns (), чтобы просто измерить, сколько времени занимает вызов gpio_set_value ().Или уберите задержку и измерьте ее прицеломВозможно, вы уже знаете ответ, если вы задержали 350 нс и измерили 920 нс, тогда это займет около 600 нс.

Вы вызываете gpio_set_value (), которая включает безопасную, переносимую библиотеку Linux gpio.Максимально возможная производительность будет состоять в том, чтобы написать свой собственный драйвер для GPIO, который идет прямо в регистры HW и устанавливает два состояния с задержкой как одно действие.

Даже с пользовательским драйвером вы 'Будут задержки, вызванные часами, приводящими в движение gpio, и временем нарастания и спада устройства.

...