Быстрая передача сигнала на raspberry

Тема в разделе "Raspberry Pi", создана пользователем IsNotMyName, 10 сен 2019.

  1. IsNotMyName

    IsNotMyName Нуб

    Есть raspberry pi zero v1.3 с установленной raspbian. Пишу передатчик сигнала. Нужно как можно быстрее передавать импульсы (1 или 0 на пине), однако с определенными задержками. Код на Си, библиотека для работы с gpio - bcm2835.

    1. Существует ли функция, которая может организовать задержку, например, в 100 наносекунд?

    2. Какими средствами можно добиться максимально быстрой и стабильной работы кода?
     
  2. Igor68

    Igor68 Гуру

  3. Daniil

    Daniil Гуру

    Только программистом
     
  4. IsNotMyName

    IsNotMyName Нуб

    Пункт 2 означает, что плата должна как можно больше процессорного времени уделять программе, и сам код должен работать быстро, а именно функции задержки, т.к. без задержек сигнал передается и программа отрабатывает с запасом по скорости - мне же нужно замедлить код чуть-чуть, однако он замедляется слишком сильно из-за системных функций задержек.

    Я попробовал использовать clock_nanosleep() как функцию задержки между битами сигнала http://ru.manpages.org/clock_nanosleep/2. На маленьких задержках (<100мс) эта функция уже не работает - она сама по себе тратит больше времени, чем нужно задержать. Так что она мне не годится.
    Ее код:
    Код (C++):
    #define SLEEP_NS(mydelay)                  \
      clock_gettime(CLOCK_MONOTONIC, &mytime); \
      mytime.tv_nsec += mydelay;               \
      clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &mytime, NULL);
    Есть 2 идеи, как можно сделать точные и небольшие по времени задержки:
    1. Сколхозить и вместо функции задержки написать свою функцию с циклом, подобрав число итераций таким образом, чтобы появилась нужная задержка.
    2. Использовать ассемблерную вставку nop. Подскажите, за сколько тактов процессора она выполнится на плате? Как реализовать ассемблерную вставку на линуксе на ARM? Я знаю что частота процессора 1Ггц - есть ли какая-нибудь системная константа, в которой указано это число? Частота процессора равна ровно 1-му гигагерцу?
     
  5. parovoZZ

    parovoZZ Гуру

    nop - это пропуск ровно одного шага.
     
  6. IsNotMyName

    IsNotMyName Нуб

  7. Igor68

    Igor68 Гуру

    Тогда Вам надо делать без ОС. В контроллере должна работать только ваша программа и никаких ОС. Автономное устройство не малина и какой-либо ПК.
     
  8. На зеро она всегда строго 1 ГГц?
    На pi3 решил посмотреть частоту без нагрузки и под нагрузкой. Без нагрузки частота минимальная 0,6 ГГц, а под нагрузкой максимальная 1,2 ГГц.