diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/drivers/system_timer.h | 10 | ||||
-rw-r--r-- | include/kernel.h | 42 | ||||
-rw-r--r-- | include/sys_clock.h | 9 |
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(), |