RTEMS
timecounter.h
Go to the documentation of this file.
1 
9 /*
10  * Copyright (c) 2015 embedded brains GmbH. All rights reserved.
11  *
12  * embedded brains GmbH
13  * Dornierstr. 4
14  * 82178 Puchheim
15  * Germany
16  * <rtems@embedded-brains.de>
17  *
18  * The license and distribution terms for this file may be
19  * found in the file LICENSE in this distribution or at
20  * http://www.rtems.org/license/LICENSE.
21  */
22 
23 #ifndef _RTEMS_TIMECOUNTER_H
24 #define _RTEMS_TIMECOUNTER_H
25 
27 #include <rtems/score/basedefs.h>
28 
29 #ifdef __cplusplus
30 extern "C" {
31 #endif /* __cplusplus */
32 
47 #define RTEMS_TIMECOUNTER_QUALITY_CLOCK_DRIVER 100
48 
74  struct timecounter *tc
75 )
76 {
78 }
79 
84 {
86 }
87 
91 typedef struct {
92  struct timecounter tc;
93  uint64_t scaler;
94  uint32_t real_interval;
95  uint32_t binary_interval;
97 
103 );
104 
110 );
111 
118 );
119 
193  uint32_t counter_frequency_in_hz,
194  uint32_t counter_ticks_per_clock_tick,
195  timecounter_get_t *get_timecount
196 );
197 
207  const rtems_timecounter_simple *tc,
208  uint32_t value
209 )
210 {
211  return (uint32_t) ( ( value * tc->scaler ) >> 32 );
212 }
213 
226 )
227 {
228  ISR_lock_Context lock_context;
229  uint32_t current;
230 
231  _Timecounter_Acquire( &lock_context );
232 
233  ( *at_tick )( tc );
234 
236  tc,
237  tc->real_interval - ( *get )( tc )
238  );
239 
240  _Timecounter_Tick_simple( tc->binary_interval, current, &lock_context );
241 }
242 
255 )
256 {
257  ISR_lock_Context lock_context;
258  uint32_t current;
259 
260  _Timecounter_Acquire( &lock_context );
261 
262  ( *at_tick )( tc );
263 
264  current = rtems_timecounter_simple_scale( tc, ( *get )( tc ) );
265 
266  _Timecounter_Tick_simple( tc->binary_interval, current, &lock_context );
267 }
268 
279  struct timecounter *tc_base,
282 )
283 {
285  uint32_t counter;
286  uint32_t interval;
287 
288  tc = (rtems_timecounter_simple *) tc_base;
289  counter = ( *get )( tc );
290  interval = tc->real_interval;
291 
292  if ( ( *is_pending )( tc ) ) {
293  counter = ( *get )( tc );
294  interval *= 2;
295  }
296 
297  return rtems_timecounter_simple_scale( tc, interval - counter );
298 }
299 
310  struct timecounter *tc_base,
313 )
314 {
316  uint32_t counter;
317  uint32_t interval;
318 
319  tc = (rtems_timecounter_simple *) tc_base;
320  counter = ( *get )( tc );
321  interval = 0;
322 
323  if ( ( *is_pending )( tc ) ) {
324  counter = ( *get )( tc );
325  interval = tc->real_interval;
326  }
327 
328  return rtems_timecounter_simple_scale( tc, interval + counter );
329 }
330 
333 #ifdef __cplusplus
334 }
335 #endif /* __cplusplus */
336 
337 #endif /* _RTEMS_TIMECOUNTER_H */
static __inline__ void rtems_timecounter_simple_upcounter_tick(rtems_timecounter_simple *tc, rtems_timecounter_simple_get get, rtems_timecounter_simple_at_tick at_tick)
Performs a simple timecounter tick for upcounters.
Definition: timecounter.h:251
void _Timecounter_Tick_simple(uint32_t delta, uint32_t offset, ISR_lock_Context *lock_context)
Performs a simple timecounter tick.
Definition: kern_tc.c:2142
void _Timecounter_Install(struct timecounter *tc)
Installs the timecounter.
static __inline__ uint32_t rtems_timecounter_simple_downcounter_get(struct timecounter *tc_base, rtems_timecounter_simple_get get, rtems_timecounter_simple_is_pending is_pending)
Gets the simple timecounter value mapped to its binary frequency domain for downcounters.
Definition: timecounter.h:278
static __inline__ void rtems_timecounter_simple_downcounter_tick(rtems_timecounter_simple *tc, rtems_timecounter_simple_get get, rtems_timecounter_simple_at_tick at_tick)
Performs a simple timecounter tick for downcounters.
Definition: timecounter.h:222
void rtems_timecounter_simple_at_tick(rtems_timecounter_simple *tc)
At tick handling done under protection of the timecounter lock.
Definition: timecounter.h:101
#define _Timecounter_Acquire(lock_context)
Lock to protect the timecounter mechanic.
Definition: timecounter.h:201
bool rtems_timecounter_simple_is_pending(rtems_timecounter_simple *tc)
Returns true if the interrupt of a simple timecounter is pending, and false otherwise.
Definition: timecounter.h:116
static __inline__ void rtems_timecounter_install(struct timecounter *tc)
Installs the timecounter.
Definition: timecounter.h:73
static __inline__ uint32_t rtems_timecounter_simple_upcounter_get(struct timecounter *tc_base, rtems_timecounter_simple_get get, rtems_timecounter_simple_is_pending is_pending)
Gets the simple timecounter value mapped to its binary frequency domain for upcounters.
Definition: timecounter.h:309
void _Timecounter_Tick(void)
Performs a timecounter tick.
Definition: kern_tc.c:2130
void rtems_timecounter_simple_install(rtems_timecounter_simple *tc, uint32_t counter_frequency_in_hz, uint32_t counter_ticks_per_clock_tick, timecounter_get_t *get_timecount)
Initializes and installs a simple timecounter.
uint32_t rtems_timecounter_simple_get(rtems_timecounter_simple *tc)
Returns the current value of a simple timecounter.
Definition: timecounter.h:108
static __inline__ void rtems_timecounter_tick(void)
Performs a timecounter tick.
Definition: timecounter.h:83
This header file provides basic definitions used by the API and the implementation.
Local ISR lock context for acquire and release pairs.
Definition: isrlock.h:65
#define RTEMS_INLINE_ROUTINE
Gives a hint to the compiler in a function declaration to inline this function.
Definition: basedefs.h:683
Timecounter API.
static __inline__ uint32_t rtems_timecounter_simple_scale(const rtems_timecounter_simple *tc, uint32_t value)
Maps a simple timecounter value into its binary frequency domain.
Definition: timecounter.h:206
Simple timecounter to support legacy clock drivers.
Definition: timecounter.h:91