forked from Imagelibrary/rtems
This change starts with removing the effectively empty file timerdrv.h. The prototypes for benchmark_timer_XXX() were in btimer.h which was not universally used. Thus every use of timerdrv.h had to be changed to btimer.h. Then the prototypes for benchmark_timer_read() had to be adjusted to return benchmark_timer_t rather than int or uint32_t. I took this opportunity to also correct the file headers to separate the copyright from the file description comments which is needed to ensure the copyright isn't propagated into Doxygen output.
68 lines
2.2 KiB
C
68 lines
2.2 KiB
C
/*
|
|
* This file implements a benchmark timer using a TX39 timer.
|
|
*
|
|
* NOTE: On the simulator, the count directly reflects instructions.
|
|
*
|
|
* COPYRIGHT (c) 1989-2000.
|
|
* On-Line Applications Research Corporation (OAR).
|
|
*
|
|
* The license and distribution terms for this file may be
|
|
* found in the file LICENSE in this distribution or at
|
|
* http://www.rtems.org/license/LICENSE.
|
|
*/
|
|
|
|
#include <assert.h>
|
|
|
|
#include <bsp.h>
|
|
#include <rtems/btimer.h>
|
|
|
|
bool benchmark_timer_find_average_overhead;
|
|
|
|
void benchmark_timer_initialize(void)
|
|
{
|
|
/*
|
|
* Programming the compare register as the maximum value should let
|
|
* it run long enough and accurate enough not to require an interrupt.
|
|
* but if it ever does generate an interrupt, we will simply fault.
|
|
*
|
|
* NOTE: This is similar to the clock driver initialization
|
|
* with the exception that the divider is disabled and
|
|
* the compare register is set to the maximum value.
|
|
*/
|
|
|
|
TX3904_TIMER_WRITE( TX3904_TIMER1_BASE, TX3904_TIMER_TCR, 0x20 );
|
|
TX3904_TIMER_WRITE( TX3904_TIMER1_BASE, TX3904_TIMER_CCDR, 0x3 );
|
|
TX3904_TIMER_WRITE( TX3904_TIMER1_BASE, TX3904_TIMER_TRR, 0x0 );
|
|
TX3904_TIMER_WRITE( TX3904_TIMER1_BASE, TX3904_TIMER_CPRA, 0xFFFFFFFF );
|
|
TX3904_TIMER_WRITE( TX3904_TIMER1_BASE, TX3904_TIMER_TISR, 0x00 );
|
|
TX3904_TIMER_WRITE( TX3904_TIMER1_BASE, TX3904_TIMER_ITMR, 0x0001 );
|
|
TX3904_TIMER_WRITE( TX3904_TIMER1_BASE, TX3904_TIMER_TCR, 0xe0 );
|
|
}
|
|
|
|
#define AVG_OVERHEAD 0 /* It typically takes N instructions */
|
|
/* to start/stop the timer. */
|
|
#define LEAST_VALID 1 /* Don't trust a value lower than this */
|
|
/* tx39 simulator can count instructions. :) */
|
|
|
|
benchmark_timer_t benchmark_timer_read(void)
|
|
{
|
|
uint32_t total;
|
|
|
|
total = TX3904_TIMER_READ( TX3904_TIMER1_BASE, TX3904_TIMER_TRR );
|
|
|
|
if ( benchmark_timer_find_average_overhead == true )
|
|
return total; /* in one microsecond units */
|
|
|
|
if ( total < LEAST_VALID )
|
|
return 0; /* below timer resolution */
|
|
|
|
return total - AVG_OVERHEAD;
|
|
}
|
|
|
|
void benchmark_timer_disable_subtracting_average_overhead(
|
|
bool find_flag
|
|
)
|
|
{
|
|
benchmark_timer_find_average_overhead = find_flag;
|
|
}
|