ChibiOS/RT  6.1.4
Collaboration diagram for Virtual Timers:

Detailed Description

Time and Virtual Timers related APIs and services.

Functions

static void vt_init (delta_list_t *dlhp)
 Delta list initialization. More...
 
static bool vt_is_empty (delta_list_t *dlhp)
 List empty check. More...
 
static bool vt_is_last (delta_list_t *dlhp, delta_list_t *dlp)
 Last timer in the list check. More...
 
static bool vt_is_first (delta_list_t *dlhp, delta_list_t *dlp)
 Fist timer in the list check. More...
 
static bool vt_is_timer (delta_list_t *dlhp, delta_list_t *dlp)
 Timer check. More...
 
static void vt_insert_after (delta_list_t *dlhp, delta_list_t *dlp, sysinterval_t delta)
 Inserts an element after another header element. More...
 
static void vt_insert_before (delta_list_t *dlhp, delta_list_t *dlp, sysinterval_t delta)
 Inserts an element before another header element. More...
 
static void vt_insert (delta_list_t *dlhp, delta_list_t *dlep, sysinterval_t delta)
 Inserts an element in a delta list. More...
 
static delta_list_tvt_remove_first (delta_list_t *dlhp)
 Dequeues an element from the delta list. More...
 
static delta_list_tvt_dequeue (delta_list_t *dlp)
 Dequeues an element from the delta list. More...
 
static void vt_set_alarm (systime_t now, sysinterval_t delay)
 Alarm time setup. More...
 
static void vt_insert_first (virtual_timers_list_t *vtlp, virtual_timer_t *vtp, systime_t now, sysinterval_t delay)
 Inserts a timer as first element in a delta list. More...
 
static void vt_enqueue (virtual_timers_list_t *vtlp, virtual_timer_t *vtp, sysinterval_t delay)
 Enqueues a virtual timer in a virtual timers list. More...
 
void _vt_init (void)
 Virtual Timers initialization. More...
 
void chVTDoSetI (virtual_timer_t *vtp, sysinterval_t delay, vtfunc_t vtfunc, void *par)
 Enables a one-shot virtual timer. More...
 
void chVTDoResetI (virtual_timer_t *vtp)
 Disables a Virtual Timer. More...
 
sysinterval_t chVTGetRemainingIntervalI (virtual_timer_t *vtp)
 Returns the remaining time interval before next timer trigger. More...
 
void chVTDoTickI (void)
 Virtual timers ticker. More...
 
static void chVTObjectInit (virtual_timer_t *vtp)
 Initializes a virtual_timer_t object. More...
 
static systime_t chVTGetSystemTimeX (void)
 Current system time. More...
 
static systime_t chVTGetSystemTime (void)
 Current system time. More...
 
static sysinterval_t chVTTimeElapsedSinceX (systime_t start)
 Returns the elapsed time since the specified start time. More...
 
static bool chVTIsSystemTimeWithinX (systime_t start, systime_t end)
 Checks if the current system time is within the specified time window. More...
 
static bool chVTIsSystemTimeWithin (systime_t start, systime_t end)
 Checks if the current system time is within the specified time window. More...
 
static bool chVTGetTimersStateI (sysinterval_t *timep)
 Returns the time interval until the next timer event. More...
 
static bool chVTIsArmedI (const virtual_timer_t *vtp)
 Returns true if the specified timer is armed. More...
 
static bool chVTIsArmed (const virtual_timer_t *vtp)
 Returns true if the specified timer is armed. More...
 
static void chVTResetI (virtual_timer_t *vtp)
 Disables a Virtual Timer. More...
 
static void chVTReset (virtual_timer_t *vtp)
 Disables a Virtual Timer. More...
 
static void chVTSetI (virtual_timer_t *vtp, sysinterval_t delay, vtfunc_t vtfunc, void *par)
 Enables a virtual timer. More...
 
static void chVTSet (virtual_timer_t *vtp, sysinterval_t delay, vtfunc_t vtfunc, void *par)
 Enables a virtual timer. More...
 

Function Documentation

◆ vt_init()

static void vt_init ( delta_list_t dlhp)
inlinestatic

