sched/hrtimer: fix hrtimer regression introduced by recent update

The hrtimer subsystem is independent of the OS tick mechanism and tickless
mode. It must always be able to reprogram the hardware timer to achieve
nanosecond-level resolution.

A recent update restricted hardware timer reprogramming to tickless mode
only. As a result, hrtimer no longer functions correctly when the scheduler
is running in tick-based mode.

This change removes the incorrect dependency on tickless mode and restores
proper hrtimer operation.

Signed-off-by: Chengdong Wang <wangchengdong@lixiang.com>
This commit is contained in:
wangchengdong
2026-01-27 10:38:22 +08:00
committed by Xiang Xiao
parent d9a0cf46ac
commit 2ae62d71a6
2 changed files with 15 additions and 11 deletions
+4 -3
View File
@@ -2063,8 +2063,8 @@ int up_alarm_tick_cancel(FAR clock_t *ticks);
*
****************************************************************************/
#if defined(CONFIG_HRTIMER) || \
defined(CONFIG_SCHED_TICKLESS) && defined(CONFIG_SCHED_TICKLESS_ALARM)
#if (defined(CONFIG_HRTIMER) && defined(CONFIG_ALARM_ARCH)) || \
(defined(CONFIG_SCHED_TICKLESS) && defined(CONFIG_SCHED_TICKLESS_ALARM))
int up_alarm_start(FAR const struct timespec *ts);
int up_alarm_tick_start(clock_t ticks);
#endif
@@ -2135,7 +2135,8 @@ int up_timer_tick_cancel(FAR clock_t *ticks);
*
****************************************************************************/
#if defined(CONFIG_SCHED_TICKLESS) && !defined(CONFIG_SCHED_TICKLESS_ALARM)
#if (defined(CONFIG_HRTIMER) && defined(CONFIG_TIMER_ARCH)) || \
(defined(CONFIG_SCHED_TICKLESS) && !defined(CONFIG_SCHED_TICKLESS_ALARM))
int up_timer_start(FAR const struct timespec *ts);
int up_timer_tick_start(clock_t ticks);
#endif
+11 -8
View File
@@ -122,26 +122,29 @@ void hrtimer_process(uint64_t now);
* ns - Expiration time in nanoseconds.
*
* Returned Value:
* OK (0) on success, negated errno on failure.
* None.
*
* Assumptions:
* The underlying timer start function returns 0 on success.
****************************************************************************/
static inline_function void hrtimer_reprogram(uint64_t next_expired)
{
#ifdef CONFIG_SCHED_TICKLESS
int ret;
int ret = 0;
struct timespec ts;
# ifdef CONFIG_SCHED_TICKLESS_ALARM
clock_nsec2time(&ts, next_expired);
#ifdef CONFIG_ALARM_ARCH
ret = up_alarm_start(&ts);
# else
#else
struct timespec current;
up_timer_gettime(&current);
clock_nsec2time(&ts, next_expired);
clock_timespec_subtract(&ts, &current, &ts);
ret = up_timer_start(&ts);
# endif
DEBUGASSERT(ret == 0);
#endif
DEBUGASSERT(ret == 0);
}
/****************************************************************************