Альтернатива RDTSC для Arduino

Чтобы рассчитать время выполнения операции, я сохранял результат millis() до и после операции, чтобы рассчитать интервал времени. Есть ли альтернатива Arduino Uno, такая как RDTSC для архитектуры x86?

, 👍1

Обсуждение

да, в Uno альтернативой является millis(), @Juraj


1 ответ


Лучший ответ:

0

Есть несколько вариантов. Лучший выбор для вас зависит от нужное временное разрешение и максимальная продолжительность мера:

  1. millis() подходит для медленных задач. Разрешение 2 мс (большую часть времени он увеличивается с шагом 1 мс, но 2 мс время от времени) и может измерять продолжительность до 49,7 дней.

  2. micros() — это простой выбор, когда вам нужно большее разрешение для более быстрые вещи. Он увеличивается с шагом 4 мкс и ограничен около 71,6 минут.

  3. Для очень быстрых задач можно получить разрешение за один цикл, если настроить Таймер 1 для подсчета на полной скорости процессора, если вы не нужен таймер для чего-то еще. Но будьте осторожны, таймер переворачиваться примерно каждые 4,1 миллисекунды.

  4. Вы также можете использовать Timer 1 с предделителем, установленным на ÷8, чтобы расширить измеряемый диапазон до 32,8 мс ценой ухудшение разрешения.

В таблице перечислены доступные методы, отсортированные по разрешению:

method        data type  resolution  max. duration
--------------------------------------------------
millis()       uint32_t        2 ms     49.7 days
micros()       uint32_t        4 µs     71.6 min
Timer 1 (÷8)   uint16_t      0.5 µs     32.8 ms
Timer 1 (÷1)   uint16_t     62.5 ns      4.1 ms
,

Большое спасибо! У меня есть подвопрос: «Timer 1 (÷64)» и «micros()» кажутся эквивалентными по разрешению, будет ли чтение значения «Timer1» более точным/надежным, чем использование «micros()»?, @Harini

@Harini: Чтение «TCNT1» будет быстрее, чем вызов «micros()», поэтому вы получите меньше накладных расходов за счет сокращения периода переноса., @Edgar Bonet