Я написал простую программу, позволяющую с высокой точностью определить время выполнения любого программного блока.
Для платы Arduino UNO R3 и других подобных платах на микроконтроллере ATmega 328:
- - точность измерения времени составляет 0,0625 мкс;
- максимальная длительность выполнения программного блока 4095 мкс.
Для измерения необходимо загрузить в плату скетч программы.
Код: Выделить всё
// определение времени выполнения программного блока Ардуино
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.
Эта программа достаточно удобный и универсальный инструмент для оптимизации кода по времени выполнения.