Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 73 additions & 0 deletions sched/clock/clock.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,15 +70,88 @@ extern spinlock_t g_basetime_lock;
* Public Function Prototypes
****************************************************************************/

/****************************************************************************
* Name: clock_basetime
*
* Description:
* Get the initial time value from the best source available.
*
****************************************************************************/

int clock_basetime(FAR struct timespec *tp);

/****************************************************************************
* Name: clock_initialize
*
* Description:
* Perform one-time initialization of the timing facilities.
*
****************************************************************************/

void clock_initialize(void);

/****************************************************************************
* Name: clock_update_sched_ticks
*
* Description:
* Update the scheduler tick counter to a specific value. This function
* directly sets the system tick counter to the given value (rather than
* incrementing it), typically used for synchronizing or resetting the
* scheduler tick count to a known state.
*
* Input Parameters:
* ticks - The new value to set for the scheduler tick counter
*
* Returned Value:
* None
*
****************************************************************************/

void clock_update_sched_ticks(clock_t ticks);

/****************************************************************************
* Name: clock_increase_sched_ticks
*
* Description:
* Increment the scheduler tick counter. This function should be called
* each time the real-time clock interrupt occurs, indicating the passage
* of one or more scheduling ticks.
*
* Input Parameters:
* ticks - The number of ticks to increment (typically 1)
*
* Returned Value:
* None
*
****************************************************************************/

void clock_increase_sched_ticks(clock_t ticks);

/****************************************************************************
* Name: clock_get_sched_ticks
*
* Description:
* Return the current value of the scheduler tick counter. This counter
* only increases while the scheduler is running, and is independent of
* the real-time clock.
*
* Returned Value:
* The current number of scheduler ticks.
*
****************************************************************************/

clock_t clock_get_sched_ticks(void);

#ifdef CONFIG_SCHED_CPULOAD_SYSCLK

/****************************************************************************
* Name: cpuload_init
*
* Description:
* Initialize the CPU load measurement logic.
*
****************************************************************************/

void cpuload_init(void);
#endif

Expand Down
28 changes: 28 additions & 0 deletions sched/clock/clock_sched_ticks.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,34 @@ static seqcount_t g_system_tick_lock = SEQLOCK_INITIALIZER;
* Public Functions
****************************************************************************/

/****************************************************************************
* Name: clock_update_sched_ticks
*
* Description:
* Update the scheduler tick counter to a specific value. This function
* directly sets the system tick counter to the given value (rather than
* incrementing it), typically used for synchronizing or resetting the
* scheduler tick count to a known state.
*
* Input Parameters:
* ticks - The new value to set for the scheduler tick counter
*
* Returned Value:
* None
*
****************************************************************************/

void clock_update_sched_ticks(clock_t ticks)
{
irqstate_t flags;

/* Increment the per-tick scheduler counter */

flags = write_seqlock_irqsave(&g_system_tick_lock);
g_system_ticks = ticks;
write_sequnlock_irqrestore(&g_system_tick_lock, flags);
}

/****************************************************************************
* Name: clock_increase_sched_ticks
*
Expand Down
10 changes: 9 additions & 1 deletion sched/sched/sched_processtickless.c
Original file line number Diff line number Diff line change
Expand Up @@ -375,13 +375,17 @@ void nxsched_process_timer(void)
{
#ifdef CONFIG_HRTIMER
uint64_t nsec = clock_systime_nsec();
clock_t ticks = NSEC2TICK(nsec);

clock_update_sched_ticks(ticks);

hrtimer_process(nsec);

# if CONFIG_RR_INTERVAL > 0
/* Workaround for SCHED_RR, see the note. */

irqstate_t flags = enter_critical_section();
nxsched_process_event(div_const(nsec, (uint32_t)NSEC_PER_TICK), true);
nxsched_process_event(ticks, true);
leave_critical_section(flags);
# endif

Expand All @@ -397,6 +401,10 @@ void nxsched_process_timer(void)

up_timer_gettick(&ticks);

/* Update sched ticks */

clock_update_sched_ticks(ticks);

#if CONFIG_RR_INTERVAL > 0
/* Workaround for SCHED_RR, see the note. */

Expand Down
Loading