diff options
author | Alexander Krutwig <alexander.krutwig@embedded-brains.de> | 2015-04-01 15:33:25 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2015-05-20 08:40:34 +0200 |
commit | 75acd9e69f906cbd880a17ee4ca705ad7caa92c0 (patch) | |
tree | 71529028154cb323286b02392def2e5277eed312 /c/src/lib/libbsp/shared/clockdrv_shell.h | |
parent | timecounter: Use in RTEMS (diff) | |
download | rtems-75acd9e69f906cbd880a17ee4ca705ad7caa92c0.tar.bz2 |
bsps: Convert clock drivers to use a timecounter
Update #2271.
Diffstat (limited to 'c/src/lib/libbsp/shared/clockdrv_shell.h')
-rw-r--r-- | c/src/lib/libbsp/shared/clockdrv_shell.h | 52 |
1 files changed, 35 insertions, 17 deletions
diff --git a/c/src/lib/libbsp/shared/clockdrv_shell.h b/c/src/lib/libbsp/shared/clockdrv_shell.h index 5dbea1335f..628ba58672 100644 --- a/c/src/lib/libbsp/shared/clockdrv_shell.h +++ b/c/src/lib/libbsp/shared/clockdrv_shell.h @@ -20,6 +20,10 @@ #include <bsp.h> #include <rtems/clockdrv.h> +#ifdef Clock_driver_nanoseconds_since_last_tick +#error "Update driver to use the timecounter instead of nanoseconds extension" +#endif + /** * @defgroup bsp_clock Clock Support * @@ -39,6 +43,18 @@ #define Clock_driver_support_find_timer() #endif +/* + * A specialized clock driver may use for example rtems_timecounter_tick_simple() + * instead of the default. + */ +#ifndef Clock_driver_timecounter_tick + #ifdef CLOCK_DRIVER_USE_DUMMY_TIMECOUNTER + #define Clock_driver_timecounter_tick() rtems_clock_tick() + #else + #define Clock_driver_timecounter_tick() rtems_timecounter_tick() + #endif +#endif + /** * @brief ISRs until next clock tick */ @@ -78,16 +94,24 @@ rtems_isr Clock_isr( Clock_driver_ticks += 1; #if CLOCK_DRIVER_USE_FAST_IDLE - do { - rtems_clock_tick(); - } while ( - _Thread_Heir == _Thread_Executing - && _Thread_Executing->Start.entry_point - == (Thread_Entry) rtems_configuration_get_idle_task() - ); + { + struct timecounter *tc = _Timecounter; + uint64_t us_per_tick = rtems_configuration_get_microseconds_per_tick(); + uint32_t interval = (uint32_t) + ((tc->tc_frequency * us_per_tick) / 1000000); + + Clock_driver_timecounter_tick(); + + while ( + _Thread_Heir == _Thread_Executing + && _Thread_Executing->Start.entry_point + == (Thread_Entry) rtems_configuration_get_idle_task() + ) { + _Timecounter_Tick_simple(interval, (*tc->tc_get_timecount)(tc)); + } - Clock_driver_support_at_tick(); - return; + Clock_driver_support_at_tick(); + } #else /* * Do the hardware specific per-tick action. @@ -101,7 +125,7 @@ rtems_isr Clock_isr( * The driver is multiple ISRs per clock tick. */ if ( !Clock_driver_isrs ) { - rtems_clock_tick(); + Clock_driver_timecounter_tick(); Clock_driver_isrs = CLOCK_DRIVER_ISRS_PER_TICK; } @@ -110,7 +134,7 @@ rtems_isr Clock_isr( /* * The driver is one ISR per clock tick. */ - rtems_clock_tick(); + Clock_driver_timecounter_tick(); #endif #endif } @@ -160,12 +184,6 @@ rtems_device_driver Clock_initialize( (void) Old_ticker; Clock_driver_support_install_isr( Clock_isr, Old_ticker ); - #if defined(Clock_driver_nanoseconds_since_last_tick) - rtems_clock_set_nanoseconds_extension( - Clock_driver_nanoseconds_since_last_tick - ); - #endif - /* * Now initialize the hardware that is the source of the tick ISR. */ |