mirror of
https://github.com/apache/nuttx.git
synced 2026-05-21 21:34:07 +08:00
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:
committed by
Xiang Xiao
parent
d9a0cf46ac
commit
2ae62d71a6
@@ -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
@@ -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(¤t);
|
||||
clock_nsec2time(&ts, next_expired);
|
||||
clock_timespec_subtract(&ts, ¤t, &ts);
|
||||
ret = up_timer_start(&ts);
|
||||
# endif
|
||||
DEBUGASSERT(ret == 0);
|
||||
#endif
|
||||
|
||||
DEBUGASSERT(ret == 0);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
||||
Reference in New Issue
Block a user