Delta list initialization.

Parameters
[out]dlhppointer to the delta list header
Function Class:
Not an API, this function is for internal use only.

Definition at line 58 of file chvt.c.

References ch_delta_list::delta, ch_delta_list::next, and ch_delta_list::prev.

Referenced by _vt_init().

◆ vt_is_empty()

static bool vt_is_empty ( delta_list_t dlhp)
inlinestatic

List empty check.

Parameters
[in]dlhppointer to the delta list header
Function Class:
Not an API, this function is for internal use only.

Definition at line 72 of file chvt.c.

References ch_delta_list::next.

Referenced by chVTDoResetI(), chVTDoTickI(), and vt_enqueue().

◆ vt_is_last()

static bool vt_is_last ( delta_list_t dlhp,
delta_list_t dlp 
)
inlinestatic

Last timer in the list check.

Parameters
[in]dlhppointer to the delta list header
[in]dlppointer to the delta list element
Function Class:
Not an API, this function is for internal use only.

Definition at line 85 of file chvt.c.

References ch_delta_list::next.

◆ vt_is_first()

static bool vt_is_first ( delta_list_t dlhp,
delta_list_t dlp 
)
inlinestatic

Fist timer in the list check.

Parameters
[in]dlhppointer to the delta list header
[in]dlppointer to the delta list element
Function Class:
Not an API, this function is for internal use only.

Definition at line 98 of file chvt.c.

References ch_delta_list::next.

Referenced by chVTDoResetI().

◆ vt_is_timer()

static bool vt_is_timer ( delta_list_t dlhp,
delta_list_t dlp 
)
inlinestatic

Timer check.

Parameters
[in]dlhppointer to the delta list header
[in]dlppointer to the delta list element
Function Class:
Not an API, this function is for internal use only.

Definition at line 111 of file chvt.c.

◆ vt_insert_after()

static void vt_insert_after ( delta_list_t dlhp,
delta_list_t dlp,
sysinterval_t  delta 
)
inlinestatic

Inserts an element after another header element.

Parameters
[in]dlhppointer to the delta list header element
[in]dlpelement to be inserted after the header element
[in]deltadelta of the element to be inserted
Function Class:
Not an API, this function is for internal use only.

Definition at line 125 of file chvt.c.

References ch_delta_list::delta, ch_delta_list::next, and ch_delta_list::prev.

Referenced by vt_insert_first().

◆ vt_insert_before()

static void vt_insert_before ( delta_list_t dlhp,
delta_list_t dlp,
sysinterval_t  delta 
)
inlinestatic

Inserts an element before another header element.

Parameters
[in]dlhppointer to the delta list header element
[in]dlpelement to be inserted before the header element
[in]deltadelta of the element to be inserted
Function Class:
Not an API, this function is for internal use only.

Definition at line 145 of file chvt.c.

References ch_delta_list::delta, ch_delta_list::next, and ch_delta_list::prev.

Referenced by vt_insert().

◆ vt_insert()

static void vt_insert ( delta_list_t dlhp,
delta_list_t dlep,
sysinterval_t  delta 
)
inlinestatic

Inserts an element in a delta list.

Parameters
[in]dlhppointer to the delta list header element
[in]dlepelement to be inserted before the header element
[in]deltadelta of the element to be inserted
Function Class:
Not an API, this function is for internal use only.

Definition at line 165 of file chvt.c.

References chDbgAssert, ch_delta_list::delta, ch_delta_list::next, and vt_insert_before().

Referenced by vt_enqueue().

Here is the call graph for this function:

◆ vt_remove_first()

static delta_list_t* vt_remove_first ( delta_list_t dlhp)
inlinestatic

Dequeues an element from the delta list.

Parameters
[in]dlhppointer to the delta list header
Function Class:
Not an API, this function is for internal use only.

Definition at line 200 of file chvt.c.

References ch_delta_list::next, and ch_delta_list::prev.

Referenced by chVTDoResetI().

◆ vt_dequeue()

static delta_list_t* vt_dequeue ( delta_list_t dlp)
inlinestatic

Dequeues an element from the delta list.

