This is an automated email from the ASF dual-hosted git repository. xiaoxiang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit 556b89bcdb0827acfa5d9564ec44b3bad2d40520 Author: ouyangxiangzhen <[email protected]> AuthorDate: Tue Jul 29 19:34:02 2025 +0800 timers/arch_alarm: Fix oneshot callback for non-tickless. This commit fixed oneshot callback for non-tickless using tick-aligned absolute oneshot interfaces. Signed-off-by: ouyangxiangzhen <[email protected]> --- drivers/timers/arch_alarm.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/drivers/timers/arch_alarm.c b/drivers/timers/arch_alarm.c index 2d1a32a1da1..7a825b06446 100644 --- a/drivers/timers/arch_alarm.c +++ b/drivers/timers/arch_alarm.c @@ -47,20 +47,12 @@ static clock_t g_current_tick; static void oneshot_callback(FAR struct oneshot_lowerhalf_s *lower, FAR void *arg) { - clock_t now = 0; + clock_t now; ONESHOT_TICK_CURRENT(g_oneshot_lower, &now); #ifdef CONFIG_SCHED_TICKLESS nxsched_tick_expiration(now); #else - /* Start the next tick first, in order to minimize latency. Ideally - * the ONESHOT_TICK_START would also return the current tick so that - * the retrieving the current tick and starting the new one could be done - * atomically w. respect to a HW timer - */ - - ONESHOT_TICK_START(g_oneshot_lower, 1); - /* It is always an error if this progresses more than 1 tick at a time. * That would break any timer based on wdog; such timers might timeout * early. Add a DEBUGASSERT here to catch those errors. It is not added @@ -68,13 +60,13 @@ static void oneshot_callback(FAR struct oneshot_lowerhalf_s *lower, * would occur due to HW timers possibly running while CPU is being halted. */ - /* DEBUGASSERT(now - g_current_tick <= 1); */ - - while (now - g_current_tick > 0) + while (!clock_compare(now, g_current_tick)) { g_current_tick++; nxsched_process_timer(); } + + ONESHOT_TICK_ABSOLUTE(g_oneshot_lower, now + 1); #endif }
