fix: make rt_tick_t 64-bit on ARCH_CPU_64BIT and improve clock time precision#10749
fix: make rt_tick_t 64-bit on ARCH_CPU_64BIT and improve clock time precision#10749lygstate wants to merge 2 commits into
Conversation
|
👋 感谢您对 RT-Thread 的贡献!Thank you for your contribution to RT-Thread! 为确保代码符合 RT-Thread 的编码规范,请在你的仓库中执行以下步骤运行代码格式化工作流。 🛠 操作步骤 | Steps
完成后,提交将自动更新至 如有问题欢迎联系我们,再次感谢您的贡献!💐 |
📌 Code Review Assignment🏷️ Tag: componentsReviewers: @Maihuanyi Changed Files (Click to expand)
🏷️ Tag: components_libcReviewers: @GorrayLi @mysterywolf Changed Files (Click to expand)
🏷️ Tag: documentationReviewers: @CXSforHPU @GorrayLi @lianux-mm Changed Files (Click to expand)
📊 Current Review Status (Last Updated: 2026-07-14 20:32 CST)
📝 Review Instructions
|
0bc44ca to
5839f13
Compare
c448a01 to
264c203
Compare
28b2e48 to
d8c1321
Compare
There was a problem hiding this comment.
Pull Request Overview
This PR fixes overflow issues in clock_gettime and rt_ktime_boottime_get_ns by improving time conversion precision and enabling 64-bit tick counts on 64-bit architectures. The changes replace the previous resolution-based approach with direct frequency-based calculations to ensure more accurate timing operations.
Key changes:
- Introduces precision-preserving multiplication/division functions (
rt_muldiv_u64,rt_muldiv_u32) - Makes
rt_tick_t64-bit on 64-bit architectures to support long-running programs - Replaces resolution-based time calculations with frequency-based conversions throughout the timing subsystem
Reviewed Changes
Copilot reviewed 12 out of 12 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
src/rttypes.c |
Adds new multiplication/division functions for precision-preserving arithmetic |
include/rttypes.h |
Declares the new rt_muldiv_u64 and rt_muldiv_u32 functions |
include/rtdef.h |
Makes RT_TICK_MAX 64-bit on 64-bit architectures |
components/libc/compilers/common/ctime.c |
Updates timer implementations to use frequency-based calculations |
components/drivers/rtc/dev_soft_rtc.c |
Updates RTC resolution calculation |
components/drivers/ktime/src/ |
Refactors timing subsystem to use frequency instead of resolution |
bsp/rockchip/rk3500/driver/hwtimer/ |
Updates hardware timer interface |
Comments suppressed due to low confidence (2)
src/rttypes.c:1
- Corrected spelling of 'loseless' to 'lossless'.
/*
src/rttypes.c:1
- Corrected spelling of 'loseless' to 'lossless'.
/*
d8c1321 to
9c73d71
Compare
|
@Rbb666 ping |
9c73d71 to
e13dc95
Compare
e13dc95 to
ed41d9e
Compare
ed41d9e to
679bfb5
Compare
679bfb5 to
5ee5f1d
Compare
|
ping for review, and avoid newly conflict like #11111 After this, unlock #10735 would be strait-forward |
5ee5f1d to
a6b5b05
Compare
…recision - Make rt_tick_t and RT_TICK_MAX 64-bit when ARCH_CPU_64BIT is defined - Add rt_muldiv_u64() and rt_muldiv_u32() for lossless counter and nanosecond conversions - Convert boottime, clock_gettime, POSIX timers, and hrtimer paths with clock source frequency instead of scaled resolution - Rewrite rt_clock_time_counter_to_ns() and rt_clock_time_ns_to_counter() with rt_muldiv_u64() for the VDSO path - Remove RT_CLOCK_TIME_RESMUL, res_scale, and scaled-resolution APIs: - res_scale was only a fixed-point multiplier for resolution math (res_scaled = 1e9 * res_scale / freq); it did not customize clock frequency - All in-tree devices always used the default RT_CLOCK_TIME_RESMUL value, so the field provided no real per-board tuning - Converting through res_scaled introduced extra rounding error compared with using get_freq() directly - Custom frequency remains available through rt_clock_time_ops.get_freq, rt_clock_time_source_init(), and rt_clock_time_device_register() - Drop RT_CLOCK_TIME_RESMUL, struct rt_clock_time_device.res_scale, rt_clock_time_get_res_scaled(), rt_clock_time_get_event_res_scaled(), and rt_clock_hrtimer_getres() - Port the original ktime fixes to the clock_time API - Keep soft-timer fallback rounding in _hrtimer_cnt_to_tick() so sub-tick timeouts schedule at least one OS tick - Update clock_time core documentation
…hecks - Move rt_muldiv_u64 out of rttypes into private clock_time_internal with truncated overflow and an optional overflow out-parameter - Name the helper rt_clock_time_muldiv_u64 and include its .c from clock_time_core.c so IDE projects do not need a new source entry - Add rt_clock_time_get_res() and reject zero-frequency paths in clock_getres, timer_gettime, timer_settime, and soft RTC - Clamp or error on overflowed/out-of-range delay conversions in hrtimer and POSIX timer reload paths - Keep one-shot timer intervals from being rounded up to a 1-tick reload, and clamp timer_gettime remain time after expiry - Update clock_time core documentation for resolution and overflow
a6b5b05 to
f66ccdb
Compare
|
拉取/合并请求描述:(PR description)
continue work of #9008
Fixes overflow of
clock_gettimert_ktime_boottime_get_nsthoroughlyCurrently the return value of clock_gettime and rt_ktime_boottime_get_ns are restricted by
rt_ktime_cputimer_getres, as the value ofrt_ktime_cputimer_getresare not exactly represent thefrequency of the clock, directly usingrt_ktime_cputimer_getfrqwill ensure the return value of rt_ktime_boottime_get_ns be more exact.And also add function rt_muldiv_u64 rt_muldiv_u32 for not losing precision when convert between
cputimerandhrtimerandnanoseconds.Because
rt_ktime_boottime_get_nsdepends onrt_ktime_cputimer_getcntandrt_ktime_cputimer_getcntdependsrt_tick_getSo the rt_tick_t should be 64bit for long running program.
Use
#if defined(ARCH_CPU_64BIT)is forfuture allow rt_tick_t can be 64bit on 32bit CPU.
Tick count should not be restricted to the CPU
[
为什么提交这份PR (why to submit this PR)
你的解决方案是什么 (what is your solution)
请提供验证的bsp和config (provide the config and bsp)
]
当前拉取/合并请求的状态 Intent for your PR
必须选择一项 Choose one (Mandatory):
代码质量 Code Quality:
我在这个拉取/合并请求中已经考虑了 As part of this pull request, I've considered the following:
#if 0代码,不包含已经被注释了的代码 All redundant code is removed and cleaned up