Parameters
[in]dlppointer to the delta list element
Function Class:
Not an API, this function is for internal use only.

Definition at line 216 of file chvt.c.

References ch_delta_list::next, and ch_delta_list::prev.

Referenced by chVTDoResetI(), and chVTDoTickI().

◆ vt_set_alarm()

static void vt_set_alarm ( systime_t  now,
sysinterval_t  delay 
)
static

Alarm time setup.

Note
An RFCU fault is registered if the system time skips past (now + delay), the deadline is skipped forward in order to compensate for the event.
Parameters
[in]nowlast known system time
[in]delaydelay over now

Definition at line 234 of file chvt.c.

References CH_CFG_ST_TIMEDELTA, chDbgAssert, chTimeAddX(), chTimeDiffX(), chVTGetSystemTimeX(), and TIME_MAX_SYSTIME.

Referenced by chVTDoResetI(), chVTDoTickI(), and vt_enqueue().

Here is the call graph for this function:

◆ vt_insert_first()

static void vt_insert_first ( virtual_timers_list_t vtlp,
virtual_timer_t vtp,
systime_t  now,
sysinterval_t  delay 
)
static

Inserts a timer as first element in a delta list.

Note
This is the special case when the delta list is initially empty.

Definition at line 288 of file chvt.c.

References CH_CFG_ST_TIMEDELTA, chDbgAssert, chTimeAddX(), chTimeDiffX(), chVTGetSystemTimeX(), ch_virtual_timer::dlist, ch_virtual_timers_list::dlist, ch_virtual_timers_list::lasttime, TIME_MAX_SYSTIME, and vt_insert_after().

Referenced by vt_enqueue().

Here is the call graph for this function:

◆ vt_enqueue()

static void vt_enqueue ( virtual_timers_list_t vtlp,
virtual_timer_t vtp,
sysinterval_t  delay 
)
static

Enqueues a virtual timer in a virtual timers list.

Definition at line 350 of file chvt.c.

References chTimeDiffX(), chVTGetSystemTimeX(), ch_virtual_timer::dlist, ch_virtual_timers_list::dlist, ch_virtual_timers_list::lasttime, vt_insert(), vt_insert_first(), vt_is_empty(), and vt_set_alarm().

Referenced by chVTDoSetI().

Here is the call graph for this function:

◆ _vt_init()

void _vt_init ( void  )

Virtual Timers initialization.

Note
Internal use only.
Function Class:
Not an API, this function is for internal use only.

Definition at line 406 of file chvt.c.

References ch, ch_virtual_timers_list::dlist, ch_virtual_timers_list::lasttime, ch_virtual_timers_list::systime, vt_init(), and ch_system::vtlist.

Referenced by chSysInit().

Here is the call graph for this function:

◆ chVTDoSetI()

void chVTDoSetI ( virtual_timer_t vtp,
sysinterval_t  delay,
vtfunc_t  vtfunc,
void *  par 
)

Enables a one-shot virtual timer.

The timer is enabled and programmed to trigger after the delay specified as parameter.

Precondition
The timer must not be already armed before calling this function.
Note
The callback function is invoked from interrupt context.
Parameters
[out]vtpthe virtual_timer_t structure pointer
[in]delaythe number of ticks before the operation timeouts, the special values are handled as follow:
  • TIME_INFINITE is allowed but interpreted as a normal time specification.
  • TIME_IMMEDIATE this value is not allowed.
[in]vtfuncthe timer callback function. After invoking the callback the timer is disabled and the structure can be disposed or reused.
[in]para parameter that will be passed to the callback function
Function Class:
This is an I-Class API, this function can be invoked from within a system lock zone by both threads and interrupt handlers.

Definition at line 438 of file chvt.c.

References ch, chDbgCheck, chDbgCheckClassI(), ch_virtual_timer::func, ch_virtual_timer::par, TIME_IMMEDIATE, vt_enqueue(), and ch_system::vtlist.

Referenced by chSchGoSleepTimeoutS(), and chVTSetI().

Here is the call graph for this function:

◆ chVTDoResetI()

void chVTDoResetI ( virtual_timer_t vtp)

Disables a Virtual Timer.

Precondition
The timer must be in armed state before calling this function.
Parameters
[in]vtpthe virtual_timer_t structure pointer
Function Class:
This is an I-Class API, this function can be invoked from within a system lock zone by both threads and interrupt handlers.

Definition at line 461 of file chvt.c.

References ch, chDbgAssert, chDbgCheck, chDbgCheckClassI(), chTimeDiffX(), chVTGetSystemTimeX(), chVTIsArmedI(), ch_delta_list::delta, ch_virtual_timer::dlist, ch_virtual_timers_list::dlist, ch_virtual_timer::func, ch_virtual_timers_list::lasttime, ch_delta_list::next, vt_dequeue(), vt_is_empty(), vt_is_first(), vt_remove_first(), vt_set_alarm(), and ch_system::vtlist.

Referenced by chVTResetI().

Here is the call graph for this function:

◆ chVTGetRemainingIntervalI()

sysinterval_t chVTGetRemainingIntervalI ( virtual_timer_t vtp)

Returns the remaining time interval before next timer trigger.

Note
This function can be called while the timer is active.
Parameters
[in]vtpthe virtual_timer_t structure pointer
Returns
The remaining time interval.
Function Class:
This is an I-Class API, this function can be invoked from within a system lock zone by both threads and interrupt handlers.

Definition at line 544 of file chvt.c.

References ch, chDbgAssert, chDbgCheckClassI(), chTimeDiffX(), chVTGetSystemTimeX(), ch_delta_list::delta, ch_virtual_timer::dlist, ch_virtual_timers_list::dlist, ch_virtual_timers_list::lasttime, ch_delta_list::next, and ch_system::vtlist.

Here is the call graph for this function:

◆ chVTDoTickI()

void chVTDoTickI ( void  )

Virtual timers ticker.

Note
The system lock is released before entering the callback and re-acquired immediately after. It is callback's responsibility to acquire the lock if needed. This is done in order to reduce interrupts jitter when many timers are in use.
Function Class:
This is an I-Class API, this function can be invoked from within a system lock zone by both threads and interrupt handlers.

Definition at line 584 of file chvt.c.

References ch, chDbgCheckClassI(), chSysLockFromISR(), chSysUnlockFromISR(), chTimeAddX(), chTimeDiffX(), chVTGetSystemTimeX(), ch_delta_list::delta, ch_virtual_timer::dlist, ch_virtual_timers_list::dlist, ch_virtual_timer::func, ch_virtual_timers_list::lasttime, ch_delta_list::next, ch_virtual_timer::par, ch_virtual_timers_list::systime, vt_dequeue(), vt_is_empty(), vt_set_alarm(), and ch_system::vtlist.

Referenced by chSysTimerHandlerI().

Here is the call graph for this function:

◆ chVTObjectInit()

static void chVTObjectInit ( virtual_timer_t vtp)
inlinestatic

Initializes a virtual_timer_t object.

Note
Initializing a timer object is not strictly required because the function chVTSetI() initializes the object too. This function is only useful if you need to perform a chVTIsArmed() check before calling chVTSetI().
Parameters
[out]vtpthe virtual_timer_t structure pointer
Function Class:
Initializer, this function just initializes an object and can be invoked before the kernel is initialized.

Definition at line 98 of file chvt.h.

References ch_virtual_timer::func.

◆ chVTGetSystemTimeX()

static systime_t chVTGetSystemTimeX ( void  )
inlinestatic

Current system time.

Returns the number of system ticks since the chSysInit() invocation.

Note
The counter can reach its maximum and then restart from zero.
This function can be called from any context but its atomicity is not guaranteed on architectures whose word size is less than systime_t size.
Returns
The system time in ticks.
Function Class:
This is an X-Class API, this function can be invoked from any context.

Definition at line 116 of file chvt.h.

References ch, ch_virtual_timers_list::systime, and ch_system::vtlist.

Referenced by chThdSleepUntil(), chThdSleepUntilWindowed(), chVTDoResetI(), chVTDoTickI(), chVTGetRemainingIntervalI(), chVTGetSystemTime(), chVTGetTimersStateI(), chVTIsSystemTimeWithinX(), chVTTimeElapsedSinceX(), trace_next(), vt_enqueue(), vt_insert_first(), and vt_set_alarm().

◆ chVTGetSystemTime()

static systime_t chVTGetSystemTime ( void  )
inlinestatic

Current system time.

Returns the number of system ticks since the chSysInit() invocation.

Note
The counter can reach its maximum and then restart from zero.
Returns
The system time in ticks.
Function Class:
Normal API, this function can be invoked by regular system threads but not from within a lock zone.

Definition at line 135 of file chvt.h.

References chSysLock(), chSysUnlock(), and chVTGetSystemTimeX().

Referenced by chVTIsSystemTimeWithin().

Here is the call graph for this function:

◆ chVTTimeElapsedSinceX()

static sysinterval_t chVTTimeElapsedSinceX ( systime_t  start)
inlinestatic

Returns the elapsed time since the specified start time.

Parameters
[in]startstart time
Returns
The elapsed time.
Function Class:
This is an X-Class API, this function can be invoked from any context.

Definition at line 153 of file chvt.h.

References chTimeDiffX(), and chVTGetSystemTimeX().

Here is the call graph for this function:

◆ chVTIsSystemTimeWithinX()

static bool chVTIsSystemTimeWithinX ( systime_t  start,
systime_t  end 
)
inlinestatic

Checks if the current system time is within the specified time window.

Note
When start==end then the function returns always false because the time window has zero size.
Parameters
[in]startthe start of the time window (inclusive)
[in]endthe end of the time window (non inclusive)
Return values
truecurrent time within the specified time window.
falsecurrent time not within the specified time window.
Function Class:
This is an X-Class API, this function can be invoked from any context.

Definition at line 171 of file chvt.h.

References chTimeIsInRangeX(), and chVTGetSystemTimeX().

Here is the call graph for this function:

◆ chVTIsSystemTimeWithin()

static bool chVTIsSystemTimeWithin ( systime_t  start,
systime_t  end 
)
inlinestatic

Checks if the current system time is within the specified time window.

Note
When start==end then the function returns always false because the time window has zero size.
Parameters
[in]startthe start of the time window (inclusive)
[in]endthe end of the time window (non inclusive)
Return values
truecurrent time within the specified time window.
falsecurrent time not within the specified time window.
Function Class:
Normal API, this function can be invoked by regular system threads but not from within a lock zone.

Definition at line 189 of file chvt.h.

References chTimeIsInRangeX(), and chVTGetSystemTime().

Here is the call graph for this function:

◆ chVTGetTimersStateI()

static bool chVTGetTimersStateI ( sysinterval_t timep)
inlinestatic

Returns the time interval until the next timer event.

Note
The return value is not perfectly accurate and can report values in excess of CH_CFG_ST_TIMEDELTA ticks.
The interval returned by this function is only meaningful if more timers are not added to the list until the returned time.
Parameters
[out]timeppointer to a variable that will contain the time interval until the next timer elapses. This pointer can be NULL if the information is not required.
Returns
The time, in ticks, until next time event.
Return values
falseif the timers list is empty.
trueif the timers list contains at least one timer.
Function Class:
This is an I-Class API, this function can be invoked from within a system lock zone by both threads and interrupt handlers.

Definition at line 210 of file chvt.h.

References ch, CH_CFG_ST_TIMEDELTA, chDbgCheckClassI(), chTimeDiffX(), chVTGetSystemTimeX(), ch_delta_list::delta, ch_virtual_timers_list::dlist, ch_virtual_timers_list::lasttime, ch_delta_list::next, and ch_system::vtlist.

Here is the call graph for this function:

◆ chVTIsArmedI()

static bool chVTIsArmedI ( const virtual_timer_t vtp)
inlinestatic

Returns true if the specified timer is armed.

Precondition
The timer must have been initialized using chVTObjectInit() or chVTDoSetI().
Parameters
[in]vtpthe virtual_timer_t structure pointer
Returns
true if the timer is armed.
Function Class:
This is an I-Class API, this function can be invoked from within a system lock zone by both threads and interrupt handlers.

Definition at line 242 of file chvt.h.

References chDbgCheckClassI(), and ch_virtual_timer::func.

Referenced by chVTDoResetI(), chVTIsArmed(), and chVTResetI().

Here is the call graph for this function:

◆ chVTIsArmed()

static bool chVTIsArmed ( const virtual_timer_t vtp)
inlinestatic

Returns true if the specified timer is armed.

Precondition
The timer must have been initialized using chVTObjectInit() or chVTDoSetI().
Parameters
[in]vtpthe virtual_timer_t structure pointer
Returns
true if the timer is armed.
Function Class:
Normal API, this function can be invoked by regular system threads but not from within a lock zone.

Definition at line 259 of file chvt.h.

References chSysLock(), chSysUnlock(), and chVTIsArmedI().

Here is the call graph for this function:

◆ chVTResetI()

static void chVTResetI ( virtual_timer_t vtp)
inlinestatic

Disables a Virtual Timer.

Note
The timer is first checked and disabled only if armed.
Precondition
The timer must have been initialized using chVTObjectInit() or chVTDoSetI().
Parameters
[in]vtpthe virtual_timer_t structure pointer
Function Class:
This is an I-Class API, this function can be invoked from within a system lock zone by both threads and interrupt handlers.

Definition at line 279 of file chvt.h.

References chVTDoResetI(), and chVTIsArmedI().

Referenced by chVTReset(), and chVTSetI().

Here is the call graph for this function:

◆ chVTReset()

static void chVTReset ( virtual_timer_t vtp)
inlinestatic

Disables a Virtual Timer.

Note
The timer is first checked and disabled only if armed.
Precondition
The timer must have been initialized using chVTObjectInit() or chVTDoSetI().
Parameters
[in]vtpthe virtual_timer_t structure pointer
Function Class:
Normal API, this function can be invoked by regular system threads but not from within a lock zone.

Definition at line 296 of file chvt.h.

References chSysLock(), chSysUnlock(), and chVTResetI().

Here is the call graph for this function:

◆ chVTSetI()

static void chVTSetI ( virtual_timer_t vtp,
sysinterval_t  delay,
vtfunc_t  vtfunc,
void *  par 
)
inlinestatic

Enables a virtual timer.

If the virtual timer was already enabled then it is re-enabled using the new parameters.

Precondition
The timer must have been initialized using chVTObjectInit() or chVTDoSetI().
Parameters
[in]vtpthe virtual_timer_t structure pointer
[in]delaythe number of ticks before the operation timeouts, the special values are handled as follow:
  • TIME_INFINITE is allowed but interpreted as a normal time specification.
  • TIME_IMMEDIATE this value is not allowed.
[in]vtfuncthe timer callback function. After invoking the callback the timer is disabled and the structure can be disposed or reused.
[in]para parameter that will be passed to the callback function
Function Class:
This is an I-Class API, this function can be invoked from within a system lock zone by both threads and interrupt handlers.

Definition at line 325 of file chvt.h.

References chVTDoSetI(), and chVTResetI().

Referenced by chVTSet().

Here is the call graph for this function:

◆ chVTSet()

static void chVTSet ( virtual_timer_t vtp,
sysinterval_t  delay,
vtfunc_t  vtfunc,
void *  par 
)
inlinestatic

Enables a virtual timer.

If the virtual timer was already enabled then it is re-enabled using the new parameters.

Precondition
The timer must have been initialized using chVTObjectInit() or chVTDoSetI().
Parameters
[in]vtpthe virtual_timer_t structure pointer
[in]delaythe number of ticks before the operation timeouts, the special values are handled as follow:
  • TIME_INFINITE is allowed but interpreted as a normal time specification.
  • TIME_IMMEDIATE this value is not allowed.
[in]vtfuncthe timer callback function. After invoking the callback the timer is disabled and the structure can be disposed or reused.
[in]para parameter that will be passed to the callback function
Function Class:
Normal API, this function can be invoked by regular system threads but not from within a lock zone.

Definition at line 354 of file chvt.h.

References chSysLock(), chSysUnlock(), and chVTSetI().

Here is the call graph for this function: