sys_clock.h: Make "global variable" APIs into proper functions

The existing API defined sys_clock_{hw_cycles,ticks}_per_sec as simple
"variables" to be shared, except that they were only real storage in
certain modes (the HPET driver, basically) and everywhere else they
were a build constant.

Properly, these should be an API defined by the timer driver (who
controls those rates) and consumed by the clock subsystem.  So give
them function syntax as a stepping stone to get there.

Note that this also removes the deprecated variable
_sys_clock_us_per_tick rather than give it the same treatment.

Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
This commit is contained in:
Andy Ross 2018-09-19 10:52:07 -07:00 committed by Anas Nashif
commit 220d4f8347
14 changed files with 57 additions and 46 deletions

View file

@ -26,20 +26,30 @@ extern "C" {
#include <toolchain.h>
#include <zephyr/types.h>
static inline int sys_clock_ticks_per_sec(void)
{
#ifdef CONFIG_TICKLESS_KERNEL
return 1000000 / (CONFIG_TICKLESS_KERNEL_TIME_UNIT_IN_MICRO_SECS);
#else
return CONFIG_SYS_CLOCK_TICKS_PER_SEC;
#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
static inline int sys_clock_hw_cycles_per_sec(void)
{
#if defined(CONFIG_TIMER_READS_ITS_FREQUENCY_AT_RUNTIME)
extern int sys_clock_hw_cycles_per_sec;
extern int z_clock_hw_cycles_per_sec;
return z_clock_hw_cycles_per_sec;
#else
#define sys_clock_hw_cycles_per_sec CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC
return CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC;
#endif
}
#if defined(CONFIG_SYS_CLOCK_EXISTS) && \
(CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC == 0)
@ -74,9 +84,9 @@ extern int sys_clock_hw_cycles_per_sec;
*/
#if !defined(CONFIG_TIMER_READS_ITS_FREQUENCY_AT_RUNTIME)
#if (sys_clock_hw_cycles_per_sec % sys_clock_ticks_per_sec) != 0
#if (CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC % CONFIG_SYS_CLOCK_TICKS_PER_SEC) != 0
#define _NEED_PRECISE_TICK_MS_CONVERSION
#elif (MSEC_PER_SEC % sys_clock_ticks_per_sec) != 0
#elif (MSEC_PER_SEC % CONFIG_SYS_CLOCK_TICKS_PER_SEC) != 0
#define _NON_OPTIMIZED_TICKS_PER_SEC
#endif
#endif
@ -94,12 +104,12 @@ static ALWAYS_INLINE s32_t _ms_to_ticks(s32_t ms)
#ifdef _NEED_PRECISE_TICK_MS_CONVERSION
/* use 64-bit math to keep precision */
return (s32_t)ceiling_fraction(
(s64_t)ms * sys_clock_hw_cycles_per_sec,
((s64_t)MSEC_PER_SEC * sys_clock_hw_cycles_per_sec) /
sys_clock_ticks_per_sec);
(s64_t)ms * sys_clock_hw_cycles_per_sec(),
((s64_t)MSEC_PER_SEC * sys_clock_hw_cycles_per_sec()) /
sys_clock_ticks_per_sec());
#else
/* simple division keeps precision */
s32_t ms_per_tick = MSEC_PER_SEC / sys_clock_ticks_per_sec;
s32_t ms_per_tick = MSEC_PER_SEC / sys_clock_ticks_per_sec();
return (s32_t)ceiling_fraction(ms, ms_per_tick);
#endif
@ -116,10 +126,10 @@ static inline s64_t __ticks_to_ms(s64_t ticks)
#ifdef _NEED_PRECISE_TICK_MS_CONVERSION
/* use 64-bit math to keep precision */
return (u64_t)ticks * MSEC_PER_SEC / sys_clock_ticks_per_sec;
return (u64_t)ticks * MSEC_PER_SEC / sys_clock_ticks_per_sec();
#else
/* simple multiplication keeps precision */
u32_t ms_per_tick = MSEC_PER_SEC / sys_clock_ticks_per_sec;
u32_t ms_per_tick = MSEC_PER_SEC / sys_clock_ticks_per_sec();
return (u64_t)ticks * ms_per_tick;
#endif
@ -155,7 +165,7 @@ extern int sys_clock_hw_cycles_per_tick;
/* SYS_CLOCK_HW_CYCLES_TO_NS64 converts CPU clock cycles to nanoseconds */
#define SYS_CLOCK_HW_CYCLES_TO_NS64(X) \
(((u64_t)(X) * NSEC_PER_SEC) / sys_clock_hw_cycles_per_sec)
(((u64_t)(X) * NSEC_PER_SEC) / sys_clock_hw_cycles_per_sec())
/*
* SYS_CLOCK_HW_CYCLES_TO_NS_AVG converts CPU clock cycles to nanoseconds
@ -206,11 +216,11 @@ extern s32_t _timeout_remaining_get(struct _timeout *timeout);
/*
* Number of ticks for x seconds. NOTE: With MSEC() or USEC(),
* since it does an integer division, x must be greater or equal to
* 1000/sys_clock_ticks_per_sec to get a non-zero value.
* 1000/sys_clock_ticks_per_sec() to get a non-zero value.
* You may want to raise CONFIG_SYS_CLOCK_TICKS_PER_SEC depending on
* your requirements.
*/
#define SECONDS(x) ((x) * sys_clock_ticks_per_sec)
#define SECONDS(x) ((x) * sys_clock_ticks_per_sec())
#define MSEC(x) (SECONDS(x) / MSEC_PER_SEC)
#define USEC(x) (MSEC(x) / USEC_PER_MSEC)