QP/C  8.0.0
Real-Time Embedded Framework
Loading...
Searching...
No Matches
QTimeEvt Class Reference

Time Event class. More...

#include "qp.h"

Inheritance diagram for QTimeEvt:
QEvt

Public Member Functions

void QTimeEvt_ctorX (QTimeEvt *const me, QActive *const act, enum_t const sig, uint_fast8_t const tickRate)
 The "extended" constructor to initialize a Time Event.
 
void QTimeEvt_armX (QTimeEvt *const me, uint32_t const nTicks, uint32_t const interval)
 Arm a time event (extended version for one shot or periodic time event)
 
bool QTimeEvt_disarm (QTimeEvt *const me)
 Disarm a time event.
 
bool QTimeEvt_rearm (QTimeEvt *const me, uint32_t const nTicks)
 Rearm a time event.
 
bool QTimeEvt_wasDisarmed (QTimeEvt *const me)
 Check the "was disarmed" status of a time event.
 
QTimeEvtCtr QTimeEvt_currCtr (QTimeEvt const *const me)
 Get the current value of the down-counter of a time event.
 

Static Public Member Functions

bool QTimeEvt_noActive (uint_fast8_t const tickRate)
 Check if any time events are active at a given clock tick rate.
 
- Static Public Member Functions inherited from QEvt
static void QEvt_ctor (QEvt *const me, enum_t const sig)
 
static QEvtQEvt_init (QEvt *const me, uint8_t dummy)
 Event without parameters initialization.
 

Public Attributes

QEvt super
 
- Public Attributes inherited from QEvt
QSignal sig
 Signal of the event (see Event Signal)
 

Static Private Member Functions

void QTimeEvt_init (void)
 
void QTimeEvt_tick_ (uint_fast8_t const tickRate, void const *const sender)
 Processes all armed time events at every clock tick.
 
void QTimeEvt_tick1_ (uint_fast8_t const tickRate, void const *const sender)
 Processes one clock tick for QUTest.
 

Private Attributes

struct QTimeEvt *volatile next
 Link to the next time event in the list.
 
uintptr_t next_dis
 
void * act
 Active object that receives the time events.
 
QTimeEvtCtr volatile ctr
 Down-counter of the time event.
 
QTimeEvtCtr ctr_dis
 
QTimeEvtCtr interval
 Interval for periodic time event (zero for one-shot time event)
 
uint8_t tickRate
 
uint8_t flags
 
QTimeEvt QTimeEvt_timeEvtHead_ [QF_MAX_TICK_RATE]
 Array of heads of linked lists of time events (one for every clock tick rate)
 
uintptr_t QTimeEvt_timeEvtHead_dis_ [QF_MAX_TICK_RATE]
 

Detailed Description

Time Event class.

Details
Time events are special QF events equipped with the notion of time passage. The basic usage model of the time events is as follows. An active object allocates one or more QTimeEvt objects (provides the storage for them). When the active object needs to arrange for a timeout, it arms one of its time events to fire either just once (one-shot) or periodically. Each time event times out independently from the others, so a QF application can make multiple parallel timeout requests (from the same or different active objects). When QF detects that the appropriate moment has arrived, it inserts the time event directly into the recipient's event queue. The recipient then processes the time event just like any other event.

Time events, as any other QF events derive from the QEvt base class. Typically, you will use a time event as-is, but you can also further derive more specialized time events from it by adding some more data members and/or specialized functions that operate on the specialized time events.

Internally, the armed time events are organized into linked lists–one list for every supported ticking rate. These linked lists are scanned in every invocation of the QTIMEEVT_TICK_X() macro. Only armed (timing out) time events are in the list, so only armed time events consume CPU cycles.

Note
QF manages the time events in the QTIMEEVT_TICK_X() macro, which must be called periodically, from the clock tick ISR or from other periodic source. QTIMEEVT_TICK_X() caYou might also use the special QTicker active object.
Even though QTimeEvt is a subclass of QEvt, QTimeEvt instances can NOT be allocated dynamically from event pools. In other words, it is illegal to allocate QTimeEvt instances with the Q_NEW() or Q_NEW_X() macros.
Backward Traceability

Definition at line 946 of file qp.h.

Member Function Documentation

◆ QTimeEvt_ctorX()

void QTimeEvt_ctorX ( QTimeEvt *const me,
QActive *const act,
enum_t const sig,
uint_fast8_t const tickRate )

The "extended" constructor to initialize a Time Event.

Details
When creating a time event, you must commit it to a specific active object act, tick rate tickRate and event signal sig. You cannot change these attributes later.
Parameters
[in,out]mecurrent instance pointer (see Object Orientation)
[in]actpointer to the active object associated with this time event. The time event will post itself to this AO.
[in]sigsignal to associate with this time event.
[in]tickRatesystem clock tick rate to associate with this time event in the range [0..15].
Precondition qf_time:300
  • the signal sig must be valid
  • the tick rate tickRate must be in range
