Измерение времени выполнения функций и команд Ардуино.

Вопросы программирования в системе Ардуино
Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Измерение времени выполнения функций и команд Ардуино.

Сообщение Эдуард » 03 дек 2016, 18:26

При программировании реальных задач на контроллерах Ардуино важно знать время выполнения как стандартных функций Ардуино, так и отдельных программных блоков.

Я написал простую программу, позволяющую с высокой точностью определить время выполнения любого программного блока.
Для платы Arduino UNO R3 и других подобных платах на микроконтроллере ATmega 328:
    - точность измерения времени составляет 0,0625 мкс;
    - максимальная длительность выполнения программного блока 4095 мкс.
Результат измерения выводится через монитор последовательного порта. Скорость 9600 бод.

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

Код: Выделить всё

// определение времени выполнения программного блока Ардуино

unsigned int  timerValue; // значение таймера
 
void setup() {
  Serial.begin(9600);  // инициализируем последовательный порт, скорость 9600
  // установки таймера 1
  TCCR1A = 0;
  TCCR1B = 0; 
}

void loop() {
  noInterrupts(); // запрет прерываний
  TCNT1H = 0; // сброс таймера
  TCNT1L = 0;
  TCCR1B = 1; // разрешение работы таймера

  // ---------- исследуемый программный блок ---------


  // -------------------------------------------------

  TCCR1B = 0; // остановка таймера
  timerValue = (unsigned int)TCNT1L | ((unsigned int)TCNT1H << 8); // чтение таймера
  interrupts(); // разрешение прерываний
     
  // вывод на компьютер
  Serial.print( (float)(timerValue - 2) * 0.0625);
  Serial.println(" mks");
  delay(500);
}

Исследуемая функция или программный блок размещаются в коде программы, в место выделенное таким образом.

Код: Выделить всё

  // ---------- исследуемый программный блок ---------
  // -------------------------------------------------

Все. Остается запустить монитор последовательного порта. Программа в цикле выводит время выполнения блока или функции.

Работает программа по следующему алгоритму:
    - Устанавливает таймер 1 на максимальную частоту тактирования 16 мГц.
    - Запрещает прерывания.
    - Разрешает работу таймера.
    - Запускает исследуемый блок.
    - После окончания его работы останавливает таймер.
    - Считывает значение таймера, пересчитывает его в мкс и выводит в последовательный порт.

Время выполнения стандартных функций Ардуино.
Я провел небольшое исследование стандартных функций Ардуино и получил следующие результаты.

Функция Время выполнения
digitalWrite()3.19 мкс
digitalRead()2.75 мкс
pinMode()2.44 мкс
analogRead()105.31 – 113.12 мкс
analogWrite()3.69 мкс

Программа измеряет время выполнения программных блоков, не использующих прерывания. Поэтому измерение времени выполнения функции delay(), Serial.print() и т.п. даст не правильный результат.

Настойчиво рекомендую в приложениях с ограниченным временем производить оптимизацию вычислений. Особенно в вычислениях с плавающей запятой. Я затронул эту тему в уроке 13.

Эта программа достаточно удобный и универсальный инструмент для оптимизации кода по времени выполнения.


Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Измерение времени выполнения функций и команд Ардуино.

Сообщение Эдуард » 04 янв 2017, 19:28

При разработке Ардуино контроллера элемента Пельтье для управления LCD индикатором я использовал библиотеку LiquidCrystal.h . В программе несколько параллельных процессов с фиксированным временем циклов. Никакой цикл нельзя приостанавливать, задерживать.
Функции библиотеки достаточно сложные. Сколько времени они требуют на выполнение не понятно. Информации об этом нет. Пришлось выяснять самому.
Я измерил время выполнения функций библиотеки LiquidCrystal.h и результаты свел в таблицу.

Назначение Функция Время выполнения
Инициализация дисплея displ.begin(8, 1); 1406 мкс
Вывод текстовой строки (1 символ)displ.print("A"); 287 мкс
Вывод текстовой строки (8 символов) displ.print("01234567"); 2264 мкс
Очистка экрана displ.clear(); 2280 мкс
Курсор в начало экрана displ.home(); 2280 мкс
Вывод байта (char) на экран displ.write(cc); 281 мкс
Вывод числа int на экран displ.print(dd); 1610 мкс

Аватара пользователя
БлудныйКот
Сообщения: 45
Зарегистрирован: 29 дек 2016, 16:19

Re: Измерение времени выполнения функций и команд Ардуино.

Сообщение БлудныйКот » 04 мар 2017, 12:49

Еще возник вопрос по теме,
сколько тактов процессора занимает сдвиг на 2,4,8,16 ?
И где это если не секрет можно посмотреть?

Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Измерение времени выполнения функций и команд Ардуино.

Сообщение Эдуард » 04 мар 2017, 16:11

Можно измерить.

Код: Выделить всё

unsigned int  timerValue; // значение таймера

volatile int x=0xaaaa;
volatile int y;
 
void setup() {
  Serial.begin(9600);  // инициализируем последовательный порт, скорость 9600
  // установки таймера 1
  TCCR1A = 0;
  TCCR1B = 0; 
}

void loop() {
  noInterrupts(); // запрет прерываний
  TCNT1H = 0; // сброс таймера
  TCNT1L = 0;
  TCCR1B = 1; // разрешение работы таймера

  // ---------- исследуемый программный блок ---------
  y= x >> 2;

  // -------------------------------------------------

  TCCR1B = 0; // остановка таймера
  timerValue = (unsigned int)TCNT1L | ((unsigned int)TCNT1H << 8); // чтение таймера
  interrupts(); // разрешение прерываний
     
  // вывод на компьютер
  Serial.print( (float)(timerValue - 2) * 0.0625);
  Serial.println(" mks");
  delay(500);
}


У меня получилось:
    0,75 мкс для y= x >> 2;
    1,75 мкс для y= x >> 4;
    0,69 мкс для y= x >> 8;
    0,69 мкс для y= x >> 16.
Это для переменных int. Для типа long можете проверить сами.

Аватара пользователя
БлудныйКот
Сообщения: 45
Зарегистрирован: 29 дек 2016, 16:19

Re: Измерение времени выполнения функций и команд Ардуино.

Сообщение БлудныйКот » 04 мар 2017, 16:19

Спасибо,
По времени конечно многовато получается. Это около 11.4 тактов процессора.
Я ожидал максимум 3-4.
Можно конечно ради интереса в протеусе в режиме отладки пощелкать, посмотреть какие операции процессор выполняет.
Последний раз редактировалось БлудныйКот 04 мар 2017, 16:23, всего редактировалось 2 раза.

Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Измерение времени выполнения функций и команд Ардуино.

Сообщение Эдуард » 04 мар 2017, 16:20

Два байта надо сдвигать.


Вернуться в «Программирование Ардуино»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей