/* performance_test.c */ /* This file is part of the AVR-Crypto-Lib. Copyright (C) 2006-2015 Daniel Otte (bg@nerilex.org) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* * author: Daniel Otte * email: bg@nerilex.org * license: GPLv3 * * **/ #include "config.h" #include #include #include #include #include #include #include #include "performance_test.h" #ifdef ATMEGA644 #define TIMSK TIMSK1 #endif static volatile uint32_t ovfcounter; static uint16_t const_overhead = 0; static uint16_t int_overhead = 0; ISR(TIMER1_OVF_vect){ ++ovfcounter; } void calibrateTimer(void){ startTimer(1); stopTimer(); const_overhead = TCNT1; startTimer(1); TCNT1 = 0xFFFE; asm("nop"); stopTimer(); int_overhead = TCNT1; } void startTimer(uint8_t granularity){ TCCR1B = 0; /* stop timer */ TCNT1 = 0; ovfcounter = 0; TCCR1A = 0x00; TIMSK = _BV(TOIE1); /* enable TOIE1 */ TCCR1B = granularity & 0x7; /* start timer */ } uint64_t stopTimer(void){ TCCR1B = 0; /* stop timer */ uint64_t ret; ret = (((uint64_t)ovfcounter)<<16) | TCNT1; ret -= const_overhead; ret -= ovfcounter * int_overhead; return ret; } void getOverhead(uint16_t *constoh, uint16_t *intoh){ *constoh = const_overhead; *intoh = int_overhead; } void print_time_P(PGM_P s, uint32_t t){ printf_P(PSTR("%S%11"PRIu32), t); } void print_overhead(void){ printf_P(PSTR("\n=== benchmark ===\n\tconst overhead: %7"PRIu16"\n\tinterrupt overhead: %7"PRIu16"\n"), const_overhead, int_overhead); }