summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/shared
diff options
context:
space:
mode:
authorAlexander Krutwig <alexander.krutwig@embedded-brains.de>2015-04-01 15:33:25 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2015-05-20 08:40:34 +0200
commit75acd9e69f906cbd880a17ee4ca705ad7caa92c0 (patch)
tree71529028154cb323286b02392def2e5277eed312 /c/src/lib/libbsp/shared
parenttimecounter: Use in RTEMS (diff)
downloadrtems-75acd9e69f906cbd880a17ee4ca705ad7caa92c0.tar.bz2
bsps: Convert clock drivers to use a timecounter
Update #2271.
Diffstat (limited to 'c/src/lib/libbsp/shared')
-rw-r--r--c/src/lib/libbsp/shared/clock_driver_simidle.c2
-rw-r--r--c/src/lib/libbsp/shared/clockdrv_shell.h52
2 files changed, 37 insertions, 17 deletions
diff --git a/c/src/lib/libbsp/shared/clock_driver_simidle.c b/c/src/lib/libbsp/shared/clock_driver_simidle.c
index 0f94b1e56b..ee4b116b40 100644
--- a/c/src/lib/libbsp/shared/clock_driver_simidle.c
+++ b/c/src/lib/libbsp/shared/clock_driver_simidle.c
@@ -28,6 +28,8 @@ volatile bool clock_driver_enabled;
clock_driver_enabled = false; \
} while (0)
+#define CLOCK_DRIVER_USE_DUMMY_TIMECOUNTER
+
#include "clockdrv_shell.h"
/*
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.
*/