1 /* performance_test.c */
3 This file is part of the AVR-Crypto-Lib.
4 Copyright (C) 2006-2015 Daniel Otte (bg@nerilex.org)
6 This program is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
21 * email: bg@nerilex.org
32 #include <avr/interrupt.h>
33 #include <avr/pgmspace.h>
35 #include "performance_test.h"
44 static volatile uint32_t ovfcounter;
46 static uint16_t const_overhead = 0;
47 static uint16_t int_overhead = 0;
53 void calibrateTimer(void){
56 const_overhead = TCNT1;
64 void startTimer(uint8_t granularity){
65 TCCR1B = 0; /* stop timer */
69 TIMSK = _BV(TOIE1); /* enable TOIE1 */
70 TCCR1B = granularity & 0x7; /* start timer */
73 uint64_t stopTimer(void){
74 TCCR1B = 0; /* stop timer */
76 ret = (((uint64_t)ovfcounter)<<16) | TCNT1;
77 ret -= const_overhead;
78 ret -= ovfcounter * int_overhead;
82 void getOverhead(uint16_t *constoh, uint16_t *intoh){
83 *constoh = const_overhead;
84 *intoh = int_overhead;
87 void print_time_P(PGM_P s, uint32_t t){
88 printf_P(PSTR("%S%11"PRIu32), t);
91 void print_overhead(void){
92 printf_P(PSTR("\n=== benchmark ===\n\tconst overhead: %7"PRIu16"\n\tinterrupt overhead: %7"PRIu16"\n"), const_overhead, int_overhead);