SlideShare a Scribd company logo
1 of 25
Download to read offline
New Features in QP5

11/08/13

New Features
in QP5

© Quantum Leaps, LLC

This presentation highlights the new features in the new QP5 milestone release.
What is it?
QP™ is a family of lightweight, open source software frameworks for building responsive
and modular real-time embedded applications as systems of cooperating, event-driven
active objects (actors). The QP™ family consists of QP/C, QP/C++, and QP-nano
frameworks, which are all strictly quality controlled, superbly documented, and
commercially licensable.
Where does it run?
All QP™ frameworks can run on "bare-metal" single-chip microcontrollers, completely
replacing a traditional Real-Time Operating System (RTOS). Ports and ready-to-use
examples are provided for most major CPU families. QP/C and QP/C++ can also work with
a traditional OS/RTOS, such as: POSIX (Linux, embedded Linux, QNX, INTEGRITY),
Win32 (Windows, Windows embedded, Windows CE), ThreadX, MicroC/OS, etc.
How does it handle behavior?
The behavior of active objects is specified in QP by means of hierarchical state machines
(UML statecharts). The frameworks support manual coding of UML state machines in C or
C++ as well as fully automatic code generation by means of the free graphical QM™
modeling tool.
Who is using it?
The QP frameworks are used in millions of products worldwide in aerospace, robotics,
consumer electronics, wired and wireless telecommunications, industrial automation,
transportation, and many more. The QP™ frameworks and the QM™ modeling tool receive
over 30,000 downloads a year (not even counting downloads of QP ports).
(c) Quantum Leaps, LLC

1
New Features in QP5

11/08/13

Course Outline
Enable QM generate new type of of code
•Enable QM toto generate new type SMSM code
•Provide “hooks” for customization (virtual functions)
•Multiple system clock tick rates
•Non-asserting event allocation and posting
•Kernel-Unaware Interrupts for ARM Cortex-M3/M4
•Quick Summary of Other Changes

QP5 remains backwards-compatible
with existing QP4 applications
(except ISR priorities in ARM Cortex-M3/M4)
© Quantum Leaps, LLC

2

The main purpose of this milestone QP5 release is to enable the QM modeling tool to
generate a new type of state machine code (requires QM version 3).
Specifically, QM can generate the complete transition-sequences (sequences of
exit/entry/initial actions) at code-generation time instead of discovering the transitionsequences at run-time. This requires a different (much simpler) event processor than the
one provided in the QHsm class. QP5 provides such new event processor in the new class
QMsm.
NOTE: QP5 5.1 remains backwards-compatible with the existing QP 4.x applications,
except the ARM Cortex-M applications need to adjust the interrupt priorities. Specifically,
you need to set the interrupt priorities equal or lower than QF_AWARE_ISR_CMSIS_PRI
constant provided in the qf_port.h header file.

(c) Quantum Leaps, LLC

2
New Features in QP5

11/08/13

The new QMsm Base Class
QMsm
For “virtual” functions
in C

New state machine
implementation

vptr : QMsmVtbl
state : QMAttr
temp : QMAttr

MyMsm

init(e : QEvt const *)
dispatch(e : QEvt const *)

QFsm

QHsm

init(e : QEvt const *)
dispatch(e : QEvt const *)

init(e : QEvt const *)
dispatch(e : QEvt const *)

Subclass of QMsm
Uses new implementation

MyHsm

Old state machine
implementation

© Quantum Leaps, LLC

Subclass of QHsm
Uses old implementation

3

The new type of state machine implementation in QP5 is based on the new QMsm class,
which takes advantage of the QM tool as an advanced "state machine compiler".
The QMsm class provides the new implementation of the init() and dispatch() functions.
QMsm provides also the virtual pointer, which enables polymorphism (late binding).
Coding state machines based on QMsm requires the assistance of the QM tool to generate
the complete transition-sequences (sequences of exit/entry/initial actions) at codegeneration time. The resulting code can be still highly human-readable, but it will no
longer be human-maintainable. The lab tests indicate that the new "housekeeping" code
for executing hierarchical state machines can be about twice as fast as the previous code
based on the QHsm class.
Additionally, the new code requires less run-time support (smaller event processor) and
uses 70% less of stack space in the call to the QMsm_dispatch() operation than
QHsm_dispatch().

(c) Quantum Leaps, LLC

3
New Features in QP5

11/08/13

New State Machine Code
typedef struct QMsmTstTag {
QMsm super;
/* inherits QMsm */
uint8_t foo;
/* some attributes */
} QMsmTst;
void QMsmTst_ctor(void);
static QState QMsmTst_initial(QMsmTst * const me);
static QMState const QMsmTst_s1_ = {
(QMState const )0,
/* the superstate (NULL==top) */
Q_STATE_CAST(&QMsmTst_s1),
/* state-handler function */
Q_ACTION_CAST(&QMsmTst_s1_x) /* state-exit action (if present) */
};
static QState QMsmTst_s1(QMsmTst * const me, QEvt const * const e);
static QState QMsmTst_s1_e(QMsmTst * const me);
static QState QMsmTst_s1_x(QMsmTst * const me);
static QState QMsmTst_s1_i(QMsmTst * const me);
static QMState const QMsmTst_s11_ = {
&QMsmTst_s1_,
/* the superstate */
Q_STATE_CAST(&QMsmTst_s11),
/* state-handler function */
Q_ACTION_CAST(&QMsmTst_s11_x) /* state-exit action (if present) */
};
static QState QMsmTst_s11(QMsmTst * const me, QEvt const * const e);
static QState QMsmTst_s11_e(QMsmTst * const me);
static QState QMsmTst_s11_x(QMsmTst * const me);
static QState QMsmTst_s11_i(QMsmTst * const me);
~~~~~~~~~

© Quantum Leaps, LLC

4

****
NOTE: The new state machine code is not intended to be written manually. This code is
generated automatically by the QM tool from the state diagram. The explanation provided
here is only intended to help you understand this code structure, so that you can work with it
effectively (e.g., inside a traditional source-level debugger).
****
Each state is represented as:
1. QMState object (const in ROM)
2. state-handler function
3. optional entry-action function
4. optional exit-action function
5. optional initial-transition function
The QMState object provides the information about nesting of the state, the associated
state-handler function, and the exit-action function, if present.
The state-handler function no longer handles entry/exit/initial transition.
The entry/exit/initial transition are handled in separate functions associated with a state.
These functions are only defined when needed.

(c) Quantum Leaps, LLC

4
New Features in QP5

11/08/13

New State Machine Code (cont'd)

void QMsmTst_ctor(void) {
/* constructor */
QMsmTst *me = &l_msmtst;
QMsm_ctor(&me->super, Q_STATE_CAST(&QMsmTst_initial));
}
/*..........................................................................*/
static QState QMsmTst_initial(QMsmTst * const me) { /* top-most init.tran. */
static QActionHandler const act_[] = { /* transition-action array */
Q_ACTION_CAST(&QMsmTst_s1_e),
/* entry-action function */
Q_ACTION_CAST(&QMsmTst_s1_i),
/* initial-tran function */
Q_ACTION_CAST(0)
/* zero-terminated */
};
me->foo = 0U;
return QM_INITIAL(&QMsmTst_s1_, act_); /* QMsm initial transition */
}
~~~~~~~~~

© Quantum Leaps, LLC

5

The constructor is the same as before, except it calls the superclass' ctor QMsm_ctor()
The top-most initial transition handler function requires a transition-action array, which
defines the sequence of actions to execute upon the initial transitions. The generation of
this array is difficult by hand, but it is easy for the QM tool. The transition-action array is
static and const, which means that most compilers will place it in ROM. The array is zeroterminated.
The initial-transition must return through the macro QM_INITIAL().

(c) Quantum Leaps, LLC

5
New Features in QP5

11/08/13

New State Machine Code (cont'd)
static QState QMsmTst_s1_e(QMsmTst * const me) {
/* entry-action function */
BSP_display("s1-ENTRY;");
return QM_ENTRY(&QMsmTst_s1_);
}
/*..........................................................................*/
static QState QMsmTst_s1_x(QMsmTst * const me) {
/* exit-action function */
BSP_display("s1-EXIT;");
return QM_EXIT(&QMsmTst_s1_);
}
/*..........................................................................*/
static QState QMsmTst_s1_i(QMsmTst * const me) {
static QActionHandler const act_[] = { /* transition-action array */
Q_ACTION_CAST(&QMsmTst_s11_e),
Q_ACTION_CAST(&QMsmTst_s11_i),
Q_ACTION_CAST(0)
};
BSP_display("s1-INIT;");
return QM_INITIAL(&QMsmTst_s11_, act_); /* QMsm initial transition */
}

© Quantum Leaps, LLC

6

The entry/exit actions and per-state initial transitions are separate action-handler functions.
These functions are only defined if the given state actually has an entry action, exit action or
an initial transition.
The per-state initial transition is coded identically to the top-most initial transition

(c) Quantum Leaps, LLC

6
New Features in QP5

11/08/13

New State Machine Code (cont'd)
QMsmTst_s1(QMsmTst * const me, QEvt const * const e) { /* state-handler fun. */
QState status_;
switch (e->sig) {
case A_SIG: {
static QActionHandler const act_[] = { /* transition-action array */
Q_ACTION_CAST(&QMsmTst_s1_x),
Q_ACTION_CAST(&QMsmTst_s2_e),
Q_ACTION_CAST(0)
};
BSP_display("s1-A;");
status_ = QM_TRAN(&QMsmTst_s2_, act_);
break;
}
case I_SIG: {
BSP_display("s1-I;");
status_ = QM_HANDLED();
break;
}
default: {
status_ = QM_SUPER();
break;
}
}
return status_;
}

© Quantum Leaps, LLC

7

The state-handler function handles only the explicit events, but it does not handle the
special “events” Q_ENTRY_SIG, Q_EXIT_SIG, or Q_INIT_SIG.
Every transition requires its own transition-action array.

(c) Quantum Leaps, LLC

7
New Features in QP5

11/08/13

Course Outline
•Enable QM to generate new type of SM code
•Provide “hooks” for customization (virtual functions)
Provide virtual functions
•Multiple system clock tick rates
•Non-asserting event allocation and posting
•Kernel-Unaware Interrupts for ARM Cortex-M3/M4
•Quick Summary of Other Changes

© Quantum Leaps, LLC

8

QP5 introduces polymorphism (virtual functions) for most important operations within the
framework, such as state machine init() and dispatch() and active object start(), post(), and
postLIFO() operations. Making theses functions "virtual" means that all these operations
can be re-defined in subclasses of state machines and active objects.

(c) Quantum Leaps, LLC

8
New Features in QP5

11/08/13

Virtual Functions (Polymorphism) in C
::QMsm
vptr : QMsmVtbl
state : QMAttr
temp : QMAttr

::QHsm
vptr : QMsmVtbl
state : QMAttr
temp : QMAttr

::QMsmVtbl
init(e : QEvt const *)
dispatch(e : QEvt const *)

QMsm_init()
QMsm_dispatch()

::QHsmVtbl
init(e : QEvt const *)
dispatch(e : QEvt const *)

QHsm_init()

QHsm_dispatch()

#define QMSM_INIT(me_, e_)
((*(me_)->vptr->init)((me_), (e_)))
#define QMSM_DISPATCH(me_, e_) ((*(me_)->vptr->dispatch)((me_), (e_)))

© Quantum Leaps, LLC

9

QP5 provides virtual functions for the important framework operations.
The QMsm base class provides the standard vptr->vtable constructs, which make up an
indirection level for calling functions, as implemented in the macros QMSM_INIT() and
QMSM_DISPATCH().
****
NOTE: You don't need to know exactly how polymorphism is implemented in C to take
advantage of the provided “virtual hooks”. Just call the respective operations using the
macros, such as QMSM_INIT() or QMSM_DISPATCH() rather than the specific
implementations, such as QMsm_init() or QHsm_dispatch().
****
The vptr is initialized in the QMsm constructor, but each subclass of QMsm (direct or
transitive) has an opportunity to define its own virtual table with different implementations
and hook the vptr to this table.
The QP5 framework invokes the operations init() and dispatch() only via the macros
QMSM_INIT() and QMSM_DISPATCH(), which means that these “hooks” are in place for
customization in subclasses.

(c) Quantum Leaps, LLC

9
New Features in QP5

11/08/13

The QActive and QMActive Classes
QMsm
vptr : QMsmVtbl
state : QMAttr
temp : QMAttr

QActive

init(e : QEvt const *)
dispatch(e : QEvt const *)

start(...)
post(e : QEvt const *)
postLIFO(e : QEvt const *)

QHsm

QMActive

init(e : QEvt const *)
dispatch(e : QEvt const *)

init(e : QEvt const *)
dispatch(e : QEvt const *)

Inherits QHsm_init() and
QHsm_dispatch() implementations
Base class for active objects
based on QHsm.

Overrides init() and dispatch() to
use QMsm implementations
Base class for active objects
based on QMsm.

#define QACTIVE_START(me_,...) ((*((QActiveVtbl const *)((me_)->super.vptr))->start)
((me_),...))
#define QACTIVE_POST(me_, e_) ((*((QActiveVtbl const *)((me_)->super.vptr))->post)
((me_), (e_), (uint8_t)0, (sender_)))
#define QACTIVE_POST_LIFO(me_, e_) ...

© Quantum Leaps, LLC

10

The QActive class in QP5 extends the vtable inherited from QMsm by adding virtual
functions for the start(), post(), and postLIFO() operations. The polymorphic way of invoking
these operations is provided my means of the macros QACTIVE_START(),
QACTIVE_POST(), and QACTIVE_POST_LIFO(), respectively.
****
NOTE: The macros QACTIVE_START(), QACTIVE_POST(), and QACTIVE_POST_LIFO()
are the recommended way of calling the respective operations. You should avoid calling
the specific implementations directly (e.g., QActive_start(), QActive_post()).
****
The QMActive class inherits all these operations from QActive, but it overrides the init() and
dispatch() operations to use the implementation from the QMsm base class.

(c) Quantum Leaps, LLC

10
New Features in QP5

11/08/13

Course Outline
•Enable QM to generate new type of SM code
•Provide “hooks” for customization (virtual functions)
•Multiple system clock tick rates
Multiple system clock rates
•Non-asserting event allocation and posting
•Kernel-Unaware Interrupts for ARM Cortex-M3/M4
•Quick Summary of Other Changes

© Quantum Leaps, LLC

11

QP5 supports multiple, independent system clock tick rates for time events. The number of
system tick rates can be now configured in the QP/C ports. For example, a digital watch can
use a "fast" clock tick rate of 100Hz and a "slow" clock tick rate of only 1Hz. These clock tick
rates can be managed independently, so for example, the fast clock tick rate can be shut
down in the absence of time events assigned to this rate. This feature allows the
applications to implement sophisticated power-saving policies.

(c) Quantum Leaps, LLC

11
New Features in QP5

11/08/13

Multiple Clock Tick Rates
/* clock tick rate driven by an interrupt */
void SysTick_Handler(void) {
QF_TICK_X(0U, &SysTick_Handler); /* rate 0 */
}
~~~~
/* clock tick rate driven by a task (active object) */
static QState MyAO_state1(MyAO * const me, QEvt const * const e) {
QState status_;
switch (e->sig) {
case SLOW_TICK_SIG:
QF_TICK_X(1U, me); /* rate 1 */
status_ = Q_HANDLED();
break;
}
~~~
}
return status_;
}
~~~~
/* idle processing */
void QF_onIdle()/QK_onIdle() {
~~~~
/* within a critical section... */
if (QF_noTimeEvtsActiveX(0U)) { /* no time evts at rate 0? */
/* shut down ticker for rate 0 */
}
if (QF_noTimeEvtsActiveX(1U)) { /* no time evts at rate 1? */
/* shut down ticker for rate 1 */
}
~~~~
© Quantum Leaps, LLC
}

12

QP5 adds support for multiple system clock tick rates. The number of system tick rates can
be now configured in the QP/C ports by defining the macro QF_MAX_TICK_RATE (default
value is 1 rate).
To support this, QP5 adds an “extended” tick handler QF_tickX(tickRate), which takes the
tickRate argument. The QF_tickX() function has been carefully designed to be callable from
ISR and from the task level, including low-priority tasks.
****
NOTE: The recommended way of calling QF_tickX() is through the macro QF_TICK_X(rate,
sender), which supplies the sender of the tick for QS software tracing.
****
Every tick rate can be managed independently from the other rates, meaning that a given
rate n can be shut-down (the corresponding QF_tickX(n) can be stopped being called) while
other rates can continue. Shutting down a tick rate is recommended only if there are no
active time events assigned to this rate. The new API QF_noTimeEvtsActiveX(rate) is
provided to test for this. This function must be called from within a critical section.

(c) Quantum Leaps, LLC

12
New Features in QP5

11/08/13

New API for Time Events
/* "extended" time event constructor */
void MyAO_ctor(MyAO * const me) {
QActive_ctor(&me->super, Q_STATE_CAST(&MyAO_initial));
QTimeEvt_ctorX(&me->timeEvt, &me->super, TIMEOUT_SIG, 0U);
}
~~~~
static QState MyAO_state1(MyAO * const me, QEvt const * const e) {
switch (e->sig) {
case Q_ENTRY_SIG: {
/* one-shot time event */
TimeEvt_armX(&me->timeEvt, BSP_TICKS_PER_SEC/5, 0U);
~~~
}
case Q_EXIT_SIG: {
TimeEvt_disarm(&me->timeEvt);
~~~
}
~~~
}
}
~~~~
static QState MyAO_state2(MyAO * const me, QEvt const * const e) {
switch (e->sig) {
case Q_ENTRY_SIG: {
/* periodic time event */
TimeEvt_armX(&me->timeEvt,
BSP_TICKS_PER_SEC/10, BSP_TICKS_PER_SEC/5);
~~~
}
© Quantum Leaps, LLC
~~~~

13

The new “extended” TimeEvt constructor takes the active object, signal, and tick-rate.
void QTimeEvt_ctorX(QTimeEvt * const me, QActive *me, enum_t sig, uint8_t tickRate);
****
NOTE: this constructor assigns a time event to a given active object and a given tick rate.
****
The “extended” arm operation serves both one-shot and periodic time events:
void QTimeEvt_armX(QTimeEvt * const me, QTimeEvtCtr nTicks, QTimeEvtCtr interval);
Assigning 0-interval arms a one-shot time event. A non-zero interval arms a periodic time
event. The first period and the interval could be different, which helps adjust the phasing of
periodic time events on the first arm operation.

(c) Quantum Leaps, LLC

13
New Features in QP5

11/08/13

New Implementation of TimeEvts
QF_timeEvtHead_[0]::QTimeEvt
super: QEvt
next : QTimeEvt*
act : void*
ctr : QTimeEvtCtr
interval : QTimeEvtCtr

::QTimeEvt
super: QEvt
next : QTimeEvt*
act : void*
ctr : QTimeEvtCtr
interval : QTimeEvtCtr

::QTimeEvt
super: QEvt
next : QTimeEvt*
act : void*
ctr : QTimeEvtCtr
interval : QTimeEvtCtr

NULL

::QTimeEvt
Tick [0] 0 head
Rateratehead
Newly armed
time events
Tick rate 1 head

super: QEvt
next : QTimeEvt*
act : void*
ctr : QTimeEvtCtr
interval : QTimeEvtCtr

...

NULL

QF_timeEvtHead_[1]::QTimeEvt
super: QEvt
next : QTimeEvt*
act : void*
ctr : QTimeEvtCtr
interval : QTimeEvtCtr

...

NULL

© Quantum Leaps, LLC

14

QP5 provides a low-latency implementation of QF_tickX(), and QTimeEvt_*() operations.
The QF_tickX() can also be called from low-priority tasks, which means that it can be
preempted and must handle correctly arming/disarming of time events during preemption.
This is achieved by implementing the following rules:
1. Only QF_tickX() function can change the main list of the time events (originating from
QF_timeEvtHead[n].next pointer).
2. Disarming of a time event does not remove it from the list, it merely marks the time event
for removal.
3. Arming a time event does not add it to the main list. Instead, arming a time event adds a
time event to the “newly armed” list, based on the QF_timeEvtHead[n].act pointer (reused
here as a link pointer).
4. The QF_tickX() function appends the “newly armed” list atomically to the main list, so
that rule #1 is not violated.

(c) Quantum Leaps, LLC

14
New Features in QP5

11/08/13

Course Outline
•Enable QM to generate new type of SM code
•Provide “hooks” for customization (virtual functions)
•Multiple system clock tick rates
•Non-asserting event allocation and posting
Non-asserting event allocation and posting
•Kernel-Unaware Interrupts for ARM Cortex-M3/M4
•Quick Summary of Other Changes

© Quantum Leaps, LLC

15

QP5 adds a new "extended" API for non-asserting event allocation and posting. This feature
is intended for situations, when an application is hammered with external events that at
times arrive too fast for processing, but that can be ignored under the overload conditions

(c) Quantum Leaps, LLC

15
New Features in QP5

11/08/13

Non-Asserting Event Allocation
•New macro Q_NEW_X() requires a margin argument
➔

Margin specifies the # free events that must exist in the pool
MyEvt *myevt;
Q_NEW_X(myevt, MyEvt, 5U, MY_EVT_SIG); /* "extended" event allocator */
if (myevt != (MyEvt *)0) {
/* mevt might be NULL; have to test! */
myevt->foo = 123;
myevt->bar = 0xABC;
~~~~
}

© Quantum Leaps, LLC

16

The new “extended” event allocator Q_NEW_X() requires a non-zero margin argument,
which specifies the number of free events in the pool (of the given size) for the allocation to
succeed. If the pool contains less than the margin of events, Q_NEW_X() will set the event
argument to NULL, but it will not assert.
You must always test the event argument for NULL.
****
NOTE: The margin parameter allows you to keep sufficient number of events in the pool for
the “normal” event allocation, which asserts when events are not available.
****
The internal implementation of the native memory pool QMPool_get() operation has been
augmented to take the margin argument.
When the QP port is configured to use “event constructors”, the macro Q_NEW_X() takes
the variadic form and calls the event constructor only when the allocation succeeds.

(c) Quantum Leaps, LLC

16
New Features in QP5

11/08/13

Non-Asserting Event Posting
•New macro QACTIVE_POST_X() requires margin argument
Margin specifies the # free events that must exist in the event queue

➔

MyEvt *myevt;
Q_NEW_X(myevt, MyEvt, 5U, MY_EVT_SIG); /* "extended" event allocator */
if (myevt != (MyEvt *)0) {
/* mevt might be NULL; have to test! */
myevt->foo = 123;
myevt->bar = 0xABC;
~~~~
/* "extended" event posting */
if (QACTIVE_POST_X(AO_myAO, &myevt->super, 3U, me)) {
/* event posted successfully */
}
else {
/* event NOT posted */
}
}

© Quantum Leaps, LLC

17

The new “extended” event posting QACTIVE_POST_X() requires a non-zero margin
argument, which specifies the number of free events in the event queue for the posting to
succeed. If the queue contains less than the margin of free events, QACTIVE_POST_X()
will not post the event and it will return 0 (FALSE), but it will not assert.
*****
NOTE: The margin parameter allows you to keep sufficient number of free entries in the
queue for the “normal” event posting, which asserts when the queue overflows.
*****
The QActive_post() operation has been augmented to take the margin argument and return
the status. The operation asserts if the margin is zero and the posting cannot succeed.
The non-asserting event posting is not available for time events or for publishing events.
*****
NOTE: This non-asserting event posting should be reserved for special situations and
should be used with caution. The main mechanisms for event allocation and posting should
remain the asserting versions (Q_NEW, QACTIVE_POST, QF_PUBLISH), because they
provide the event-delivery guarantee.
*****

(c) Quantum Leaps, LLC

17
New Features in QP5

11/08/13

Course Outline
•Enable QM to generate new type of SM code
•Provide “hooks” for customization (virtual functions)
•Multiple system clock tick rates
•Non-asserting event allocation and posting
•Kernel-Unaware Interrupts for ARM Cortex-M3/M4
Kernel-Unaware Interrupts for ARM Cortex-M3/M4
•Quick Summary of Other Changes

© Quantum Leaps, LLC

18

The QP 5.1 port to ARM Cortex-M3/M4 never completely disables interrupts, even inside
the critical sections. The highest-priority interrupts (prioritized in the NVIC hardware) that
are never disabled are “unaware” of the real-time kernel and run completely freely (this is
called sometimes “zero interrupt latency”). Such “kernel unaware” interrupts can be useful
for handling very fast (sub microsecond) deadlines, for example quickly re-arming a DMA
channel, fast communication, etc.
****
NOTE: “Kernel-unaware” interrupts cannot call any QP services and specifically they
cannot post events.
****
NOTE: The only way “kernel-unaware” interrupts can communicate with the QP framework
is to trigger a “kernel-aware” interrupt, which can post events to QP.
****

(c) Quantum Leaps, LLC

18
New Features in QP5

11/08/13

Changed Structure of ARM Cortex-M Ports
Renamed port/examples directory to “arm-cm”
● The

previous name “arm-cortex” could be confusing for Cortex-A

Moved the CMSIS directory to “portsarm-cmcmsis”
● Instead of

replicating it in each example project

● Updated CMSIS

to version 3.20

Updated toolset versions, added ARM/Keil to the QP
Baseline code

© Quantum Leaps, LLC

19

The QP 5.1 port to ARM Cortex-M has changed the directory structure to avoid any
confusion with other CPU cores in the ARM Cortex family
CMSIS directory with core CMSIS header files is now inside the ARM Cortex-M port

(c) Quantum Leaps, LLC

19
New Features in QP5

11/08/13

Kernel-Unaware and Kernel-Aware Interrupts
•QP 5.1 port to ARM Cortex-M3/M4 never completely
disables interrupts
Interrupts are disables selectively using the BASEPRI register

➔

Kernel-unaware interrupt

000 00000

Priority for
CMSIS
NVIC_SetPriority(
)
0
Never disabled

Kernel-aware interrupt

001 00000

1 = QF_AWARE_ISR_CMSIS_PRI

Kernel-aware interrupt

010 00000

2

Kernel-aware interrupt

011 00000

3

Kernel-aware interrupt

100 00000

4

Kernel-aware interrupt

101 00000

5

Kernel-aware interrupt

110 00000

6

PendSV interrupt for QK

111 00000

7

Interrupt type

NVIC priority bits

Disabled
in critical
sections

Should not be used
for regular
interrupts

Only Kernel-Aware Interrupts
are allowed to call QP services!
© Quantum Leaps, LLC

20

The QP 5.1 port to ARM Cortex-M3/M4 never completely disables interrupts, even inside
the critical sections. On Cortex-M3/M4 (ARMv7-M architectures), the QP port disables
interrupts selectively using the BASEPRI register.
As shown in the picture, this policy divides interrupts into “kernel-unaware” interrupts,
which are never disabled, and “kernel-aware” interrupts, which are disabled in the QP
critical sections.
****
NOTE: Only “kernel-aware” interrupts are allowed to call QP services. “Kernel-unaware”
interrupts are not allowed to call any QP services and they can communicate with QP
only by triggering a “kernel-aware” interrupt (which can post or publish events).
*****
NOTE: The number of interrupt priority bits in the NVIC is “implementation dependent”,
meaning that various silicon vendors can provide different number of bits. The minimum
number of bits is 3, as shown in the picture.
*****
INFO: The BASEPRI register is not implemented in the ARMv6-M architecture (CortexM0/M0+), so Cortex-M0/M0+ need to use the PRIMASK register to disable interrupts
globally. In other words, in Cortex-M0/M0+ ports, all interrupts are “kernel-aware”.

(c) Quantum Leaps, LLC

20
New Features in QP5

11/08/13

Assigning ARM Cortex-M Interrupt Priorities
/*!!!!!!!!!!!!!!!!!!!!!!!!!!!! CAUTION !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
* Assign a priority to EVERY ISR explicitly by calling NVIC_SetPriority().
* DO NOT LEAVE THE ISR PRIORITIES AT THE DEFAULT VALUE!
*/
enum KernelUnawareISRs {
/* see NOTE00 */
/* ... */
MAX_KERNEL_UNAWARE_CMSIS_PRI
/* keep always last */
};
/* "kernel-unaware" interrupts can't overlap "kernel-aware" interrupts */
Q_ASSERT_COMPILE(MAX_KERNEL_UNAWARE_CMSIS_PRI <= QF_AWARE_ISR_CMSIS_PRI);
enum KernelAwareISRs {
/* see NOTE00 */
GPIOPORTA_PRIO = QF_AWARE_ISR_CMSIS_PRI,
ADCSEQ3_PRIO,
SYSTICK_PRIO,
/* ... */
MAX_KERNEL_AWARE_CMSIS_PRI
/* keep always last */
};
/* "kernel-aware" interrupts should not overlap the PendSV priority */
Q_ASSERT_COMPILE(MAX_KERNEL_AWARE_CMSIS_PRI
<= (0xFF >>(8-__NVIC_PRIO_BITS)));

© Quantum Leaps, LLC

21

The enumeration KernelUnawareISRs lists the priority numbers for the “kernel-unaware”
interrupts. These priorities start with zero (highest possible). The priorities are suitable as
the argument for the NVC_SetPriority() CMSIS function.
*****
NOTE: The NVIC allows you to assign the same priority level to multiple interrupts, so you
can have more ISRs than priority levels running as “kernel-unaware” or “kernel-aware”
interrupts.
******
* The last value in the enumeration MAX_KERNEL_UNAWARE_CMSIS_PRI keeps track of
the maximum priority used for a “kernel-unaware” interrupt.
* The compile-time assertion ensures that the “kernel-unaware” interrupt priorities do not
overlap the “kernel-aware” interrupts, which start at QF_AWARE_ISR_CMSIS_PRI.
* The enumeration KernelAwareISRs lists the priority numbers for the “kernel-aware”
interrupts.
* The “kernel-aware” interrupt priorities start with the QF_AWARE_ISR_CMSIS_PRI offset,
which is provided in the qf_port.h header file.
* The last value in the enumeration MAX_KERNEL_AWARE_CMSIS_PRI keeps track of
the maximum priority used for a “kernel-aware” interrupt.
* The compile-time assertion ensures that the “kernel-aware” interrupt priorities do not
overlap the lowest priority level reserved for the PendSV exception.

(c) Quantum Leaps, LLC

21
New Features in QP5

11/08/13

Setting ARM Cortex-M Interrupt Priorities
void QF_onStartup(void) {
/* set up the SysTick timer to fire at BSP_TICKS_PER_SEC rate */
SysTick_Config(SystemFrequency / BSP_TICKS_PER_SEC);
/* assing all priority bits for preemption-pri. and none to sub-pri. */
NVIC_SetPriorityGrouping(0U);
/* set priorities of ALL ISRs used in the system, see NOTE00
*
* !!!!!!!!!!!!!!!!!!!!!!!!! CAUTION !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
* Assign a priority to EVERY ISR by calling NVIC_SetPriority().
* DO NOT LEAVE THE ISR PRIORITIES AT THE DEFAULT VALUE!
*/
NVIC_SetPriority(ADCSeq3_IRQn,
ADCSEQ3_PRIO);
NVIC_SetPriority(SysTick_IRQn,
SYSTICK_PRIO);
/* ... */
/* enable IRQs... */
NVIC_EnableIRQ(ADCSeq3_IRQn);
NVIC_EnableIRQ(GPIOPortA_IRQn);
}

© Quantum Leaps, LLC

22

The QF_onStartup() callback function is where you set up the interrupts.
* The CMIS function NVIC_SetPriorityGrouping() assigns all the priority bits to be preempt
priority bits, leaving no priority bits as subpriority bits to preserve the direct relationship
between the interrupt priorities and the ISR preemption rules. This is the default
configuration out of reset for the ARM Cortex-M3/M4 cores, but it can be changed by some
vendor-supplied startup code. To avoid any surprises, the call to
NVIC_SetPriorityGrouping(0U) is recommended.
* The interrupt priories fall all interrupts (“kernel-unaware” and “kernel-aware” alike) are set
explicitly by calls to the CMSIS function NVIC_SetPriority().
* All used IRQ interrupts need to be explicitly enabled by calling the CMSIS function
NVIC_EnableIRQ().

(c) Quantum Leaps, LLC

22
New Features in QP5

11/08/13

Course Outline
•Enable QM to generate new type of SM code
•Provide “hooks” for customization (virtual functions)
•Multiple system clock tick rates
•Non-asserting event allocation and posting
•Kernel-Unaware Interrupts for ARM Cortex-M3/M4
•Quick Summaryof Other Changes
Quick Summary of Other Changes

© Quantum Leaps, LLC

23

QP5 provides also a number of smaller features and enhancements

(c) Quantum Leaps, LLC

23
New Features in QP5

11/08/13

QS/QSPY Updates
QS updates to generate new information
●

QS_QF_TICK, QS_QF_TIME_EVT_* records send tick rate byte

● New

trace records for failed event allocation/posting:
QS_QF_ACTIVE_POST_ATTEMPT, QS_MPOOL_GET_ATTEMPT

● New

trace records for unit testing: QS_TEST_RUN, QS_TEST_FAIL

Dictionary records generate less code by using functions
● Added

new source file qs_dict.c with QS_*_dict() functions

More efficient QS code by grouping attributes into struct

© Quantum Leaps, LLC

24

QS/QSPY software tracing required updating to accommodate the new features.
Also the size of the QS tracing instrumentation and its performance have been improved.

(c) Quantum Leaps, LLC

24
New Features in QP5

11/08/13

Documentation/Examples
Added simple “Blinky” example requested by users
● For Windows,

Linux, ARM Cortex-M with GNU, IAR, and Keil

Added “Getting Started with QP” guide in PDF
● Instead of

replicating it in each example project

Updated Doxygen documentation
● Updated the

code examples and missing references

● HTML documentation

has the left-side summary panel and its

own search box

© Quantum Leaps, LLC

(c) Quantum Leaps, LLC

25

25

More Related Content

What's hot

Project report of ustos
Project report of ustosProject report of ustos
Project report of ustosMurali Mc
 
Understanding Hardware Transactional Memory
Understanding Hardware Transactional MemoryUnderstanding Hardware Transactional Memory
Understanding Hardware Transactional MemoryC4Media
 
Concurrent programming with RTOS
Concurrent programming with RTOSConcurrent programming with RTOS
Concurrent programming with RTOSSirin Software
 
Process synchronization in Operating Systems
Process synchronization in Operating SystemsProcess synchronization in Operating Systems
Process synchronization in Operating SystemsRitu Ranjan Shrivastwa
 
A synchronous scheduling service for distributed real-time Java
A synchronous scheduling service for distributed real-time JavaA synchronous scheduling service for distributed real-time Java
A synchronous scheduling service for distributed real-time JavaUniversidad Carlos III de Madrid
 
Operating systems question bank
Operating systems question bankOperating systems question bank
Operating systems question bankanuradha raheja
 
Java Core | Modern Java Concurrency | Martijn Verburg & Ben Evans
Java Core | Modern Java Concurrency | Martijn Verburg & Ben EvansJava Core | Modern Java Concurrency | Martijn Verburg & Ben Evans
Java Core | Modern Java Concurrency | Martijn Verburg & Ben EvansJAX London
 
Real Time Operating System Concepts
Real Time Operating System ConceptsReal Time Operating System Concepts
Real Time Operating System ConceptsSanjiv Malik
 
Slides for a talk on UML Semantics in Nuremberg in 2005
Slides for a talk on UML Semantics in Nuremberg in 2005Slides for a talk on UML Semantics in Nuremberg in 2005
Slides for a talk on UML Semantics in Nuremberg in 2005Alin Stefanescu
 

What's hot (16)

FreeRTOS introduction
FreeRTOS introductionFreeRTOS introduction
FreeRTOS introduction
 
Project report of ustos
Project report of ustosProject report of ustos
Project report of ustos
 
Understanding Hardware Transactional Memory
Understanding Hardware Transactional MemoryUnderstanding Hardware Transactional Memory
Understanding Hardware Transactional Memory
 
The Java Memory Model
The Java Memory ModelThe Java Memory Model
The Java Memory Model
 
Transactional Memory
Transactional MemoryTransactional Memory
Transactional Memory
 
Concurrent programming with RTOS
Concurrent programming with RTOSConcurrent programming with RTOS
Concurrent programming with RTOS
 
S emb t11-processes
S emb t11-processesS emb t11-processes
S emb t11-processes
 
Process synchronization in Operating Systems
Process synchronization in Operating SystemsProcess synchronization in Operating Systems
Process synchronization in Operating Systems
 
FreeRTOS Course - Queue Management
FreeRTOS Course - Queue ManagementFreeRTOS Course - Queue Management
FreeRTOS Course - Queue Management
 
A synchronous scheduling service for distributed real-time Java
A synchronous scheduling service for distributed real-time JavaA synchronous scheduling service for distributed real-time Java
A synchronous scheduling service for distributed real-time Java
 
Operating systems question bank
Operating systems question bankOperating systems question bank
Operating systems question bank
 
Java Core | Modern Java Concurrency | Martijn Verburg & Ben Evans
Java Core | Modern Java Concurrency | Martijn Verburg & Ben EvansJava Core | Modern Java Concurrency | Martijn Verburg & Ben Evans
Java Core | Modern Java Concurrency | Martijn Verburg & Ben Evans
 
Java 7 & 8
Java 7 & 8Java 7 & 8
Java 7 & 8
 
Real Time Operating System Concepts
Real Time Operating System ConceptsReal Time Operating System Concepts
Real Time Operating System Concepts
 
Slides for a talk on UML Semantics in Nuremberg in 2005
Slides for a talk on UML Semantics in Nuremberg in 2005Slides for a talk on UML Semantics in Nuremberg in 2005
Slides for a talk on UML Semantics in Nuremberg in 2005
 
Realtime
RealtimeRealtime
Realtime
 

Similar to New Features in QP5

Chap 6 lesson5emsysnewstatemachinefsm
Chap 6 lesson5emsysnewstatemachinefsmChap 6 lesson5emsysnewstatemachinefsm
Chap 6 lesson5emsysnewstatemachinefsmchandrika
 
Building a QT based solution on a i.MX7 processor running Linux and FreeRTOS
Building a QT based solution on a i.MX7 processor running Linux and FreeRTOSBuilding a QT based solution on a i.MX7 processor running Linux and FreeRTOS
Building a QT based solution on a i.MX7 processor running Linux and FreeRTOSFernando Luiz Cola
 
RTI-CODES+ISSS-2012-Submission-1
RTI-CODES+ISSS-2012-Submission-1RTI-CODES+ISSS-2012-Submission-1
RTI-CODES+ISSS-2012-Submission-1Serge Amougou
 
LCA14: LCA14-412: GPGPU on ARM SoC session
LCA14: LCA14-412: GPGPU on ARM SoC sessionLCA14: LCA14-412: GPGPU on ARM SoC session
LCA14: LCA14-412: GPGPU on ARM SoC sessionLinaro
 
RTOS implementation
RTOS implementationRTOS implementation
RTOS implementationRajan Kumar
 
[Capella Day 2019] Model execution and system simulation in Capella
[Capella Day 2019] Model execution and system simulation in Capella[Capella Day 2019] Model execution and system simulation in Capella
[Capella Day 2019] Model execution and system simulation in CapellaObeo
 
Model Execution and System Simulation
Model Execution and System SimulationModel Execution and System Simulation
Model Execution and System SimulationObeo
 
Simulation with Python and MATLAB® in Capella
Simulation with Python and MATLAB® in CapellaSimulation with Python and MATLAB® in Capella
Simulation with Python and MATLAB® in CapellaObeo
 
淺談 Live patching technology
淺談 Live patching technology淺談 Live patching technology
淺談 Live patching technologySZ Lin
 
Kct guidev3p0
Kct guidev3p0Kct guidev3p0
Kct guidev3p0aanchal19
 
DevOps Fest 2020. Дмитрий Кудрявцев. Реализация GitOps на Kubernetes. ArgoCD
DevOps Fest 2020. Дмитрий Кудрявцев. Реализация GitOps на Kubernetes. ArgoCDDevOps Fest 2020. Дмитрий Кудрявцев. Реализация GitOps на Kubernetes. ArgoCD
DevOps Fest 2020. Дмитрий Кудрявцев. Реализация GitOps на Kubernetes. ArgoCDDevOps_Fest
 
Easy enterprise application integration with RabbitMQ and AMQP
Easy enterprise application integration with RabbitMQ and AMQPEasy enterprise application integration with RabbitMQ and AMQP
Easy enterprise application integration with RabbitMQ and AMQPRabbit MQ
 
WMQ Toolbox: 20 Scripts, One-liners, & Utilities for UNIX & Windows
WMQ Toolbox: 20 Scripts, One-liners, & Utilities for UNIX & Windows WMQ Toolbox: 20 Scripts, One-liners, & Utilities for UNIX & Windows
WMQ Toolbox: 20 Scripts, One-liners, & Utilities for UNIX & Windows T.Rob Wyatt
 
Ibm mq c luster overlap demo script
Ibm mq c luster overlap demo scriptIbm mq c luster overlap demo script
Ibm mq c luster overlap demo scriptsarvank2
 
File Processing - Process Execution Solution
File Processing - Process Execution SolutionFile Processing - Process Execution Solution
File Processing - Process Execution SolutionAbimael Desales López
 
File Processing - Batch Process Execution
File Processing - Batch Process ExecutionFile Processing - Batch Process Execution
File Processing - Batch Process ExecutionAbimael Desales López
 
Jvm Performance Tunning
Jvm Performance TunningJvm Performance Tunning
Jvm Performance Tunningguest1f2740
 

Similar to New Features in QP5 (20)

Chap 6 lesson5emsysnewstatemachinefsm
Chap 6 lesson5emsysnewstatemachinefsmChap 6 lesson5emsysnewstatemachinefsm
Chap 6 lesson5emsysnewstatemachinefsm
 
QEMU-SystemC (FDL)
QEMU-SystemC (FDL)QEMU-SystemC (FDL)
QEMU-SystemC (FDL)
 
Building a QT based solution on a i.MX7 processor running Linux and FreeRTOS
Building a QT based solution on a i.MX7 processor running Linux and FreeRTOSBuilding a QT based solution on a i.MX7 processor running Linux and FreeRTOS
Building a QT based solution on a i.MX7 processor running Linux and FreeRTOS
 
RTI-CODES+ISSS-2012-Submission-1
RTI-CODES+ISSS-2012-Submission-1RTI-CODES+ISSS-2012-Submission-1
RTI-CODES+ISSS-2012-Submission-1
 
PhD Slides
PhD SlidesPhD Slides
PhD Slides
 
LCA14: LCA14-412: GPGPU on ARM SoC session
LCA14: LCA14-412: GPGPU on ARM SoC sessionLCA14: LCA14-412: GPGPU on ARM SoC session
LCA14: LCA14-412: GPGPU on ARM SoC session
 
RTOS implementation
RTOS implementationRTOS implementation
RTOS implementation
 
[Capella Day 2019] Model execution and system simulation in Capella
[Capella Day 2019] Model execution and system simulation in Capella[Capella Day 2019] Model execution and system simulation in Capella
[Capella Day 2019] Model execution and system simulation in Capella
 
Model Execution and System Simulation
Model Execution and System SimulationModel Execution and System Simulation
Model Execution and System Simulation
 
Simulation with Python and MATLAB® in Capella
Simulation with Python and MATLAB® in CapellaSimulation with Python and MATLAB® in Capella
Simulation with Python and MATLAB® in Capella
 
淺談 Live patching technology
淺談 Live patching technology淺談 Live patching technology
淺談 Live patching technology
 
Kct guidev3p0
Kct guidev3p0Kct guidev3p0
Kct guidev3p0
 
DevOps Fest 2020. Дмитрий Кудрявцев. Реализация GitOps на Kubernetes. ArgoCD
DevOps Fest 2020. Дмитрий Кудрявцев. Реализация GitOps на Kubernetes. ArgoCDDevOps Fest 2020. Дмитрий Кудрявцев. Реализация GitOps на Kubernetes. ArgoCD
DevOps Fest 2020. Дмитрий Кудрявцев. Реализация GitOps на Kubernetes. ArgoCD
 
Project02 wit
Project02 witProject02 wit
Project02 wit
 
Easy enterprise application integration with RabbitMQ and AMQP
Easy enterprise application integration with RabbitMQ and AMQPEasy enterprise application integration with RabbitMQ and AMQP
Easy enterprise application integration with RabbitMQ and AMQP
 
WMQ Toolbox: 20 Scripts, One-liners, & Utilities for UNIX & Windows
WMQ Toolbox: 20 Scripts, One-liners, & Utilities for UNIX & Windows WMQ Toolbox: 20 Scripts, One-liners, & Utilities for UNIX & Windows
WMQ Toolbox: 20 Scripts, One-liners, & Utilities for UNIX & Windows
 
Ibm mq c luster overlap demo script
Ibm mq c luster overlap demo scriptIbm mq c luster overlap demo script
Ibm mq c luster overlap demo script
 
File Processing - Process Execution Solution
File Processing - Process Execution SolutionFile Processing - Process Execution Solution
File Processing - Process Execution Solution
 
File Processing - Batch Process Execution
File Processing - Batch Process ExecutionFile Processing - Batch Process Execution
File Processing - Batch Process Execution
 
Jvm Performance Tunning
Jvm Performance TunningJvm Performance Tunning
Jvm Performance Tunning
 

Recently uploaded

Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxLoriGlavin3
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Alkin Tezuysal
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demoHarshalMandlekar2
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality AssuranceInflectra
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPathCommunity
 
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesAssure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesThousandEyes
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesKari Kakkonen
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsRavi Sanghani
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesThousandEyes
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersRaghuram Pandurangan
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch TuesdayIvanti
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfNeo4j
 

Recently uploaded (20)

Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demo
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to Hero
 
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesAssure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examples
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and Insights
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information Developers
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch Tuesday
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdf
 

New Features in QP5

  • 1. New Features in QP5 11/08/13 New Features in QP5 © Quantum Leaps, LLC This presentation highlights the new features in the new QP5 milestone release. What is it? QP™ is a family of lightweight, open source software frameworks for building responsive and modular real-time embedded applications as systems of cooperating, event-driven active objects (actors). The QP™ family consists of QP/C, QP/C++, and QP-nano frameworks, which are all strictly quality controlled, superbly documented, and commercially licensable. Where does it run? All QP™ frameworks can run on "bare-metal" single-chip microcontrollers, completely replacing a traditional Real-Time Operating System (RTOS). Ports and ready-to-use examples are provided for most major CPU families. QP/C and QP/C++ can also work with a traditional OS/RTOS, such as: POSIX (Linux, embedded Linux, QNX, INTEGRITY), Win32 (Windows, Windows embedded, Windows CE), ThreadX, MicroC/OS, etc. How does it handle behavior? The behavior of active objects is specified in QP by means of hierarchical state machines (UML statecharts). The frameworks support manual coding of UML state machines in C or C++ as well as fully automatic code generation by means of the free graphical QM™ modeling tool. Who is using it? The QP frameworks are used in millions of products worldwide in aerospace, robotics, consumer electronics, wired and wireless telecommunications, industrial automation, transportation, and many more. The QP™ frameworks and the QM™ modeling tool receive over 30,000 downloads a year (not even counting downloads of QP ports). (c) Quantum Leaps, LLC 1
  • 2. New Features in QP5 11/08/13 Course Outline Enable QM generate new type of of code •Enable QM toto generate new type SMSM code •Provide “hooks” for customization (virtual functions) •Multiple system clock tick rates •Non-asserting event allocation and posting •Kernel-Unaware Interrupts for ARM Cortex-M3/M4 •Quick Summary of Other Changes QP5 remains backwards-compatible with existing QP4 applications (except ISR priorities in ARM Cortex-M3/M4) © Quantum Leaps, LLC 2 The main purpose of this milestone QP5 release is to enable the QM modeling tool to generate a new type of state machine code (requires QM version 3). Specifically, QM can generate the complete transition-sequences (sequences of exit/entry/initial actions) at code-generation time instead of discovering the transitionsequences at run-time. This requires a different (much simpler) event processor than the one provided in the QHsm class. QP5 provides such new event processor in the new class QMsm. NOTE: QP5 5.1 remains backwards-compatible with the existing QP 4.x applications, except the ARM Cortex-M applications need to adjust the interrupt priorities. Specifically, you need to set the interrupt priorities equal or lower than QF_AWARE_ISR_CMSIS_PRI constant provided in the qf_port.h header file. (c) Quantum Leaps, LLC 2
  • 3. New Features in QP5 11/08/13 The new QMsm Base Class QMsm For “virtual” functions in C New state machine implementation vptr : QMsmVtbl state : QMAttr temp : QMAttr MyMsm init(e : QEvt const *) dispatch(e : QEvt const *) QFsm QHsm init(e : QEvt const *) dispatch(e : QEvt const *) init(e : QEvt const *) dispatch(e : QEvt const *) Subclass of QMsm Uses new implementation MyHsm Old state machine implementation © Quantum Leaps, LLC Subclass of QHsm Uses old implementation 3 The new type of state machine implementation in QP5 is based on the new QMsm class, which takes advantage of the QM tool as an advanced "state machine compiler". The QMsm class provides the new implementation of the init() and dispatch() functions. QMsm provides also the virtual pointer, which enables polymorphism (late binding). Coding state machines based on QMsm requires the assistance of the QM tool to generate the complete transition-sequences (sequences of exit/entry/initial actions) at codegeneration time. The resulting code can be still highly human-readable, but it will no longer be human-maintainable. The lab tests indicate that the new "housekeeping" code for executing hierarchical state machines can be about twice as fast as the previous code based on the QHsm class. Additionally, the new code requires less run-time support (smaller event processor) and uses 70% less of stack space in the call to the QMsm_dispatch() operation than QHsm_dispatch(). (c) Quantum Leaps, LLC 3
  • 4. New Features in QP5 11/08/13 New State Machine Code typedef struct QMsmTstTag { QMsm super; /* inherits QMsm */ uint8_t foo; /* some attributes */ } QMsmTst; void QMsmTst_ctor(void); static QState QMsmTst_initial(QMsmTst * const me); static QMState const QMsmTst_s1_ = { (QMState const )0, /* the superstate (NULL==top) */ Q_STATE_CAST(&QMsmTst_s1), /* state-handler function */ Q_ACTION_CAST(&QMsmTst_s1_x) /* state-exit action (if present) */ }; static QState QMsmTst_s1(QMsmTst * const me, QEvt const * const e); static QState QMsmTst_s1_e(QMsmTst * const me); static QState QMsmTst_s1_x(QMsmTst * const me); static QState QMsmTst_s1_i(QMsmTst * const me); static QMState const QMsmTst_s11_ = { &QMsmTst_s1_, /* the superstate */ Q_STATE_CAST(&QMsmTst_s11), /* state-handler function */ Q_ACTION_CAST(&QMsmTst_s11_x) /* state-exit action (if present) */ }; static QState QMsmTst_s11(QMsmTst * const me, QEvt const * const e); static QState QMsmTst_s11_e(QMsmTst * const me); static QState QMsmTst_s11_x(QMsmTst * const me); static QState QMsmTst_s11_i(QMsmTst * const me); ~~~~~~~~~ © Quantum Leaps, LLC 4 **** NOTE: The new state machine code is not intended to be written manually. This code is generated automatically by the QM tool from the state diagram. The explanation provided here is only intended to help you understand this code structure, so that you can work with it effectively (e.g., inside a traditional source-level debugger). **** Each state is represented as: 1. QMState object (const in ROM) 2. state-handler function 3. optional entry-action function 4. optional exit-action function 5. optional initial-transition function The QMState object provides the information about nesting of the state, the associated state-handler function, and the exit-action function, if present. The state-handler function no longer handles entry/exit/initial transition. The entry/exit/initial transition are handled in separate functions associated with a state. These functions are only defined when needed. (c) Quantum Leaps, LLC 4
  • 5. New Features in QP5 11/08/13 New State Machine Code (cont'd) void QMsmTst_ctor(void) { /* constructor */ QMsmTst *me = &l_msmtst; QMsm_ctor(&me->super, Q_STATE_CAST(&QMsmTst_initial)); } /*..........................................................................*/ static QState QMsmTst_initial(QMsmTst * const me) { /* top-most init.tran. */ static QActionHandler const act_[] = { /* transition-action array */ Q_ACTION_CAST(&QMsmTst_s1_e), /* entry-action function */ Q_ACTION_CAST(&QMsmTst_s1_i), /* initial-tran function */ Q_ACTION_CAST(0) /* zero-terminated */ }; me->foo = 0U; return QM_INITIAL(&QMsmTst_s1_, act_); /* QMsm initial transition */ } ~~~~~~~~~ © Quantum Leaps, LLC 5 The constructor is the same as before, except it calls the superclass' ctor QMsm_ctor() The top-most initial transition handler function requires a transition-action array, which defines the sequence of actions to execute upon the initial transitions. The generation of this array is difficult by hand, but it is easy for the QM tool. The transition-action array is static and const, which means that most compilers will place it in ROM. The array is zeroterminated. The initial-transition must return through the macro QM_INITIAL(). (c) Quantum Leaps, LLC 5
  • 6. New Features in QP5 11/08/13 New State Machine Code (cont'd) static QState QMsmTst_s1_e(QMsmTst * const me) { /* entry-action function */ BSP_display("s1-ENTRY;"); return QM_ENTRY(&QMsmTst_s1_); } /*..........................................................................*/ static QState QMsmTst_s1_x(QMsmTst * const me) { /* exit-action function */ BSP_display("s1-EXIT;"); return QM_EXIT(&QMsmTst_s1_); } /*..........................................................................*/ static QState QMsmTst_s1_i(QMsmTst * const me) { static QActionHandler const act_[] = { /* transition-action array */ Q_ACTION_CAST(&QMsmTst_s11_e), Q_ACTION_CAST(&QMsmTst_s11_i), Q_ACTION_CAST(0) }; BSP_display("s1-INIT;"); return QM_INITIAL(&QMsmTst_s11_, act_); /* QMsm initial transition */ } © Quantum Leaps, LLC 6 The entry/exit actions and per-state initial transitions are separate action-handler functions. These functions are only defined if the given state actually has an entry action, exit action or an initial transition. The per-state initial transition is coded identically to the top-most initial transition (c) Quantum Leaps, LLC 6
  • 7. New Features in QP5 11/08/13 New State Machine Code (cont'd) QMsmTst_s1(QMsmTst * const me, QEvt const * const e) { /* state-handler fun. */ QState status_; switch (e->sig) { case A_SIG: { static QActionHandler const act_[] = { /* transition-action array */ Q_ACTION_CAST(&QMsmTst_s1_x), Q_ACTION_CAST(&QMsmTst_s2_e), Q_ACTION_CAST(0) }; BSP_display("s1-A;"); status_ = QM_TRAN(&QMsmTst_s2_, act_); break; } case I_SIG: { BSP_display("s1-I;"); status_ = QM_HANDLED(); break; } default: { status_ = QM_SUPER(); break; } } return status_; } © Quantum Leaps, LLC 7 The state-handler function handles only the explicit events, but it does not handle the special “events” Q_ENTRY_SIG, Q_EXIT_SIG, or Q_INIT_SIG. Every transition requires its own transition-action array. (c) Quantum Leaps, LLC 7
  • 8. New Features in QP5 11/08/13 Course Outline •Enable QM to generate new type of SM code •Provide “hooks” for customization (virtual functions) Provide virtual functions •Multiple system clock tick rates •Non-asserting event allocation and posting •Kernel-Unaware Interrupts for ARM Cortex-M3/M4 •Quick Summary of Other Changes © Quantum Leaps, LLC 8 QP5 introduces polymorphism (virtual functions) for most important operations within the framework, such as state machine init() and dispatch() and active object start(), post(), and postLIFO() operations. Making theses functions "virtual" means that all these operations can be re-defined in subclasses of state machines and active objects. (c) Quantum Leaps, LLC 8
  • 9. New Features in QP5 11/08/13 Virtual Functions (Polymorphism) in C ::QMsm vptr : QMsmVtbl state : QMAttr temp : QMAttr ::QHsm vptr : QMsmVtbl state : QMAttr temp : QMAttr ::QMsmVtbl init(e : QEvt const *) dispatch(e : QEvt const *) QMsm_init() QMsm_dispatch() ::QHsmVtbl init(e : QEvt const *) dispatch(e : QEvt const *) QHsm_init() QHsm_dispatch() #define QMSM_INIT(me_, e_) ((*(me_)->vptr->init)((me_), (e_))) #define QMSM_DISPATCH(me_, e_) ((*(me_)->vptr->dispatch)((me_), (e_))) © Quantum Leaps, LLC 9 QP5 provides virtual functions for the important framework operations. The QMsm base class provides the standard vptr->vtable constructs, which make up an indirection level for calling functions, as implemented in the macros QMSM_INIT() and QMSM_DISPATCH(). **** NOTE: You don't need to know exactly how polymorphism is implemented in C to take advantage of the provided “virtual hooks”. Just call the respective operations using the macros, such as QMSM_INIT() or QMSM_DISPATCH() rather than the specific implementations, such as QMsm_init() or QHsm_dispatch(). **** The vptr is initialized in the QMsm constructor, but each subclass of QMsm (direct or transitive) has an opportunity to define its own virtual table with different implementations and hook the vptr to this table. The QP5 framework invokes the operations init() and dispatch() only via the macros QMSM_INIT() and QMSM_DISPATCH(), which means that these “hooks” are in place for customization in subclasses. (c) Quantum Leaps, LLC 9
  • 10. New Features in QP5 11/08/13 The QActive and QMActive Classes QMsm vptr : QMsmVtbl state : QMAttr temp : QMAttr QActive init(e : QEvt const *) dispatch(e : QEvt const *) start(...) post(e : QEvt const *) postLIFO(e : QEvt const *) QHsm QMActive init(e : QEvt const *) dispatch(e : QEvt const *) init(e : QEvt const *) dispatch(e : QEvt const *) Inherits QHsm_init() and QHsm_dispatch() implementations Base class for active objects based on QHsm. Overrides init() and dispatch() to use QMsm implementations Base class for active objects based on QMsm. #define QACTIVE_START(me_,...) ((*((QActiveVtbl const *)((me_)->super.vptr))->start) ((me_),...)) #define QACTIVE_POST(me_, e_) ((*((QActiveVtbl const *)((me_)->super.vptr))->post) ((me_), (e_), (uint8_t)0, (sender_))) #define QACTIVE_POST_LIFO(me_, e_) ... © Quantum Leaps, LLC 10 The QActive class in QP5 extends the vtable inherited from QMsm by adding virtual functions for the start(), post(), and postLIFO() operations. The polymorphic way of invoking these operations is provided my means of the macros QACTIVE_START(), QACTIVE_POST(), and QACTIVE_POST_LIFO(), respectively. **** NOTE: The macros QACTIVE_START(), QACTIVE_POST(), and QACTIVE_POST_LIFO() are the recommended way of calling the respective operations. You should avoid calling the specific implementations directly (e.g., QActive_start(), QActive_post()). **** The QMActive class inherits all these operations from QActive, but it overrides the init() and dispatch() operations to use the implementation from the QMsm base class. (c) Quantum Leaps, LLC 10
  • 11. New Features in QP5 11/08/13 Course Outline •Enable QM to generate new type of SM code •Provide “hooks” for customization (virtual functions) •Multiple system clock tick rates Multiple system clock rates •Non-asserting event allocation and posting •Kernel-Unaware Interrupts for ARM Cortex-M3/M4 •Quick Summary of Other Changes © Quantum Leaps, LLC 11 QP5 supports multiple, independent system clock tick rates for time events. The number of system tick rates can be now configured in the QP/C ports. For example, a digital watch can use a "fast" clock tick rate of 100Hz and a "slow" clock tick rate of only 1Hz. These clock tick rates can be managed independently, so for example, the fast clock tick rate can be shut down in the absence of time events assigned to this rate. This feature allows the applications to implement sophisticated power-saving policies. (c) Quantum Leaps, LLC 11
  • 12. New Features in QP5 11/08/13 Multiple Clock Tick Rates /* clock tick rate driven by an interrupt */ void SysTick_Handler(void) { QF_TICK_X(0U, &SysTick_Handler); /* rate 0 */ } ~~~~ /* clock tick rate driven by a task (active object) */ static QState MyAO_state1(MyAO * const me, QEvt const * const e) { QState status_; switch (e->sig) { case SLOW_TICK_SIG: QF_TICK_X(1U, me); /* rate 1 */ status_ = Q_HANDLED(); break; } ~~~ } return status_; } ~~~~ /* idle processing */ void QF_onIdle()/QK_onIdle() { ~~~~ /* within a critical section... */ if (QF_noTimeEvtsActiveX(0U)) { /* no time evts at rate 0? */ /* shut down ticker for rate 0 */ } if (QF_noTimeEvtsActiveX(1U)) { /* no time evts at rate 1? */ /* shut down ticker for rate 1 */ } ~~~~ © Quantum Leaps, LLC } 12 QP5 adds support for multiple system clock tick rates. The number of system tick rates can be now configured in the QP/C ports by defining the macro QF_MAX_TICK_RATE (default value is 1 rate). To support this, QP5 adds an “extended” tick handler QF_tickX(tickRate), which takes the tickRate argument. The QF_tickX() function has been carefully designed to be callable from ISR and from the task level, including low-priority tasks. **** NOTE: The recommended way of calling QF_tickX() is through the macro QF_TICK_X(rate, sender), which supplies the sender of the tick for QS software tracing. **** Every tick rate can be managed independently from the other rates, meaning that a given rate n can be shut-down (the corresponding QF_tickX(n) can be stopped being called) while other rates can continue. Shutting down a tick rate is recommended only if there are no active time events assigned to this rate. The new API QF_noTimeEvtsActiveX(rate) is provided to test for this. This function must be called from within a critical section. (c) Quantum Leaps, LLC 12
  • 13. New Features in QP5 11/08/13 New API for Time Events /* "extended" time event constructor */ void MyAO_ctor(MyAO * const me) { QActive_ctor(&me->super, Q_STATE_CAST(&MyAO_initial)); QTimeEvt_ctorX(&me->timeEvt, &me->super, TIMEOUT_SIG, 0U); } ~~~~ static QState MyAO_state1(MyAO * const me, QEvt const * const e) { switch (e->sig) { case Q_ENTRY_SIG: { /* one-shot time event */ TimeEvt_armX(&me->timeEvt, BSP_TICKS_PER_SEC/5, 0U); ~~~ } case Q_EXIT_SIG: { TimeEvt_disarm(&me->timeEvt); ~~~ } ~~~ } } ~~~~ static QState MyAO_state2(MyAO * const me, QEvt const * const e) { switch (e->sig) { case Q_ENTRY_SIG: { /* periodic time event */ TimeEvt_armX(&me->timeEvt, BSP_TICKS_PER_SEC/10, BSP_TICKS_PER_SEC/5); ~~~ } © Quantum Leaps, LLC ~~~~ 13 The new “extended” TimeEvt constructor takes the active object, signal, and tick-rate. void QTimeEvt_ctorX(QTimeEvt * const me, QActive *me, enum_t sig, uint8_t tickRate); **** NOTE: this constructor assigns a time event to a given active object and a given tick rate. **** The “extended” arm operation serves both one-shot and periodic time events: void QTimeEvt_armX(QTimeEvt * const me, QTimeEvtCtr nTicks, QTimeEvtCtr interval); Assigning 0-interval arms a one-shot time event. A non-zero interval arms a periodic time event. The first period and the interval could be different, which helps adjust the phasing of periodic time events on the first arm operation. (c) Quantum Leaps, LLC 13
  • 14. New Features in QP5 11/08/13 New Implementation of TimeEvts QF_timeEvtHead_[0]::QTimeEvt super: QEvt next : QTimeEvt* act : void* ctr : QTimeEvtCtr interval : QTimeEvtCtr ::QTimeEvt super: QEvt next : QTimeEvt* act : void* ctr : QTimeEvtCtr interval : QTimeEvtCtr ::QTimeEvt super: QEvt next : QTimeEvt* act : void* ctr : QTimeEvtCtr interval : QTimeEvtCtr NULL ::QTimeEvt Tick [0] 0 head Rateratehead Newly armed time events Tick rate 1 head super: QEvt next : QTimeEvt* act : void* ctr : QTimeEvtCtr interval : QTimeEvtCtr ... NULL QF_timeEvtHead_[1]::QTimeEvt super: QEvt next : QTimeEvt* act : void* ctr : QTimeEvtCtr interval : QTimeEvtCtr ... NULL © Quantum Leaps, LLC 14 QP5 provides a low-latency implementation of QF_tickX(), and QTimeEvt_*() operations. The QF_tickX() can also be called from low-priority tasks, which means that it can be preempted and must handle correctly arming/disarming of time events during preemption. This is achieved by implementing the following rules: 1. Only QF_tickX() function can change the main list of the time events (originating from QF_timeEvtHead[n].next pointer). 2. Disarming of a time event does not remove it from the list, it merely marks the time event for removal. 3. Arming a time event does not add it to the main list. Instead, arming a time event adds a time event to the “newly armed” list, based on the QF_timeEvtHead[n].act pointer (reused here as a link pointer). 4. The QF_tickX() function appends the “newly armed” list atomically to the main list, so that rule #1 is not violated. (c) Quantum Leaps, LLC 14
  • 15. New Features in QP5 11/08/13 Course Outline •Enable QM to generate new type of SM code •Provide “hooks” for customization (virtual functions) •Multiple system clock tick rates •Non-asserting event allocation and posting Non-asserting event allocation and posting •Kernel-Unaware Interrupts for ARM Cortex-M3/M4 •Quick Summary of Other Changes © Quantum Leaps, LLC 15 QP5 adds a new "extended" API for non-asserting event allocation and posting. This feature is intended for situations, when an application is hammered with external events that at times arrive too fast for processing, but that can be ignored under the overload conditions (c) Quantum Leaps, LLC 15
  • 16. New Features in QP5 11/08/13 Non-Asserting Event Allocation •New macro Q_NEW_X() requires a margin argument ➔ Margin specifies the # free events that must exist in the pool MyEvt *myevt; Q_NEW_X(myevt, MyEvt, 5U, MY_EVT_SIG); /* "extended" event allocator */ if (myevt != (MyEvt *)0) { /* mevt might be NULL; have to test! */ myevt->foo = 123; myevt->bar = 0xABC; ~~~~ } © Quantum Leaps, LLC 16 The new “extended” event allocator Q_NEW_X() requires a non-zero margin argument, which specifies the number of free events in the pool (of the given size) for the allocation to succeed. If the pool contains less than the margin of events, Q_NEW_X() will set the event argument to NULL, but it will not assert. You must always test the event argument for NULL. **** NOTE: The margin parameter allows you to keep sufficient number of events in the pool for the “normal” event allocation, which asserts when events are not available. **** The internal implementation of the native memory pool QMPool_get() operation has been augmented to take the margin argument. When the QP port is configured to use “event constructors”, the macro Q_NEW_X() takes the variadic form and calls the event constructor only when the allocation succeeds. (c) Quantum Leaps, LLC 16
  • 17. New Features in QP5 11/08/13 Non-Asserting Event Posting •New macro QACTIVE_POST_X() requires margin argument Margin specifies the # free events that must exist in the event queue ➔ MyEvt *myevt; Q_NEW_X(myevt, MyEvt, 5U, MY_EVT_SIG); /* "extended" event allocator */ if (myevt != (MyEvt *)0) { /* mevt might be NULL; have to test! */ myevt->foo = 123; myevt->bar = 0xABC; ~~~~ /* "extended" event posting */ if (QACTIVE_POST_X(AO_myAO, &myevt->super, 3U, me)) { /* event posted successfully */ } else { /* event NOT posted */ } } © Quantum Leaps, LLC 17 The new “extended” event posting QACTIVE_POST_X() requires a non-zero margin argument, which specifies the number of free events in the event queue for the posting to succeed. If the queue contains less than the margin of free events, QACTIVE_POST_X() will not post the event and it will return 0 (FALSE), but it will not assert. ***** NOTE: The margin parameter allows you to keep sufficient number of free entries in the queue for the “normal” event posting, which asserts when the queue overflows. ***** The QActive_post() operation has been augmented to take the margin argument and return the status. The operation asserts if the margin is zero and the posting cannot succeed. The non-asserting event posting is not available for time events or for publishing events. ***** NOTE: This non-asserting event posting should be reserved for special situations and should be used with caution. The main mechanisms for event allocation and posting should remain the asserting versions (Q_NEW, QACTIVE_POST, QF_PUBLISH), because they provide the event-delivery guarantee. ***** (c) Quantum Leaps, LLC 17
  • 18. New Features in QP5 11/08/13 Course Outline •Enable QM to generate new type of SM code •Provide “hooks” for customization (virtual functions) •Multiple system clock tick rates •Non-asserting event allocation and posting •Kernel-Unaware Interrupts for ARM Cortex-M3/M4 Kernel-Unaware Interrupts for ARM Cortex-M3/M4 •Quick Summary of Other Changes © Quantum Leaps, LLC 18 The QP 5.1 port to ARM Cortex-M3/M4 never completely disables interrupts, even inside the critical sections. The highest-priority interrupts (prioritized in the NVIC hardware) that are never disabled are “unaware” of the real-time kernel and run completely freely (this is called sometimes “zero interrupt latency”). Such “kernel unaware” interrupts can be useful for handling very fast (sub microsecond) deadlines, for example quickly re-arming a DMA channel, fast communication, etc. **** NOTE: “Kernel-unaware” interrupts cannot call any QP services and specifically they cannot post events. **** NOTE: The only way “kernel-unaware” interrupts can communicate with the QP framework is to trigger a “kernel-aware” interrupt, which can post events to QP. **** (c) Quantum Leaps, LLC 18
  • 19. New Features in QP5 11/08/13 Changed Structure of ARM Cortex-M Ports Renamed port/examples directory to “arm-cm” ● The previous name “arm-cortex” could be confusing for Cortex-A Moved the CMSIS directory to “portsarm-cmcmsis” ● Instead of replicating it in each example project ● Updated CMSIS to version 3.20 Updated toolset versions, added ARM/Keil to the QP Baseline code © Quantum Leaps, LLC 19 The QP 5.1 port to ARM Cortex-M has changed the directory structure to avoid any confusion with other CPU cores in the ARM Cortex family CMSIS directory with core CMSIS header files is now inside the ARM Cortex-M port (c) Quantum Leaps, LLC 19
  • 20. New Features in QP5 11/08/13 Kernel-Unaware and Kernel-Aware Interrupts •QP 5.1 port to ARM Cortex-M3/M4 never completely disables interrupts Interrupts are disables selectively using the BASEPRI register ➔ Kernel-unaware interrupt 000 00000 Priority for CMSIS NVIC_SetPriority( ) 0 Never disabled Kernel-aware interrupt 001 00000 1 = QF_AWARE_ISR_CMSIS_PRI Kernel-aware interrupt 010 00000 2 Kernel-aware interrupt 011 00000 3 Kernel-aware interrupt 100 00000 4 Kernel-aware interrupt 101 00000 5 Kernel-aware interrupt 110 00000 6 PendSV interrupt for QK 111 00000 7 Interrupt type NVIC priority bits Disabled in critical sections Should not be used for regular interrupts Only Kernel-Aware Interrupts are allowed to call QP services! © Quantum Leaps, LLC 20 The QP 5.1 port to ARM Cortex-M3/M4 never completely disables interrupts, even inside the critical sections. On Cortex-M3/M4 (ARMv7-M architectures), the QP port disables interrupts selectively using the BASEPRI register. As shown in the picture, this policy divides interrupts into “kernel-unaware” interrupts, which are never disabled, and “kernel-aware” interrupts, which are disabled in the QP critical sections. **** NOTE: Only “kernel-aware” interrupts are allowed to call QP services. “Kernel-unaware” interrupts are not allowed to call any QP services and they can communicate with QP only by triggering a “kernel-aware” interrupt (which can post or publish events). ***** NOTE: The number of interrupt priority bits in the NVIC is “implementation dependent”, meaning that various silicon vendors can provide different number of bits. The minimum number of bits is 3, as shown in the picture. ***** INFO: The BASEPRI register is not implemented in the ARMv6-M architecture (CortexM0/M0+), so Cortex-M0/M0+ need to use the PRIMASK register to disable interrupts globally. In other words, in Cortex-M0/M0+ ports, all interrupts are “kernel-aware”. (c) Quantum Leaps, LLC 20
  • 21. New Features in QP5 11/08/13 Assigning ARM Cortex-M Interrupt Priorities /*!!!!!!!!!!!!!!!!!!!!!!!!!!!! CAUTION !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! * Assign a priority to EVERY ISR explicitly by calling NVIC_SetPriority(). * DO NOT LEAVE THE ISR PRIORITIES AT THE DEFAULT VALUE! */ enum KernelUnawareISRs { /* see NOTE00 */ /* ... */ MAX_KERNEL_UNAWARE_CMSIS_PRI /* keep always last */ }; /* "kernel-unaware" interrupts can't overlap "kernel-aware" interrupts */ Q_ASSERT_COMPILE(MAX_KERNEL_UNAWARE_CMSIS_PRI <= QF_AWARE_ISR_CMSIS_PRI); enum KernelAwareISRs { /* see NOTE00 */ GPIOPORTA_PRIO = QF_AWARE_ISR_CMSIS_PRI, ADCSEQ3_PRIO, SYSTICK_PRIO, /* ... */ MAX_KERNEL_AWARE_CMSIS_PRI /* keep always last */ }; /* "kernel-aware" interrupts should not overlap the PendSV priority */ Q_ASSERT_COMPILE(MAX_KERNEL_AWARE_CMSIS_PRI <= (0xFF >>(8-__NVIC_PRIO_BITS))); © Quantum Leaps, LLC 21 The enumeration KernelUnawareISRs lists the priority numbers for the “kernel-unaware” interrupts. These priorities start with zero (highest possible). The priorities are suitable as the argument for the NVC_SetPriority() CMSIS function. ***** NOTE: The NVIC allows you to assign the same priority level to multiple interrupts, so you can have more ISRs than priority levels running as “kernel-unaware” or “kernel-aware” interrupts. ****** * The last value in the enumeration MAX_KERNEL_UNAWARE_CMSIS_PRI keeps track of the maximum priority used for a “kernel-unaware” interrupt. * The compile-time assertion ensures that the “kernel-unaware” interrupt priorities do not overlap the “kernel-aware” interrupts, which start at QF_AWARE_ISR_CMSIS_PRI. * The enumeration KernelAwareISRs lists the priority numbers for the “kernel-aware” interrupts. * The “kernel-aware” interrupt priorities start with the QF_AWARE_ISR_CMSIS_PRI offset, which is provided in the qf_port.h header file. * The last value in the enumeration MAX_KERNEL_AWARE_CMSIS_PRI keeps track of the maximum priority used for a “kernel-aware” interrupt. * The compile-time assertion ensures that the “kernel-aware” interrupt priorities do not overlap the lowest priority level reserved for the PendSV exception. (c) Quantum Leaps, LLC 21
  • 22. New Features in QP5 11/08/13 Setting ARM Cortex-M Interrupt Priorities void QF_onStartup(void) { /* set up the SysTick timer to fire at BSP_TICKS_PER_SEC rate */ SysTick_Config(SystemFrequency / BSP_TICKS_PER_SEC); /* assing all priority bits for preemption-pri. and none to sub-pri. */ NVIC_SetPriorityGrouping(0U); /* set priorities of ALL ISRs used in the system, see NOTE00 * * !!!!!!!!!!!!!!!!!!!!!!!!! CAUTION !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! * Assign a priority to EVERY ISR by calling NVIC_SetPriority(). * DO NOT LEAVE THE ISR PRIORITIES AT THE DEFAULT VALUE! */ NVIC_SetPriority(ADCSeq3_IRQn, ADCSEQ3_PRIO); NVIC_SetPriority(SysTick_IRQn, SYSTICK_PRIO); /* ... */ /* enable IRQs... */ NVIC_EnableIRQ(ADCSeq3_IRQn); NVIC_EnableIRQ(GPIOPortA_IRQn); } © Quantum Leaps, LLC 22 The QF_onStartup() callback function is where you set up the interrupts. * The CMIS function NVIC_SetPriorityGrouping() assigns all the priority bits to be preempt priority bits, leaving no priority bits as subpriority bits to preserve the direct relationship between the interrupt priorities and the ISR preemption rules. This is the default configuration out of reset for the ARM Cortex-M3/M4 cores, but it can be changed by some vendor-supplied startup code. To avoid any surprises, the call to NVIC_SetPriorityGrouping(0U) is recommended. * The interrupt priories fall all interrupts (“kernel-unaware” and “kernel-aware” alike) are set explicitly by calls to the CMSIS function NVIC_SetPriority(). * All used IRQ interrupts need to be explicitly enabled by calling the CMSIS function NVIC_EnableIRQ(). (c) Quantum Leaps, LLC 22
  • 23. New Features in QP5 11/08/13 Course Outline •Enable QM to generate new type of SM code •Provide “hooks” for customization (virtual functions) •Multiple system clock tick rates •Non-asserting event allocation and posting •Kernel-Unaware Interrupts for ARM Cortex-M3/M4 •Quick Summaryof Other Changes Quick Summary of Other Changes © Quantum Leaps, LLC 23 QP5 provides also a number of smaller features and enhancements (c) Quantum Leaps, LLC 23
  • 24. New Features in QP5 11/08/13 QS/QSPY Updates QS updates to generate new information ● QS_QF_TICK, QS_QF_TIME_EVT_* records send tick rate byte ● New trace records for failed event allocation/posting: QS_QF_ACTIVE_POST_ATTEMPT, QS_MPOOL_GET_ATTEMPT ● New trace records for unit testing: QS_TEST_RUN, QS_TEST_FAIL Dictionary records generate less code by using functions ● Added new source file qs_dict.c with QS_*_dict() functions More efficient QS code by grouping attributes into struct © Quantum Leaps, LLC 24 QS/QSPY software tracing required updating to accommodate the new features. Also the size of the QS tracing instrumentation and its performance have been improved. (c) Quantum Leaps, LLC 24
  • 25. New Features in QP5 11/08/13 Documentation/Examples Added simple “Blinky” example requested by users ● For Windows, Linux, ARM Cortex-M with GNU, IAR, and Keil Added “Getting Started with QP” guide in PDF ● Instead of replicating it in each example project Updated Doxygen documentation ● Updated the code examples and missing references ● HTML documentation has the left-side summary panel and its own search box © Quantum Leaps, LLC (c) Quantum Leaps, LLC 25 25

Editor's Notes

  1. {"16":"The new “extended” event allocator Q_NEW_X() requires a non-zero margin argument, which specifies the number of free events in the pool (of the given size) for the allocation to succeed. If the pool contains less than the margin of events, Q_NEW_X() will set the event argument to NULL, but it will not assert.\nYou must always test the event argument for NULL.\n****\nNOTE: The margin parameter allows you to keep sufficient number of events in the pool for the “normal” event allocation, which asserts when events are not available.\n****\nThe internal implementation of the native memory pool QMPool_get() operation has been augmented to take the margin argument.\nWhen the QP port is configured to use “event constructors”, the macro Q_NEW_X() takes the variadic form and calls the event constructor only when the allocation succeeds.\n","5":"The constructor is the same as before, except it calls the superclass&apos; ctor QMsm_ctor()\nThe top-most initial transition handler function requires a transition-action array, which defines the sequence of actions to execute upon the initial transitions. The generation of this array is difficult by hand, but it is easy for the QM tool. The transition-action array is static and const, which means that most compilers will place it in ROM. The array is zero-terminated. \nThe initial-transition must return through the macro QM_INITIAL().\n","22":"The QF_onStartup() callback function is where you set up the interrupts.\n* The CMIS function NVIC_SetPriorityGrouping() assigns all the priority bits to be preempt priority bits, leaving no priority bits as subpriority bits to preserve the direct relationship between the interrupt priorities and the ISR preemption rules. This is the default configuration out of reset for the ARM Cortex-M3/M4 cores, but it can be changed by some vendor-supplied startup code. To avoid any surprises, the call to NVIC_SetPriorityGrouping(0U) is recommended. \n* The interrupt priories fall all interrupts (“kernel-unaware” and “kernel-aware” alike) are set explicitly by calls to the CMSIS function NVIC_SetPriority().\n* All used IRQ interrupts need to be explicitly enabled by calling the CMSIS function NVIC_EnableIRQ().\n","11":"QP5 supports multiple, independent system clock tick rates for time events. The number of system tick rates can be now configured in the QP/C ports. For example, a digital watch can use a &quot;fast&quot; clock tick rate of 100Hz and a &quot;slow&quot; clock tick rate of only 1Hz. These clock tick rates can be managed independently, so for example, the fast clock tick rate can be shut down in the absence of time events assigned to this rate. This feature allows the applications to implement sophisticated power-saving policies.\n","17":"The new “extended” event posting QACTIVE_POST_X() requires a non-zero margin argument, which specifies the number of free events in the event queue for the posting to succeed. If the queue contains less than the margin of free events, QACTIVE_POST_X() will not post the event and it will return 0 (FALSE), but it will not assert.\n*****\nNOTE: The margin parameter allows you to keep sufficient number of free entries in the queue for the “normal” event posting, which asserts when the queue overflows.\n*****\nThe QActive_post() operation has been augmented to take the margin argument and return the status. The operation asserts if the margin is zero and the posting cannot succeed.\nThe non-asserting event posting is not available for time events or for publishing events.\n*****\nNOTE: This non-asserting event posting should be reserved for special situations and should be used with caution. The main mechanisms for event allocation and posting should remain the asserting versions (Q_NEW, QACTIVE_POST, QF_PUBLISH), because they provide the event-delivery guarantee. \n*****\n","6":"The entry/exit actions and per-state initial transitions are separate action-handler functions. These functions are only defined if the given state actually has an entry action, exit action or an initial transition.\nThe per-state initial transition is coded identically to the top-most initial transition \n","23":"QP5 provides also a number of smaller features and enhancements\n","12":"QP5 adds support for multiple system clock tick rates. The number of system tick rates can be now configured in the QP/C ports by defining the macro QF_MAX_TICK_RATE (default value is 1 rate).\nTo support this, QP5 adds an “extended” tick handler QF_tickX(tickRate), which takes the tickRate argument. The QF_tickX() function has been carefully designed to be callable from ISR and from the task level, including low-priority tasks.\n****\nNOTE: The recommended way of calling QF_tickX() is through the macro QF_TICK_X(rate, sender), which supplies the sender of the tick for QS software tracing.\n****\nEvery tick rate can be managed independently from the other rates, meaning that a given rate n can be shut-down (the corresponding QF_tickX(n) can be stopped being called) while other rates can continue. Shutting down a tick rate is recommended only if there are no active time events assigned to this rate. The new API QF_noTimeEvtsActiveX(rate) is provided to test for this. This function must be called from within a critical section. \n","1":"This presentation highlights the new features in the new QP5 milestone release.\nWhat is it?\nQP™ is a family of lightweight, open source software frameworks for building responsive and modular real-time embedded applications as systems of cooperating, event-driven active objects (actors). The QP™ family consists of QP/C, QP/C++, and QP-nano frameworks, which are all strictly quality controlled, superbly documented, and commercially licensable.\nWhere does it run?\nAll QP™ frameworks can run on &quot;bare-metal&quot; single-chip microcontrollers, completely replacing a traditional Real-Time Operating System (RTOS). Ports and ready-to-use examples are provided for most major CPU families. QP/C and QP/C++ can also work with a traditional OS/RTOS, such as: POSIX (Linux, embedded Linux, QNX, INTEGRITY), Win32 (Windows, Windows embedded, Windows CE), ThreadX, MicroC/OS, etc.\nHow does it handle behavior?\nThe behavior of active objects is specified in QP by means of hierarchical state machines (UML statecharts). The frameworks support manual coding of UML state machines in C or C++ as well as fully automatic code generation by means of the free graphical QM™ modeling tool.\nWho is using it?\nThe QP frameworks are used in millions of products worldwide in aerospace, robotics, consumer electronics, wired and wireless telecommunications, industrial automation, transportation, and many more. The QP™ frameworks and the QM™ modeling tool receive over 30,000 downloads a year (not even counting downloads of QP ports).\n","18":"The QP 5.1 port to ARM Cortex-M3/M4 never completely disables interrupts, even inside the critical sections. The highest-priority interrupts (prioritized in the NVIC hardware) that are never disabled are “unaware” of the real-time kernel and run completely freely (this is called sometimes “zero interrupt latency”). Such “kernel unaware” interrupts can be useful for handling very fast (sub microsecond) deadlines, for example quickly re-arming a DMA channel, fast communication, etc.\n****\nNOTE: “Kernel-unaware” interrupts cannot call any QP services and specifically they cannot post events.\n****\nNOTE: The only way “kernel-unaware” interrupts can communicate with the QP framework is to trigger a “kernel-aware” interrupt, which can post events to QP.\n****\n","7":"The state-handler function handles only the explicit events, but it does not handle the special “events” Q_ENTRY_SIG, Q_EXIT_SIG, or Q_INIT_SIG. \nEvery transition requires its own transition-action array.\n","24":"QS/QSPY software tracing required updating to accommodate the new features.\nAlso the size of the QS tracing instrumentation and its performance have been improved.\n","13":"The new “extended” TimeEvt constructor takes the active object, signal, and tick-rate.\nvoid QTimeEvt_ctorX(QTimeEvt * const me, QActive *me, enum_t sig, uint8_t tickRate);\n****\nNOTE: this constructor assigns a time event to a given active object and a given tick rate.\n****\nThe “extended” arm operation serves both one-shot and periodic time events:\nvoid QTimeEvt_armX(QTimeEvt * const me, QTimeEvtCtr nTicks, QTimeEvtCtr interval);\nAssigning 0-interval arms a one-shot time event. A non-zero interval arms a periodic time event. The first period and the interval could be different, which helps adjust the phasing of periodic time events on the first arm operation. \n","2":"The main purpose of this milestone QP5 release is to enable the QM modeling tool to generate a new type of state machine code (requires QM version 3). \nSpecifically, QM can generate the complete transition-sequences (sequences of exit/entry/initial actions) at code-generation time instead of discovering the transition-sequences at run-time. This requires a different (much simpler) event processor than the one provided in the QHsm class. QP5 provides such new event processor in the new class QMsm. \nNOTE: QP5 5.1 remains backwards-compatible with the existing QP 4.x applications, except the ARM Cortex-M applications need to adjust the interrupt priorities. Specifically, you need to set the interrupt priorities equal or lower than QF_AWARE_ISR_CMSIS_PRI constant provided in the qf_port.h header file. \n","19":"The QP 5.1 port to ARM Cortex-M has changed the directory structure to avoid any confusion with other CPU cores in the ARM Cortex family\nCMSIS directory with core CMSIS header files is now inside the ARM Cortex-M port\n","8":"QP5 introduces polymorphism (virtual functions) for most important operations within the framework, such as state machine init() and dispatch() and active object start(), post(), and postLIFO() operations. Making theses functions &quot;virtual&quot; means that all these operations can be re-defined in subclasses of state machines and active objects.\n","14":"QP5 provides a low-latency implementation of QF_tickX(), and QTimeEvt_*() operations. The QF_tickX() can also be called from low-priority tasks, which means that it can be preempted and must handle correctly arming/disarming of time events during preemption. \nThis is achieved by implementing the following rules:\n1. Only QF_tickX() function can change the main list of the time events (originating from QF_timeEvtHead[n].next pointer).\n2. Disarming of a time event does not remove it from the list, it merely marks the time event for removal.\n3. Arming a time event does not add it to the main list. Instead, arming a time event adds a time event to the “newly armed” list, based on the QF_timeEvtHead[n].act pointer (reused here as a link pointer).\n4. The QF_tickX() function appends the “newly armed” list atomically to the main list, so that rule #1 is not violated.\n","3":"The new type of state machine implementation in QP5 is based on the new QMsm class, which takes advantage of the QM tool as an advanced &quot;state machine compiler&quot;.\nThe QMsm class provides the new implementation of the init() and dispatch() functions. QMsm provides also the virtual pointer, which enables polymorphism (late binding).\nCoding state machines based on QMsm requires the assistance of the QM tool to generate the complete transition-sequences (sequences of exit/entry/initial actions) at code-generation time. The resulting code can be still highly human-readable, but it will no longer be human-maintainable. The lab tests indicate that the new &quot;housekeeping&quot; code for executing hierarchical state machines can be about twice as fast as the previous code based on the QHsm class.\nAdditionally, the new code requires less run-time support (smaller event processor) and uses 70% less of stack space in the call to the QMsm_dispatch() operation than QHsm_dispatch().\n","20":"The QP 5.1 port to ARM Cortex-M3/M4 never completely disables interrupts, even inside the critical sections. On Cortex-M3/M4 (ARMv7-M architectures), the QP port disables interrupts selectively using the BASEPRI register.\nAs shown in the picture, this policy divides interrupts into “kernel-unaware” interrupts, which are never disabled, and “kernel-aware” interrupts, which are disabled in the QP critical sections. \n****\nNOTE: Only “kernel-aware” interrupts are allowed to call QP services. “Kernel-unaware” interrupts are not allowed to call any QP services and they can communicate with QP only by triggering a “kernel-aware” interrupt (which can post or publish events).\n*****\nNOTE: The number of interrupt priority bits in the NVIC is “implementation dependent”, meaning that various silicon vendors can provide different number of bits. The minimum number of bits is 3, as shown in the picture.\n*****\nINFO: The BASEPRI register is not implemented in the ARMv6-M architecture (Cortex-M0/M0+), so Cortex-M0/M0+ need to use the PRIMASK register to disable interrupts globally. In other words, in Cortex-M0/M0+ ports, all interrupts are “kernel-aware”.\n","9":"QP5 provides virtual functions for the important framework operations.\nThe QMsm base class provides the standard vptr-&gt;vtable constructs, which make up an indirection level for calling functions, as implemented in the macros QMSM_INIT() and QMSM_DISPATCH().\n****NOTE: You don&apos;t need to know exactly how polymorphism is implemented in C to take advantage of the provided “virtual hooks”. Just call the respective operations using the macros, such as QMSM_INIT() or QMSM_DISPATCH() rather than the specific implementations, such as QMsm_init() or QHsm_dispatch().\n****\nThe vptr is initialized in the QMsm constructor, but each subclass of QMsm (direct or transitive) has an opportunity to define its own virtual table with different implementations and hook the vptr to this table.\nThe QP5 framework invokes the operations init() and dispatch() only via the macros QMSM_INIT() and QMSM_DISPATCH(), which means that these “hooks” are in place for customization in subclasses.\n","15":"QP5 adds a new &quot;extended&quot; API for non-asserting event allocation and posting. This feature is intended for situations, when an application is hammered with external events that at times arrive too fast for processing, but that can be ignored under the overload conditions\n","4":"****\nNOTE: The new state machine code is not intended to be written manually. This code is generated automatically by the QM tool from the state diagram. The explanation provided here is only intended to help you understand this code structure, so that you can work with it effectively (e.g., inside a traditional source-level debugger).\n****\nEach state is represented as:\n1. QMState object (const in ROM)\n2. state-handler function\n3. optional entry-action function\n4. optional exit-action function\n5. optional initial-transition function\nThe QMState object provides the information about nesting of the state, the associated state-handler function, and the exit-action function, if present.\nThe state-handler function no longer handles entry/exit/initial transition.\nThe entry/exit/initial transition are handled in separate functions associated with a state. These functions are only defined when needed.\n","21":"The enumeration KernelUnawareISRs lists the priority numbers for the “kernel-unaware” interrupts. These priorities start with zero (highest possible). The priorities are suitable as the argument for the NVC_SetPriority() CMSIS function. \n*****\nNOTE: The NVIC allows you to assign the same priority level to multiple interrupts, so you can have more ISRs than priority levels running as “kernel-unaware” or “kernel-aware” interrupts. \n******\n* The last value in the enumeration MAX_KERNEL_UNAWARE_CMSIS_PRI keeps track of the maximum priority used for a “kernel-unaware” interrupt.\n* The compile-time assertion ensures that the “kernel-unaware” interrupt priorities do not overlap the “kernel-aware” interrupts, which start at QF_AWARE_ISR_CMSIS_PRI.\n* The enumeration KernelAwareISRs lists the priority numbers for the “kernel-aware” interrupts.\n* The “kernel-aware” interrupt priorities start with the QF_AWARE_ISR_CMSIS_PRI offset, which is provided in the qf_port.h header file.\n* The last value in the enumeration MAX_KERNEL_AWARE_CMSIS_PRI keeps track of the maximum priority used for a “kernel-aware” interrupt.\n* The compile-time assertion ensures that the “kernel-aware” interrupt priorities do not overlap the lowest priority level reserved for the PendSV exception.\n","10":"The QActive class in QP5 extends the vtable inherited from QMsm by adding virtual functions for the start(), post(), and postLIFO() operations. The polymorphic way of invoking these operations is provided my means of the macros QACTIVE_START(), QACTIVE_POST(), and QACTIVE_POST_LIFO(), respectively.\n****NOTE: The macros QACTIVE_START(), QACTIVE_POST(), and QACTIVE_POST_LIFO() are the recommended way of calling the respective operations. You should avoid calling the specific implementations directly (e.g., QActive_start(), QActive_post()). \n****\nThe QMActive class inherits all these operations from QActive, but it overrides the init() and dispatch() operations to use the implementation from the QMsm base class.\n"}