Timing

Этот тег предназначен для вопросов о времени выполнения кода или внешних событиях.


Время в миллисекундах/микросекундах

Вообще говоря, вы можете задать время выполнения кода, вызвав millis() или micros() до и после интересующего события. Например:

unsigned long startTime = millis();  // отметить время начала
someLengthyThing();                  // делаем то, что хотим засекать
unsigned long endTime = millis();    // отметить время окончания
unsigned long elapedTime = endTime - startTime;  // вычислить прошедшее время

Для более точных измерений используйте micros() (возвращает прошедшее время в микросекундах), а не millis() (возвращает прошедшее время в миллисекундах).


Синхронизация с digitalWrite

Если вызывать миллисекунды/микросекунды нецелесообразно (у вас может не быть возможности увидеть результаты), вы также можете отсчитывать время, включая и выключая цифровой вывод. Например:

digitalWrite (13, HIGH);  // мы собираемся что-то рассчитать - включаем D13
someLengthyThing();       // делаем то, что хотим засекать
digitalWrite (13, LOW);   // готово - выключаем D13

Вы можете поместить осциллограф или логический анализатор на контакт 13 (или любой другой контакт, который вы выберете, который, естественно, должен быть установлен в режим OUTPUT), а затем посмотреть, как долго сигнал находится на высоком уровне.


Время записи в порт

К сожалению, выполнение самой функции digitalWrite занимает около 4 мкс, поэтому для более точного определения времени используйте прямой доступ к порту. Например, на Uno:

PORTB = bit (5);     // мы собираемся что-то рассчитать - включаем D13
someLengthyThing();  // делаем то, что хотим засекать
PORTB &= ~bit (5);   // готово - выключаем D13

Для доступа к этим портам требуется всего 250 нс, что является гораздо меньшими затратами.


См. также

Вопросы, связанные с [timing]:

  • 1