source: rtems/c/src/lib/libbsp/sparc/leon3/timer/timer.c @ 8fbe2e6

4.11
Last change on this file since 8fbe2e6 was 8fbe2e6, checked in by Joel Sherrill <joel.sherrill@…>, on Sep 4, 2014 at 1:59:49 PM

Use correct prototype of benchmark_timer_read()

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.

  • Property mode set to 100644
File size: 2.3 KB
Line 
1/*  timer.c
2 *
3 *  This file implements a benchmark timer using timer 2.
4 *
5 *  COPYRIGHT (c) 1989-1998.
6 *  On-Line Applications Research Corporation (OAR).
7 *
8 *  The license and distribution terms for this file may be
9 *  found in the file LICENSE in this distribution or at
10 *  http://www.rtems.org/license/LICENSE.
11 *
12 *  Ported to LEON implementation of the SPARC by On-Line Applications
13 *  Research Corporation (OAR) under contract to the European Space
14 *  Agency (ESA).
15 *
16 *  LEON modifications of respective RTEMS file: COPYRIGHT (c) 1995.
17 *  European Space Agency.
18 */
19
20
21#include <bsp.h>
22#include <rtems/btimer.h>
23
24#if defined(RTEMS_MULTIPROCESSING)
25  #define LEON3_TIMER_INDEX \
26      ((rtems_configuration_get_user_multiprocessing_table()) ? \
27        (rtems_configuration_get_user_multiprocessing_table()->node) - 1 : 1)
28#else
29  #define LEON3_TIMER_INDEX 0
30#endif
31
32bool benchmark_timer_find_average_overhead;
33
34bool benchmark_timer_is_initialized = false;
35
36extern volatile struct gptimer_regs *LEON3_Timer_Regs;
37
38void benchmark_timer_initialize(void)
39{
40  /*
41   *  Timer runs long and accurate enough not to require an interrupt.
42   */
43  if (LEON3_Timer_Regs) {
44    if ( benchmark_timer_is_initialized == false ) {
45      /* approximately 1 us per countdown */
46      LEON3_Timer_Regs->timer[LEON3_TIMER_INDEX].reload = 0xffffff;
47      LEON3_Timer_Regs->timer[LEON3_TIMER_INDEX].value = 0xffffff;
48    } else {
49      benchmark_timer_is_initialized = true;
50    }
51    LEON3_Timer_Regs->timer[LEON3_TIMER_INDEX].ctrl =
52      GPTIMER_TIMER_CTRL_EN | GPTIMER_TIMER_CTRL_LD;
53  }
54}
55
56#define AVG_OVERHEAD      3  /* It typically takes 3.0 microseconds */
57                             /*     to start/stop the timer. */
58#define LEAST_VALID       2  /* Don't trust a value lower than this */
59
60benchmark_timer_t benchmark_timer_read(void)
61{
62  uint32_t total;
63
64  if (LEON3_Timer_Regs) {
65    total = LEON3_Timer_Regs->timer[LEON3_TIMER_INDEX].value;
66
67    total = 0xffffff - total;
68
69    if ( benchmark_timer_find_average_overhead == true )
70      return total;          /* in one microsecond units */
71
72    if ( total < LEAST_VALID )
73      return 0;            /* below timer resolution */
74
75    return total - AVG_OVERHEAD;
76  }
77  return 0;
78}
79
80void benchmark_timer_disable_subtracting_average_overhead(
81  bool find_flag
82)
83{
84  benchmark_timer_find_average_overhead = find_flag;
85}
Note: See TracBrowser for help on using the repository browser.