summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/drivers/system_timer.h10
-rw-r--r--include/kernel.h42
-rw-r--r--include/sys_clock.h9
3 files changed, 60 insertions, 1 deletions
diff --git a/include/drivers/system_timer.h b/include/drivers/system_timer.h
index dbaf3d4cd..bb48712dd 100644
--- a/include/drivers/system_timer.h
+++ b/include/drivers/system_timer.h
@@ -38,9 +38,19 @@ extern void sys_clock_disable(void);
#ifdef CONFIG_TICKLESS_IDLE
extern void _timer_idle_enter(s32_t ticks);
extern void _timer_idle_exit(void);
+#else
+#define _timer_idle_enter(ticks) do { } while ((0))
+#define _timer_idle_exit() do { } while ((0))
#endif /* CONFIG_TICKLESS_IDLE */
extern void _nano_sys_clock_tick_announce(s32_t ticks);
+#ifdef CONFIG_TICKLESS_KERNEL
+extern void _set_time(u32_t time);
+extern u32_t _get_program_time(void);
+extern u32_t _get_remaining_program_time(void);
+extern u32_t _get_elapsed_program_time(void);
+extern u64_t _get_elapsed_clock_time(void);
+#endif
extern int sys_clock_device_ctrl(struct device *device,
u32_t ctrl_command, void *context);
diff --git a/include/kernel.h b/include/kernel.h
index 54bce4f47..826052ea2 100644
--- a/include/kernel.h
+++ b/include/kernel.h
@@ -864,7 +864,11 @@ static ALWAYS_INLINE s32_t _ms_to_ticks(s32_t ms)
#endif
/* added tick needed to account for tick in progress */
+#ifdef CONFIG_TICKLESS_KERNEL
+#define _TICK_ALIGN 0
+#else
#define _TICK_ALIGN 1
+#endif
static inline s64_t __ticks_to_ms(s64_t ticks)
{
@@ -1131,6 +1135,44 @@ static inline void *k_timer_user_data_get(struct k_timer *timer)
*/
extern s64_t k_uptime_get(void);
+#ifdef CONFIG_TICKLESS_KERNEL
+/**
+ * @brief Enable clock always on in tickless kernel
+ *
+ * This routine enables keepng the clock running when
+ * there are no timer events programmed in tickless kernel
+ * scheduling. This is necessary if the clock is used to track
+ * passage of time.
+ *
+ * @retval prev_status Previous status of always on flag
+ */
+static inline int k_enable_sys_clock_always_on(void)
+{
+ int prev_status = _sys_clock_always_on;
+
+ _sys_clock_always_on = 1;
+ _enable_sys_clock();
+
+ return prev_status;
+}
+
+/**
+ * @brief Disable clock always on in tickless kernel
+ *
+ * This routine disables keepng the clock running when
+ * there are no timer events programmed in tickless kernel
+ * scheduling. To save power, this routine should be called
+ * immediately when clock is not used to track time.
+ */
+static inline void k_disable_sys_clock_always_on(void)
+{
+ _sys_clock_always_on = 0;
+}
+#else
+#define k_enable_sys_clock_always_on() do { } while ((0))
+#define k_disable_sys_clock_always_on() do { } while ((0))
+#endif
+
/**
* @brief Get system uptime (32-bit version).
*
diff --git a/include/sys_clock.h b/include/sys_clock.h
index e259f7a27..db4ec39c4 100644
--- a/include/sys_clock.h
+++ b/include/sys_clock.h
@@ -28,7 +28,14 @@ extern "C" {
#error "SYS_CLOCK_HW_CYCLES_PER_SEC must be non-zero!"
#endif
+#ifdef CONFIG_TICKLESS_KERNEL
+#define sys_clock_ticks_per_sec \
+ (1000000 / (CONFIG_TICKLESS_KERNEL_TIME_UNIT_IN_MICRO_SECS))
+extern int _sys_clock_always_on;
+extern void _enable_sys_clock(void);
+#else
#define sys_clock_ticks_per_sec CONFIG_SYS_CLOCK_TICKS_PER_SEC
+#endif
#if defined(CONFIG_TIMER_READS_ITS_FREQUENCY_AT_RUNTIME)
extern int sys_clock_hw_cycles_per_sec;
@@ -100,7 +107,7 @@ extern int sys_clock_hw_cycles_per_tick;
* @} end defgroup clock_apis
*/
-extern s64_t _sys_clock_tick_count;
+extern volatile u64_t _sys_clock_tick_count;
/*
* Number of ticks for x seconds. NOTE: With MSEC() or USEC(),