Измерение времени выполнения операций и функций в скетчах 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 разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Модуль блока питания 12В 250мА

Модуль блока питания 12В 250мА

Удобный модуль питания из 220В AC в 12В постоянного тока. Разработан для установки на печатную плату..

155.85грн.

Кабель питания 220В 2х0,75мм2

Кабель питания 220В 2х0,75мм2

Сетевой кабель питания 220ВПлощадь сечения провода 0,75 мм2Длина провода 1,8 м..

35.63грн.

Набор датчиков веса 200кг

Набор датчиков веса 200кг

4 тензодатчика для измерения веса до 200 кг при мостовом соединенииКаждый отдельный датчик рассчитан..

194.71грн.

Шестерня для зубчатого ремня на 36 зубьев под ось 5 мм

Шестерня для зубчатого ремня на 36 зубьев под ось 5 мм

Используется для передачи и редукции крутящего момента от двигателя до оси 5 ммКоличество зубьев 36 ..

79.68грн.

ATTINY85

ATTINY85

Плата контроллера ATTINY85Питание от USB 5ВПитание внешнее 7-16В..

179.35грн.