Как сделать задержку на ~ 100-200ус - PullRequest
1 голос
/ 25 октября 2019

Я бы хотел попробовать аппаратное тестирование на python. Я должен отправить команды на оборудование, где есть спецификация для последовательного интервала времени передачи байтов (~ 100-200us). Однако я обнаружил, что метод sleep () в модуле времени нестабилен, когда время задержки слишком мало. Есть ли способ / операции, которые занимают ~ 100-200 мкс?

Мне также интересно, какова точность функции time (), может ли она на самом деле рассчитывать интервал в 100 мкс?

from time import time, sleep
a = []
start = time()
for i in range(10):
    sleep(200e-6)
    a.append(time()-start)

Вот как выглядит «а»:

[0.0010325908660888672,
 0.004021644592285156,
 0.006222248077392578,
 0.008239507675170898,
 0.009252071380615234,
 0.01157999038696289,
 0.013728857040405273,
 0.014998674392700195,
 0.016725540161132812,
 0.0187227725982666]

Ответы [ 2 ]

2 голосов
/ 25 октября 2019

О точности time.sleep

Похоже, что time.sleep() имеет разрешение только в миллисекундах. Хотя он может варьироваться от нескольких миллисекунд до более 20 миллисекунд (в лучшем случае), в зависимости от используемой ОС, не похоже, что вы получите точное выполнение микросекундного сна.

Ссылки

  1. Обязательно посмотрите : Насколько точен python time.sleep ()?
  2. usleep in Python
  3. https://github.com/JuliaLang/julia/issues/12770
  4. https://gist.github.com/ufechner7/1aa3e96a8a5972864cec

Другой вариант:

Затем вы могли бы искать создание C / C ++ оболочки вокруг кода таймера для использования его из Python.

1 голос
/ 25 октября 2019

Модуль времени не является нестабильным, это базовая ОС, на которой вы работаете. Запрос о сне просто передается в ОС. В документации можно прочитать, что фактическое время ожидания может быть меньше запрошенного, так как любой пойманный сигнал приостанавливает сон, или оно может быть дольше, чем запрошено по причинам планирования. Если вам нужна очень высокая точность,Вы можете использовать ОС реального времени.

...