7#ifndef ZEPHYR_INCLUDE_TIME_UNITS_H_
8#define ZEPHYR_INCLUDE_TIME_UNITS_H_
33#define SYS_FOREVER_MS (-1)
39#define SYS_FOREVER_US (-1)
43#define SYS_TIMEOUT_MS(ms) Z_TIMEOUT_TICKS((ms) == SYS_FOREVER_MS ? \
44 K_TICKS_FOREVER : Z_TIMEOUT_MS_TICKS(ms))
48#if defined(CONFIG_TIMER_READS_ITS_FREQUENCY_AT_RUNTIME)
49__syscall
int sys_clock_hw_cycles_per_sec_runtime_get(
void);
51static inline int z_impl_sys_clock_hw_cycles_per_sec_runtime_get(
void)
53 extern int z_clock_hw_cycles_per_sec;
55 return z_clock_hw_cycles_per_sec;
59#if defined(__cplusplus) && __cplusplus >= 201402L
60 #if defined(CONFIG_TIMER_READS_ITS_FREQUENCY_AT_RUNTIME)
61 #define TIME_CONSTEXPR
63 #define TIME_CONSTEXPR constexpr
66 #define TIME_CONSTEXPR
73#if defined(CONFIG_TIMER_READS_ITS_FREQUENCY_AT_RUNTIME)
74#define sys_clock_hw_cycles_per_sec() sys_clock_hw_cycles_per_sec_runtime_get()
76#define sys_clock_hw_cycles_per_sec() CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC
90#define z_tmcvt_use_fast_algo(from_hz, to_hz) \
91 ((DIV_ROUND_UP(CONFIG_SYS_CLOCK_MAX_TIMEOUT_DAYS * 24ULL * 3600ULL * from_hz, \
92 UINT32_MAX) * to_hz) <= UINT32_MAX)
118#define z_tmcvt_is_identity(__from_hz, __to_hz) \
119 ((__to_hz) == (__from_hz))
122#define z_tmcvt_is_int_mul(__from_hz, __to_hz) \
123 ((__to_hz) > (__from_hz) && (__to_hz) % (__from_hz) == 0U)
126#define z_tmcvt_is_int_div(__from_hz, __to_hz) \
127 ((__from_hz) > (__to_hz) && (__from_hz) % (__to_hz) == 0U)
133#define z_tmcvt_off_div(__from_hz, __to_hz, __round_up, __round_off) \
134 ((__round_off) ? ((__from_hz) / (__to_hz)) / 2 : \
135 (__round_up) ? ((__from_hz) / (__to_hz)) - 1 : \
157#define z_tmcvt_divisor(a, b) ((a)/(b) ? (a)/(b) : 01u)
163#define z_tmcvt_off_gen(__from_hz, __to_hz, __round_up, __round_off) \
164 ((__round_off) ? (__from_hz) / 2 : \
165 (__round_up) ? (__from_hz) - 1 : \
169#define z_tmcvt_int_div_32(__t, __from_hz, __to_hz, __round_up, __round_off) \
170 ((uint64_t) (__t) <= 0xffffffffU - \
171 z_tmcvt_off_div(__from_hz, __to_hz, __round_up, __round_off) ? \
172 ((uint32_t)((__t) + \
173 z_tmcvt_off_div(__from_hz, __to_hz, \
174 __round_up, __round_off)) / \
175 z_tmcvt_divisor(__from_hz, __to_hz)) \
177 (uint32_t) (((uint64_t) (__t) + \
178 z_tmcvt_off_div(__from_hz, __to_hz, \
179 __round_up, __round_off)) / \
180 z_tmcvt_divisor(__from_hz, __to_hz)) \
184#define z_tmcvt_int_mul_32(__t, __from_hz, __to_hz) \
185 (uint32_t) (__t)*((__to_hz) / (__from_hz))
188#define z_tmcvt_gen_32(__t, __from_hz, __to_hz, __round_up, __round_off) \
189 ((uint32_t) (((uint64_t) (__t)*(__to_hz) + \
190 z_tmcvt_off_gen(__from_hz, __to_hz, __round_up, __round_off)) / (__from_hz)))
193#define z_tmcvt_int_div_64(__t, __from_hz, __to_hz, __round_up, __round_off) \
194 (((uint64_t) (__t) + z_tmcvt_off_div(__from_hz, __to_hz, \
195 __round_up, __round_off)) / \
196 z_tmcvt_divisor(__from_hz, __to_hz))
199#define z_tmcvt_int_mul_64(__t, __from_hz, __to_hz) \
200 (uint64_t) (__t)*((__to_hz) / (__from_hz))
203#define z_tmcvt_gen_64_fast(__t, __from_hz, __to_hz, __round_up, __round_off) \
204 (((uint64_t) (__t)*(__to_hz) + \
205 z_tmcvt_off_gen(__from_hz, __to_hz, __round_up, __round_off)) / (__from_hz))
208#define z_tmcvt_gen_64_slow(__t, __from_hz, __to_hz, __round_up, __round_off) \
209 (((uint64_t) (__t) / (__from_hz))*(__to_hz) + \
210 (((uint64_t) (__t) % (__from_hz))*(__to_hz) + \
211 z_tmcvt_off_gen(__from_hz, __to_hz, __round_up, __round_off)) / (__from_hz))
214#define z_tmcvt_gen_64(__t, __from_hz, __to_hz, __round_up, __round_off) \
215 (z_tmcvt_use_fast_algo(__from_hz, __to_hz) ? \
216 z_tmcvt_gen_64_fast(__t, __from_hz, __to_hz, __round_up, __round_off) : \
217 z_tmcvt_gen_64_slow(__t, __from_hz, __to_hz, __round_up, __round_off))
220#define z_tmcvt_32(__t, __from_hz, __to_hz, __const_hz, __round_up, __round_off) \
223 z_tmcvt_is_identity(__from_hz, __to_hz) ? \
226 z_tmcvt_is_int_div(__from_hz, __to_hz) ? \
227 z_tmcvt_int_div_32(__t, __from_hz, __to_hz, __round_up, __round_off) \
229 z_tmcvt_is_int_mul(__from_hz, __to_hz) ? \
230 z_tmcvt_int_mul_32(__t, __from_hz, __to_hz) \
232 z_tmcvt_gen_32(__t, __from_hz, __to_hz, __round_up, __round_off) \
235 z_tmcvt_gen_32(__t, __from_hz, __to_hz, __round_up, __round_off) \
239#define z_tmcvt_64(__t, __from_hz, __to_hz, __const_hz, __round_up, __round_off) \
242 z_tmcvt_is_identity(__from_hz, __to_hz) ? \
245 z_tmcvt_is_int_div(__from_hz, __to_hz) ? \
246 z_tmcvt_int_div_64(__t, __from_hz, __to_hz, __round_up, __round_off) \
248 z_tmcvt_is_int_mul(__from_hz, __to_hz) ? \
249 z_tmcvt_int_mul_64(__t, __from_hz, __to_hz) \
251 z_tmcvt_gen_64(__t, __from_hz, __to_hz, __round_up, __round_off) \
254 z_tmcvt_gen_64_slow(__t, __from_hz, __to_hz, __round_up, __round_off) \
257#define z_tmcvt(__t, __from_hz, __to_hz, __const_hz, __result32, __round_up, __round_off) \
259 z_tmcvt_32(__t, __from_hz, __to_hz, __const_hz, __round_up, __round_off) : \
260 z_tmcvt_64(__t, __from_hz, __to_hz, __const_hz, __round_up, __round_off))
337#define Z_HZ_us 1000000
338#define Z_HZ_ns 1000000000
339#define Z_HZ_cyc sys_clock_hw_cycles_per_sec()
340#define Z_HZ_ticks CONFIG_SYS_CLOCK_TICKS_PER_SEC
341#define Z_CCYC (!IS_ENABLED(CONFIG_TIMER_READS_ITS_FREQUENCY_AT_RUNTIME))
354#define k_ms_to_cyc_floor32(t) \
355 z_tmcvt_32(t, Z_HZ_ms, Z_HZ_cyc, Z_CCYC, false, false)
369#define k_ms_to_cyc_floor64(t) \
370 z_tmcvt_64(t, Z_HZ_ms, Z_HZ_cyc, Z_CCYC, false, false)
384#define k_ms_to_cyc_near32(t) \
385 z_tmcvt_32(t, Z_HZ_ms, Z_HZ_cyc, Z_CCYC, false, true)
399#define k_ms_to_cyc_near64(t) \
400 z_tmcvt_64(t, Z_HZ_ms, Z_HZ_cyc, Z_CCYC, false, true)
414#define k_ms_to_cyc_ceil32(t) \
415 z_tmcvt_32(t, Z_HZ_ms, Z_HZ_cyc, Z_CCYC, true, false)
429#define k_ms_to_cyc_ceil64(t) \
430 z_tmcvt_64(t, Z_HZ_ms, Z_HZ_cyc, Z_CCYC, true, false)
444#define k_ms_to_ticks_floor32(t) \
445 z_tmcvt_32(t, Z_HZ_ms, Z_HZ_ticks, true, false, false)
459#define k_ms_to_ticks_floor64(t) \
460 z_tmcvt_64(t, Z_HZ_ms, Z_HZ_ticks, true, false, false)
474#define k_ms_to_ticks_near32(t) \
475 z_tmcvt_32(t, Z_HZ_ms, Z_HZ_ticks, true, false, true)
489#define k_ms_to_ticks_near64(t) \
490 z_tmcvt_64(t, Z_HZ_ms, Z_HZ_ticks, true, false, true)
504#define k_ms_to_ticks_ceil32(t) \
505 z_tmcvt_32(t, Z_HZ_ms, Z_HZ_ticks, true, true, false)
519#define k_ms_to_ticks_ceil64(t) \
520 z_tmcvt_64(t, Z_HZ_ms, Z_HZ_ticks, true, true, false)
534#define k_us_to_cyc_floor32(t) \
535 z_tmcvt_32(t, Z_HZ_us, Z_HZ_cyc, Z_CCYC, false, false)
549#define k_us_to_cyc_floor64(t) \
550 z_tmcvt_64(t, Z_HZ_us, Z_HZ_cyc, Z_CCYC, false, false)
564#define k_us_to_cyc_near32(t) \
565 z_tmcvt_32(t, Z_HZ_us, Z_HZ_cyc, Z_CCYC, false, true)
579#define k_us_to_cyc_near64(t) \
580 z_tmcvt_64(t, Z_HZ_us, Z_HZ_cyc, Z_CCYC, false, true)
594#define k_us_to_cyc_ceil32(t) \
595 z_tmcvt_32(t, Z_HZ_us, Z_HZ_cyc, Z_CCYC, true, false)
609#define k_us_to_cyc_ceil64(t) \
610 z_tmcvt_64(t, Z_HZ_us, Z_HZ_cyc, Z_CCYC, true, false)
624#define k_us_to_ticks_floor32(t) \
625 z_tmcvt_32(t, Z_HZ_us, Z_HZ_ticks, true, false, false)
639#define k_us_to_ticks_floor64(t) \
640 z_tmcvt_64(t, Z_HZ_us, Z_HZ_ticks, true, false, false)
654#define k_us_to_ticks_near32(t) \
655 z_tmcvt_32(t, Z_HZ_us, Z_HZ_ticks, true, false, true)
669#define k_us_to_ticks_near64(t) \
670 z_tmcvt_64(t, Z_HZ_us, Z_HZ_ticks, true, false, true)
684#define k_us_to_ticks_ceil32(t) \
685 z_tmcvt_32(t, Z_HZ_us, Z_HZ_ticks, true, true, false)
699#define k_us_to_ticks_ceil64(t) \
700 z_tmcvt_64(t, Z_HZ_us, Z_HZ_ticks, true, true, false)
714#define k_ns_to_cyc_floor32(t) \
715 z_tmcvt_32(t, Z_HZ_ns, Z_HZ_cyc, Z_CCYC, false, false)
729#define k_ns_to_cyc_floor64(t) \
730 z_tmcvt_64(t, Z_HZ_ns, Z_HZ_cyc, Z_CCYC, false, false)
744#define k_ns_to_cyc_near32(t) \
745 z_tmcvt_32(t, Z_HZ_ns, Z_HZ_cyc, Z_CCYC, false, true)
759#define k_ns_to_cyc_near64(t) \
760 z_tmcvt_64(t, Z_HZ_ns, Z_HZ_cyc, Z_CCYC, false, true)
774#define k_ns_to_cyc_ceil32(t) \
775 z_tmcvt_32(t, Z_HZ_ns, Z_HZ_cyc, Z_CCYC, true, false)
789#define k_ns_to_cyc_ceil64(t) \
790 z_tmcvt_64(t, Z_HZ_ns, Z_HZ_cyc, Z_CCYC, true, false)
804#define k_ns_to_ticks_floor32(t) \
805 z_tmcvt_32(t, Z_HZ_ns, Z_HZ_ticks, true, false, false)
819#define k_ns_to_ticks_floor64(t) \
820 z_tmcvt_64(t, Z_HZ_ns, Z_HZ_ticks, true, false, false)
834#define k_ns_to_ticks_near32(t) \
835 z_tmcvt_32(t, Z_HZ_ns, Z_HZ_ticks, true, false, true)
849#define k_ns_to_ticks_near64(t) \
850 z_tmcvt_64(t, Z_HZ_ns, Z_HZ_ticks, true, false, true)
864#define k_ns_to_ticks_ceil32(t) \
865 z_tmcvt_32(t, Z_HZ_ns, Z_HZ_ticks, true, true, false)
879#define k_ns_to_ticks_ceil64(t) \
880 z_tmcvt_64(t, Z_HZ_ns, Z_HZ_ticks, true, true, false)
894#define k_cyc_to_ms_floor32(t) \
895 z_tmcvt_32(t, Z_HZ_cyc, Z_HZ_ms, Z_CCYC, false, false)
909#define k_cyc_to_ms_floor64(t) \
910 z_tmcvt_64(t, Z_HZ_cyc, Z_HZ_ms, Z_CCYC, false, false)
924#define k_cyc_to_ms_near32(t) \
925 z_tmcvt_32(t, Z_HZ_cyc, Z_HZ_ms, Z_CCYC, false, true)
939#define k_cyc_to_ms_near64(t) \
940 z_tmcvt_64(t, Z_HZ_cyc, Z_HZ_ms, Z_CCYC, false, true)
954#define k_cyc_to_ms_ceil32(t) \
955 z_tmcvt_32(t, Z_HZ_cyc, Z_HZ_ms, Z_CCYC, true, false)
969#define k_cyc_to_ms_ceil64(t) \
970 z_tmcvt_64(t, Z_HZ_cyc, Z_HZ_ms, Z_CCYC, true, false)
984#define k_cyc_to_us_floor32(t) \
985 z_tmcvt_32(t, Z_HZ_cyc, Z_HZ_us, Z_CCYC, false, false)
999#define k_cyc_to_us_floor64(t) \
1000 z_tmcvt_64(t, Z_HZ_cyc, Z_HZ_us, Z_CCYC, false, false)
1014#define k_cyc_to_us_near32(t) \
1015 z_tmcvt_32(t, Z_HZ_cyc, Z_HZ_us, Z_CCYC, false, true)
1029#define k_cyc_to_us_near64(t) \
1030 z_tmcvt_64(t, Z_HZ_cyc, Z_HZ_us, Z_CCYC, false, true)
1044#define k_cyc_to_us_ceil32(t) \
1045 z_tmcvt_32(t, Z_HZ_cyc, Z_HZ_us, Z_CCYC, true, false)
1059#define k_cyc_to_us_ceil64(t) \
1060 z_tmcvt_64(t, Z_HZ_cyc, Z_HZ_us, Z_CCYC, true, false)
1074#define k_cyc_to_ns_floor32(t) \
1075 z_tmcvt_32(t, Z_HZ_cyc, Z_HZ_ns, Z_CCYC, false, false)
1089#define k_cyc_to_ns_floor64(t) \
1090 z_tmcvt_64(t, Z_HZ_cyc, Z_HZ_ns, Z_CCYC, false, false)
1104#define k_cyc_to_ns_near32(t) \
1105 z_tmcvt_32(t, Z_HZ_cyc, Z_HZ_ns, Z_CCYC, false, true)
1119#define k_cyc_to_ns_near64(t) \
1120 z_tmcvt_64(t, Z_HZ_cyc, Z_HZ_ns, Z_CCYC, false, true)
1134#define k_cyc_to_ns_ceil32(t) \
1135 z_tmcvt_32(t, Z_HZ_cyc, Z_HZ_ns, Z_CCYC, true, false)
1149#define k_cyc_to_ns_ceil64(t) \
1150 z_tmcvt_64(t, Z_HZ_cyc, Z_HZ_ns, Z_CCYC, true, false)
1164#define k_cyc_to_ticks_floor32(t) \
1165 z_tmcvt_32(t, Z_HZ_cyc, Z_HZ_ticks, Z_CCYC, false, false)
1179#define k_cyc_to_ticks_floor64(t) \
1180 z_tmcvt_64(t, Z_HZ_cyc, Z_HZ_ticks, Z_CCYC, false, false)
1194#define k_cyc_to_ticks_near32(t) \
1195 z_tmcvt_32(t, Z_HZ_cyc, Z_HZ_ticks, Z_CCYC, false, true)
1209#define k_cyc_to_ticks_near64(t) \
1210 z_tmcvt_64(t, Z_HZ_cyc, Z_HZ_ticks, Z_CCYC, false, true)
1224#define k_cyc_to_ticks_ceil32(t) \
1225 z_tmcvt_32(t, Z_HZ_cyc, Z_HZ_ticks, Z_CCYC, true, false)
1239#define k_cyc_to_ticks_ceil64(t) \
1240 z_tmcvt_64(t, Z_HZ_cyc, Z_HZ_ticks, Z_CCYC, true, false)
1254#define k_ticks_to_ms_floor32(t) \
1255 z_tmcvt_32(t, Z_HZ_ticks, Z_HZ_ms, true, false, false)
1269#define k_ticks_to_ms_floor64(t) \
1270 z_tmcvt_64(t, Z_HZ_ticks, Z_HZ_ms, true, false, false)
1284#define k_ticks_to_ms_near32(t) \
1285 z_tmcvt_32(t, Z_HZ_ticks, Z_HZ_ms, true, false, true)
1299#define k_ticks_to_ms_near64(t) \
1300 z_tmcvt_64(t, Z_HZ_ticks, Z_HZ_ms, true, false, true)
1314#define k_ticks_to_ms_ceil32(t) \
1315 z_tmcvt_32(t, Z_HZ_ticks, Z_HZ_ms, true, true, false)
1329#define k_ticks_to_ms_ceil64(t) \
1330 z_tmcvt_64(t, Z_HZ_ticks, Z_HZ_ms, true, true, false)
1344#define k_ticks_to_us_floor32(t) \
1345 z_tmcvt_32(t, Z_HZ_ticks, Z_HZ_us, true, false, false)
1359#define k_ticks_to_us_floor64(t) \
1360 z_tmcvt_64(t, Z_HZ_ticks, Z_HZ_us, true, false, false)
1374#define k_ticks_to_us_near32(t) \
1375 z_tmcvt_32(t, Z_HZ_ticks, Z_HZ_us, true, false, true)
1389#define k_ticks_to_us_near64(t) \
1390 z_tmcvt_64(t, Z_HZ_ticks, Z_HZ_us, true, false, true)
1404#define k_ticks_to_us_ceil32(t) \
1405 z_tmcvt_32(t, Z_HZ_ticks, Z_HZ_us, true, true, false)
1419#define k_ticks_to_us_ceil64(t) \
1420 z_tmcvt_64(t, Z_HZ_ticks, Z_HZ_us, true, true, false)
1434#define k_ticks_to_ns_floor32(t) \
1435 z_tmcvt_32(t, Z_HZ_ticks, Z_HZ_ns, true, false, false)
1449#define k_ticks_to_ns_floor64(t) \
1450 z_tmcvt_64(t, Z_HZ_ticks, Z_HZ_ns, true, false, false)
1464#define k_ticks_to_ns_near32(t) \
1465 z_tmcvt_32(t, Z_HZ_ticks, Z_HZ_ns, true, false, true)
1479#define k_ticks_to_ns_near64(t) \
1480 z_tmcvt_64(t, Z_HZ_ticks, Z_HZ_ns, true, false, true)
1494#define k_ticks_to_ns_ceil32(t) \
1495 z_tmcvt_32(t, Z_HZ_ticks, Z_HZ_ns, true, true, false)
1509#define k_ticks_to_ns_ceil64(t) \
1510 z_tmcvt_64(t, Z_HZ_ticks, Z_HZ_ns, true, true, false)
1524#define k_ticks_to_cyc_floor32(t) \
1525 z_tmcvt_32(t, Z_HZ_ticks, Z_HZ_cyc, Z_CCYC, false, false)
1539#define k_ticks_to_cyc_floor64(t) \
1540 z_tmcvt_64(t, Z_HZ_ticks, Z_HZ_cyc, Z_CCYC, false, false)
1554#define k_ticks_to_cyc_near32(t) \
1555 z_tmcvt_32(t, Z_HZ_ticks, Z_HZ_cyc, Z_CCYC, false, true)
1569#define k_ticks_to_cyc_near64(t) \
1570 z_tmcvt_64(t, Z_HZ_ticks, Z_HZ_cyc, Z_CCYC, false, true)
1584#define k_ticks_to_cyc_ceil32(t) \
1585 z_tmcvt_32(t, Z_HZ_ticks, Z_HZ_cyc, Z_CCYC, true, false)
1599#define k_ticks_to_cyc_ceil64(t) \
1600 z_tmcvt_64(t, Z_HZ_ticks, Z_HZ_cyc, Z_CCYC, true, false)
1602#if defined(CONFIG_TIMER_READS_ITS_FREQUENCY_AT_RUNTIME)
1603#include <syscalls/time_units.h>
1606#undef TIME_CONSTEXPR