Note
You should call QTimeEvt_ctorX() exactly once for every Time Event object before arming the Time Event. The ideal place for calling QTimeEvt_ctorX() is the constructor of the associated AO.
Backward Traceability

◆ QTimeEvt_armX()

void QTimeEvt_armX ( QTimeEvt *const me,
uint32_t const nTicks,
uint32_t const interval )

Arm a time event (extended version for one shot or periodic time event)

Details
Arms a time event to fire in a specified number of clock ticks and with a specified interval. If the interval is zero, the time event is armed for one shot ('one-shot' time event). When the timeout expires, the time event gets directly posted (using the FIFO policy) into the event queue of the host active object. After posting, a one-shot time event gets automatically disarmed while a periodic time event (interval != 0) is automatically re-armed.

A time event can be disarmed at any time by calling QTimeEvt_disarm(). Also, a time event can be re-armed to fire in a different number of clock ticks by calling the QTimeEvt_rearm().

Parameters
[in,out]mecurrent instance pointer (see Object Orientation)
[in]nTicksnumber of clock ticks (at the associated rate) to rearm the time event with.
[in]intervalinterval (in clock ticks) for periodic time event.
Precondition qf_time:400
  • the host AO must be valid,
  • the time eveht must be disarmed,
  • the number of clock ticks cannot be zero,
  • the signal must be valid.
Attention
Arming an already armed time event is not allowed and is considered a programming error. The QP/C framework will assert if it detects an attempt to arm an already armed time event.
Backward Traceability
  • QTimeEvt : Time Event class
  • DVR_QP_MC4_R11_05 : Rule 11.5(Advisory): A conversion should not be performed from pointer to void into pointer to object
