Измерение времени выполнения операций и функций в скетчах Arduino

Введение

При разработке проектов на Arduino важно знать, сколько времени занимает выполнение определённых операций или функций. Это помогает оптимизировать код, устранить задержки и повысить отзывчивость программы. Для этого в Arduino можно использовать функции millis() и micros(), которые возвращают время с момента запуска платы в миллисекундах или микросекундах соответственно.

Основные функции для измерения времени

  • millis() — возвращает количество миллисекунд, прошедших с момента запуска программы.
  • micros() — возвращает количество микросекунд, прошедших с момента запуска программы.

Использование micros() полезно, когда нужно измерить очень короткие интервалы, например, в высокоскоростных алгоритмах.

Пример 1 — Измерение времени выполнения цикла


unsigned long startTime;
unsigned long endTime;

void setup() {
  Serial.begin(9600);
}

void loop() {
  startTime = millis(); // Запоминаем время начала

  for (int i = 0; i < 1000; i++) {
    int x = i * i;
  }

  endTime = millis(); // Запоминаем время конца

  Serial.print("Время выполнения цикла: ");
  Serial.print(endTime - startTime);
  Serial.println(" мс");

  delay(1000);
}
  

Пример 2 — Измерение времени выполнения функции


unsigned long startMicros;
unsigned long endMicros;

int heavyCalculation(int n) {
  int sum = 0;
  for (int i = 0; i < n; i++) {
    sum += i;
  }
  return sum;
}

void setup() {
  Serial.begin(9600);
}

void loop() {
  startMicros = micros(); // Время начала в микросекундах
  int result = heavyCalculation(5000);
  endMicros = micros(); // Время конца

  Serial.print("Результат: ");
  Serial.print(result);
  Serial.print(", время выполнения: ");
  Serial.print(endMicros - startMicros);
  Serial.println(" мкс");

  delay(1000);
}
  

Пример 3 — Сравнение времени работы двух алгоритмов


unsigned long t1, t2;

void setup() {
  Serial.begin(9600);
}

void loop() {
  // Алгоритм 1
  t1 = micros();
  for (int i = 0; i < 1000; i++) {
    int x = i * 2;
  }
  t2 = micros();
  Serial.print("Алгоритм 1: ");
  Serial.print(t2 - t1);
  Serial.println(" мкс");

  // Алгоритм 2
  t1 = micros();
  for (int i = 0; i < 1000; i++) {
    int x = i << 1; // Быстрее за счет побитового сдвига
  }
  t2 = micros();
  Serial.print("Алгоритм 2: ");
  Serial.print(t2 - t1);
  Serial.println(" мкс");

  delay(2000);
}
  

Пример 4 — Измерение времени реакции на событие

В этом примере мы измерим время от нажатия кнопки до выполнения определённого действия:


int buttonPin = 2;
unsigned long pressTime;

void setup() {
  Serial.begin(9600);
  pinMode(buttonPin, INPUT_PULLUP);
}

void loop() {
  if (digitalRead(buttonPin) == LOW) {
    pressTime = millis();
    while (digitalRead(buttonPin) == LOW); // Ждем отпускания
    Serial.print("Время реакции: ");
    Serial.print(millis() - pressTime);
    Serial.println(" мс");
  }
}
  

Заключение

Измерение времени выполнения кода — важный инструмент для отладки и оптимизации проектов Arduino. Используя millis() и micros(), можно находить узкие места в программе и улучшать её производительность.

<< Проекты << Все товары >> Статьи, уроки >>

Написать отзыв

Примечание: HTML разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Монтажный модуль драйвера A4988 или DRV8825

Монтажный модуль драйвера A4988 или DRV8825

Модуль для установки одного из самых распространенных драйверов A4988 или DRV8825 для управлени..

97.23грн.

Радиатор 25х23х16мм

Радиатор 25х23х16мм

Радиатор алюминиевый для транзисторов, симисторов ... с установкой на печатную платуОкрашенный в чер..

17.24грн.

Термопроводный клей STARS-922 5г

Термопроводный клей STARS-922 5г

Теплопроводящий клей для крепления греющихся компонентов к радиаторам (светодиоды, микросхемы, транз..

49.21грн.

DC DC преобразователь понижающий с 4...35В до 1,25...32В 5А

DC DC преобразователь понижающий с 4...35В до 1,25...32В 5А

Модуль питания на основе специализированной микросхемы XL4005Диапазон входных напряжений 4..

95.02грн.

Датчик света

Датчик света

Интеллектуальный дискретный датчик света. Рабочее напряжение питания 4...6 В постоянного тока. Чувст..

34.43грн.