/* Тест скорости (времени выполнения) кода Просто помести свой код внутри test() и загрузи прошивку! Работает на таймере 1 Вывод: Ticks per action - тиков процессора на выполнение test() Time per action - время выполнения test() в микросекундах Loop frequency - частота выполнения test() в Герцах */ #define NUM_LOOPS 10000L // количество циклов для теста void test() { // сюда пишем тестируемый код Serial.print("x"); } /* Примеры тестов: Serial.available(); 1.87 us PINB; 0.5 us PORTD = 1; 0.5 us digitalRead(5); 3.2 us digitalWrite(5, 1); 3.7 us delay(1); 1004.07 us Serial.print("x"); 1033.23 us */ // ------------- ДЛЯ РАЗРАБОТЧИКОВ --------------- volatile uint32_t ovf_counter; uint32_t ticks = 0; void setup() { testSetup(); for (long i = 0; i < NUM_LOOPS; i++) { test(); } testResults(); } void testSetup() { Serial.begin(9600); TCCR1A = 0; TCCR1B = 0; TCNT1 = 0; TCCR1B |= _BV(CS20); // делитель 1 TIMSK1 |= (1 << TOIE1); // разрешаем OVF // сброс счёта ovf_counter = 0; TCNT1 = 0; } void testResults() { ticks = (ovf_counter << 16) + TCNT1 - 9; // 9 тиков занимает строчка float timePerAction = (float)ticks / NUM_LOOPS * 0.0625; Serial.println("Ticks per action:\t" + String((float)ticks / NUM_LOOPS, 3)); Serial.println("Time per action:\t" + String(timePerAction, 2) + " us"); Serial.println("Loop frequency:\t\t" + String(round((long)1000000 / timePerAction)) + " Hz"); Serial.println(); } ISR(TIMER1_OVF_vect) { ovf_counter++; // тик каждые 0,0625 мкс } void loop() { }