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 <ouyangxiangzhen@xiaomi.com>
This commit is contained in:
ouyangxiangzhen 2025-07-29 19:34:02 +08:00 committed by Xiang Xiao
parent bbb4cc4f6f
commit 556b89bcdb

View file

@ -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
}