mirror of
https://github.com/apache/nuttx.git
synced 2026-05-27 11:26:12 +08:00
sched/sched: add hrtimer support to drive the scheduler
Add hrtimer support to drive the scheduler. Signed-off-by: Chengdong Wang <wangchengdong@lixiang.com>
This commit is contained in:
@@ -126,7 +126,7 @@ static void ndelay_accurate(unsigned long nanoseconds)
|
|||||||
static void oneshot_callback(FAR struct oneshot_lowerhalf_s *lower,
|
static void oneshot_callback(FAR struct oneshot_lowerhalf_s *lower,
|
||||||
FAR void *arg)
|
FAR void *arg)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_SCHED_TICKLESS
|
#if defined(CONFIG_SCHED_TICKLESS) || defined(CONFIG_HRTIMER)
|
||||||
nxsched_process_timer();
|
nxsched_process_timer();
|
||||||
#else
|
#else
|
||||||
clock_t now;
|
clock_t now;
|
||||||
@@ -388,7 +388,7 @@ int weak_function up_alarm_tick_cancel(FAR clock_t *ticks)
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#ifdef CONFIG_SCHED_TICKLESS
|
#if defined(CONFIG_SCHED_TICKLESS) || defined(CONFIG_HRTIMER)
|
||||||
int weak_function up_alarm_start(FAR const struct timespec *ts)
|
int weak_function up_alarm_start(FAR const struct timespec *ts)
|
||||||
{
|
{
|
||||||
int ret = -EAGAIN;
|
int ret = -EAGAIN;
|
||||||
|
|||||||
@@ -2051,7 +2051,8 @@ int up_alarm_tick_cancel(FAR clock_t *ticks);
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#if defined(CONFIG_SCHED_TICKLESS) && defined(CONFIG_SCHED_TICKLESS_ALARM)
|
#if defined(CONFIG_HRTIMER) || \
|
||||||
|
defined(CONFIG_SCHED_TICKLESS) && defined(CONFIG_SCHED_TICKLESS_ALARM)
|
||||||
int up_alarm_start(FAR const struct timespec *ts);
|
int up_alarm_start(FAR const struct timespec *ts);
|
||||||
int up_alarm_tick_start(clock_t ticks);
|
int up_alarm_tick_start(clock_t ticks);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -31,6 +31,82 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
#include "sched/sched.h"
|
#include "sched/sched.h"
|
||||||
|
#include "hrtimer/hrtimer.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* High-resolution timer used to drive the scheduler tick.
|
||||||
|
*
|
||||||
|
* In non-tickless mode, this timer periodically generates a scheduler
|
||||||
|
* tick with interval NSEC_PER_TICK.
|
||||||
|
*
|
||||||
|
* In tickless mode, the timer is still used, but the callback does not
|
||||||
|
* request automatic re-arming.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef CONFIG_HRTIMER
|
||||||
|
static hrtimer_t g_sched_hrtimer;
|
||||||
|
static bool g_sched_hrtimer_started = false;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: nxsched_hrtimer_callback
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* High-resolution timer callback used to drive the scheduler.
|
||||||
|
*
|
||||||
|
* This callback is invoked when the scheduler hrtimer expires.
|
||||||
|
* It advances the scheduler time base by calling
|
||||||
|
* nxsched_process_tick().
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* hrtimer - Pointer to the expired hrtimer instance
|
||||||
|
* expired - Expiration time in nanoseconds
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* In non-tickless mode:
|
||||||
|
* Returns the next expiration interval (NSEC_PER_TICK),
|
||||||
|
* causing the hrtimer to be re-armed periodically.
|
||||||
|
*
|
||||||
|
* In tickless mode:
|
||||||
|
* Returns 0 to indicate that the timer should not be
|
||||||
|
* automatically restarted.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef CONFIG_HRTIMER
|
||||||
|
static uint64_t
|
||||||
|
nxsched_hrtimer_callback(FAR const struct hrtimer_s *hrtimer,
|
||||||
|
uint64_t expired)
|
||||||
|
{
|
||||||
|
UNUSED(hrtimer);
|
||||||
|
UNUSED(expired);
|
||||||
|
|
||||||
|
/* Advance scheduler time and process time slice expiration */
|
||||||
|
|
||||||
|
nxsched_process_tick();
|
||||||
|
|
||||||
|
#ifndef CONFIG_SCHED_TICKLESS
|
||||||
|
/* Periodic tick mode: re-arm timer with fixed tick interval */
|
||||||
|
|
||||||
|
return NSEC_PER_TICK;
|
||||||
|
#else
|
||||||
|
/* Tickless mode controls the next wakeup explicitly */
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: nxsched_process_timer
|
* Name: nxsched_process_timer
|
||||||
@@ -47,5 +123,22 @@
|
|||||||
|
|
||||||
void nxsched_process_timer(void)
|
void nxsched_process_timer(void)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_HRTIMER
|
||||||
|
/* Process all expired high-resolution timers */
|
||||||
|
|
||||||
|
if (g_sched_hrtimer_started == false)
|
||||||
|
{
|
||||||
|
g_sched_hrtimer_started = true;
|
||||||
|
hrtimer_start(&g_sched_hrtimer,
|
||||||
|
nxsched_hrtimer_callback,
|
||||||
|
NSEC_PER_TICK,
|
||||||
|
HRTIMER_MODE_REL);
|
||||||
|
}
|
||||||
|
|
||||||
|
hrtimer_process(hrtimer_gettime());
|
||||||
|
#else
|
||||||
|
/* Fallback: process one scheduler tick */
|
||||||
|
|
||||||
nxsched_process_tick();
|
nxsched_process_tick();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user