Usage
The following example shows how to arm a periodic time event as well as one-shot time event from a state machine of an active object:
QState Game_show_logo(Tunnel * const me, QEvt const * const e) {
QState status_;
switch (e->sig) {
case Q_ENTRY_SIG: {
// arm periodic time event
QTimeEvt_armX(&me->blinkTimeEvt, // <===
BSP_TICKS_PER_SEC/2U, // one-time delay
BSP_TICKS_PER_SEC/2U); // interval
// arm a one-shot time event
QTimeEvt_armX(&me->screenTimeEvt,
BSP_TICKS_PER_SEC*5U, // one-time delay
0U); // interval (0 == no interval)
. . .
status_ = Q_HANDLED();
break;
}
. . .
#define Q_HANDLED()
Indicate that an action has been "handled". Applies to entry/exit actions and to internal transitions...
Definition qp.h:507
enum QStateRet QState
Type returned from state-handler functions.
Definition qp.h:212
#define Q_ENTRY_SIG
reserved signal sent to state handler to execute the entry case)
Definition qp.h:480
Event class.
Definition qp.h:131
QSignal sig
Signal of the event (see Event Signal)
Definition qp.h:135
void QTimeEvt_armX(QTimeEvt *const me, uint32_t const nTicks, uint32_t const interval)
Arm a time event (extended version for one shot or periodic time event)
Definition qf_time.c:93

Definition at line 93 of file qf_time.c.

◆ QTimeEvt_disarm()

bool QTimeEvt_disarm ( QTimeEvt *const me)

Disarm a time event.

Details
Disarm the time event so it can be safely reused.
Remarks
Disarming an already disarmed time event is fine.
Parameters
[in,out]mecurrent instance pointer (see Object Orientation)
Returns
'true' if the time event was truly disarmed, that is, it was running. The return of 'false' means that the time event was not truly disarmed, because it was not running. The 'false' return is only possible for one-shot time events that have been automatically disarmed upon expiration. In this case the 'false' return means that the time event has already been posted or published and should be expected in the active object's state machine.
Backward Traceability

Definition at line 181 of file qf_time.c.

◆ QTimeEvt_rearm()

bool QTimeEvt_rearm ( QTimeEvt *const me,
uint32_t const nTicks )

Rearm a time event.

Details
Rearms a time event with a new number of clock ticks. This function can be used to adjust the current period of a periodic time event or to prevent a one-shot time event from expiring (e.g., a watchdog time event). Rearming a periodic timer leaves the interval unchanged and is a convenient method to adjust the phasing of a periodic time event.
Parameters
[in,out]mecurrent instance pointer (see Object Orientation)
[in]nTicksnumber of clock ticks (at the associated rate) to rearm the time event with.
Returns
'true' if the time event was running as it was re-armed. The 'false' return means that the time event was not truly rearmed because it was not running. The 'false' return is only possible for one-shot time events that have been automatically disarmed upon expiration. In this case the 'false' return means that the time event has already been posted or published and should be expected in the active object's state machine.
Precondition qf_time:600
  • AO must be valid
  • tick rate must be in range
  • nTicks must not be zero,
  • the signal of this time event must be valid
Backward Traceability
  • QTimeEvt : Time Event class
  • DVR_QP_MC4_R11_05 : Rule 11.5(Advisory): A conversion should not be performed from pointer to void into pointer to object

Definition at line 237 of file qf_time.c.

◆ QTimeEvt_wasDisarmed()

bool QTimeEvt_wasDisarmed ( QTimeEvt *const me)

Check the "was disarmed" status of a time event.

Details
Useful for checking whether a one-shot time event was disarmed in the QTimeEvt_disarm() operation.
Parameters
[in,out]mecurrent instance pointer (see Object Orientation)
Returns
'true' if the time event was truly disarmed in the last QTimeEvt_disarm() operation. The 'false' return means that the time event was not truly disarmed, because it was not running at that time. The 'false' return is only possible for one-shot time events that have been automatically disarmed upon expiration. In this case the 'false' return means that the time event has already been posted or published and should be expected in the active object's event queue.
Note
This function has a side effect of setting the "was disarmed" status, which means that the second and subsequent times this function is called the function will return 'true'.
Backward Traceability

Definition at line 332 of file qf_time.c.

◆ QTimeEvt_currCtr()

QTimeEvtCtr QTimeEvt_currCtr ( QTimeEvt const *const me)

Get the current value of the down-counter of a time event.

Details
Useful for checking how many clock ticks (at the tick rate associated with the time event) remain until the time event expires.
Parameters
[in,out]mecurrent instance pointer (see Object Orientation)
Returns
For an armed time event, the function returns the current value of the down-counter of the given time event. If the time event is not armed, the function returns 0.
Backward Traceability

Definition at line 348 of file qf_time.c.

◆ QTimeEvt_init()

void QTimeEvt_init ( void )
staticprivate

Definition at line 359 of file qf_time.c.

◆ QTimeEvt_tick_()

void QTimeEvt_tick_ ( uint_fast8_t const tickRate,
void const *const sender )
staticprivate

Processes all armed time events at every clock tick.

Details
This internal helper function processes all armed QTimeEvt objects associated with the tick rate tickRate.

This function must be called periodically from a time-tick ISR or from a task so that QF can manage the timeout events assigned to the given system clock tick rate.

Parameters
[in]tickRateclock tick rate serviced in this call [1..15].
[in]senderpointer to a sender object (only for QS tracing)
Note
this function should be called only via the macro QTIMEEVT_TICK_X().
The calls to QTimeEvt_tick_() with different tickRate parameter can preempt each other. For example, higher clock tick rates might be serviced from interrupts while others from tasks (active objects).
Backward Traceability
  • QTimeEvt : Time Event class
  • DVR_QP_MC4_R11_05 : Rule 11.5(Advisory): A conversion should not be performed from pointer to void into pointer to object

Definition at line 375 of file qf_time.c.

◆ QTimeEvt_tick1_()

void QTimeEvt_tick1_ ( uint_fast8_t const tickRate,
void const *const sender )
staticprivate

Processes one clock tick for QUTest.

Backward Traceability

◆ QTimeEvt_noActive()

bool QTimeEvt_noActive ( uint_fast8_t const tickRate)
static

Check if any time events are active at a given clock tick rate.

Parameters
[in]tickRatesystem clock tick rate to find out about.
Returns
'true' if no time events are armed at the given tick rate and 'false' otherwise.
Precondition qf_time:800
  • the tick rate must be in range
Note
This function should be called in critical section.
Backward Traceability

Definition at line 548 of file qf_time.c.

Member Data Documentation

◆ super

QEvt QTimeEvt::super

Definition at line 948 of file qp.h.

◆ next

struct QTimeEvt* volatile next
private

Link to the next time event in the list.

Backward Traceability

Definition at line 953 of file qp.h.

◆ next_dis

uintptr_t next_dis
private

Definition at line 957 of file qp.h.

◆ act

void* act
private

Active object that receives the time events.

Definition at line 961 of file qp.h.

◆ ctr

QTimeEvtCtr volatile ctr
private

Down-counter of the time event.

Details
The down-counter is decremented by 1 in every QTimeEvt_tick_() call. The time event fires (gets posted or published) when the down-counter reaches zero.
Backward Traceability

Definition at line 964 of file qp.h.

◆ ctr_dis

QTimeEvtCtr ctr_dis
private

Definition at line 968 of file qp.h.

◆ interval

QTimeEvtCtr interval
private

Interval for periodic time event (zero for one-shot time event)

Details
The value of the interval is re-loaded to the internal down-counter when the time event expires, so that the time event keeps timing out periodically.
Backward Traceability

Definition at line 972 of file qp.h.

◆ tickRate

uint8_t tickRate
private

Definition at line 975 of file qp.h.

◆ flags

uint8_t flags
private

Definition at line 978 of file qp.h.

◆ QTimeEvt_timeEvtHead_

QTimeEvt QTimeEvt_timeEvtHead_[QF_MAX_TICK_RATE]
private

Array of heads of linked lists of time events (one for every clock tick rate)

Backward Traceability

Definition at line 982 of file qp.h.

◆ QTimeEvt_timeEvtHead_dis_

uintptr_t QTimeEvt_timeEvtHead_dis_[QF_MAX_TICK_RATE]
private

Definition at line 986 of file qp.h.


The documentation for this class was generated from the following files: