eXtended (blocking) thread of the QXK preemptive kernel More...
#include "qxk.hpp"
Public Member Functions | |
QXThread (QXThreadHandler const handler, std::uint_fast8_t const tickRate=0U) noexcept | |
void | init (void const *const e, std::uint_fast8_t const qsId) override |
void | init (std::uint_fast8_t const qsId) override |
void | dispatch (QEvt const *const e, std::uint_fast8_t const qsId) override |
QTimeEvt const * | getTimeEvt () const noexcept |
bool | delayCancel () noexcept |
Public Member Functions inherited from QP::QActive | |
bool | isIn (QStateHandler const state) noexcept override |
QStateHandler | childState (QStateHandler const parent) noexcept |
void | setAttr (std::uint32_t attr1, void const *attr2=nullptr) |
void | start (QPrioSpec const prioSpec, QEvt const **const qSto, std::uint_fast16_t const qLen, void *const stkSto, std::uint_fast16_t const stkSize, void const *const par) |
void | start (QPrioSpec const prioSpec, QEvt const **const qSto, std::uint_fast16_t const qLen, void *const stkSto, std::uint_fast16_t const stkSize) |
void | stop () |
void | register_ () noexcept |
void | unregister_ () noexcept |
bool | post_ (QEvt const *const e, std::uint_fast16_t const margin, void const *const sender) noexcept |
void | postLIFO (QEvt const *const e) noexcept |
QEvt const * | get_ () noexcept |
void | subscribe (enum_t const sig) const noexcept |
void | unsubscribe (enum_t const sig) const noexcept |
void | unsubscribeAll () const noexcept |
bool | defer (QEQueue *const eq, QEvt const *const e) const noexcept |
bool | recall (QEQueue *const eq) noexcept |
std::uint_fast16_t | flushDeferred (QEQueue *const eq, std::uint_fast16_t const num=0xFFFFU) const noexcept |
std::uint_fast8_t | getPrio () const noexcept |
void | setPrio (QPrioSpec const prio) noexcept |
std::uint_fast8_t | getPThre () const noexcept |
QACTIVE_EQUEUE_TYPE const & | getEQueue () const noexcept |
QACTIVE_OS_OBJ_TYPE const & | getOsObject () const noexcept |
QACTIVE_THREAD_TYPE const & | getThread () const noexcept |
void | setThread (QACTIVE_THREAD_TYPE const &thr) |
virtual bool | postFromISR (QEvt const *const e, std::uint_fast16_t const margin, void *par, void const *const sender) noexcept |
Public Member Functions inherited from QP::QAsm | |
virtual | ~QAsm () noexcept |
QStateHandler | state () const noexcept |
QMState const * | stateObj () const noexcept |
virtual QStateHandler | getStateHandler () noexcept |
Static Public Member Functions | |
static bool | delay (QTimeEvtCtr const nTicks) noexcept |
static QEvt const * | queueGet (QTimeEvtCtr const nTicks=QXTHREAD_NO_TIMEOUT) noexcept |
Static Public Member Functions inherited from QP::QActive | |
static std::uint_fast16_t | getQueueMin (std::uint_fast8_t const prio) noexcept |
static void | psInit (QSubscrList *const subscrSto, enum_t const maxSignal) noexcept |
static void | publish_ (QEvt const *const e, void const *const sender, std::uint_fast8_t const qsId) noexcept |
static void | evtLoop_ (QActive *act) |
static void | publishFromISR (QEvt const *e, void *par, void const *sender) noexcept |
Static Public Member Functions inherited from QP::QAsm | |
static QState | top (void *const me, QEvt const *const e) noexcept |
Static Public Attributes | |
static constexpr QTimeEvtCtr | QXTHREAD_NO_TIMEOUT {0U} |
Static Public Attributes inherited from QP::QActive | |
static QActive * | registry_ [QF_MAX_ACTIVE+1U] |
static QSubscrList * | subscrList_ |
static enum_t | maxPubSignal_ |
Private Member Functions | |
void | block_ () const noexcept |
void | unblock_ () const noexcept |
void | teArm_ (enum_t const sig, QTimeEvtCtr const nTicks) noexcept |
bool | teDisarm_ () noexcept |
void | stackInit_ (QP::QXThreadHandler const handler, void *const stkSto, std::uint_fast16_t const stkSize) noexcept |
Static Private Member Functions | |
static void | timeout_ (QActive *const act) |
Private Attributes | |
QTimeEvt | m_timeEvt |
Friends | |
class | QActive |
class | QTimeEvt |
class | QXSemaphore |
class | QXMutex |
Additional Inherited Members | |
Public Types inherited from QP::QAsm | |
enum | QStateRet : QState { Q_RET_SUPER , Q_RET_SUPER_SUB , Q_RET_UNHANDLED , Q_RET_HANDLED , Q_RET_IGNORED , Q_RET_ENTRY , Q_RET_EXIT , Q_RET_NULL , Q_RET_TRAN , Q_RET_TRAN_INIT , Q_RET_TRAN_EP , Q_RET_TRAN_HIST , Q_RET_TRAN_XP } |
enum | ReservedSig : QSignal { Q_EMPTY_SIG , Q_ENTRY_SIG , Q_EXIT_SIG , Q_INIT_SIG } |
Reserved signals by the QP-framework. More... | |
Public Attributes inherited from QP::QActive | |
std::uint8_t | m_prio_dis |
std::uint8_t | m_pthre_dis |
Protected Member Functions inherited from QP::QActive | |
QActive (QStateHandler const initial) noexcept | |
Protected Member Functions inherited from QP::QAsm | |
QAsm () noexcept | |
QState | tran (QStateHandler const target) noexcept |
QState | tran_hist (QStateHandler const hist) noexcept |
QState | super (QStateHandler const superstate) noexcept |
QState | qm_tran (void const *const tatbl) noexcept |
QState | qm_tran_init (void const *const tatbl) noexcept |
QState | qm_tran_hist (QMState const *const hist, void const *const tatbl) noexcept |
QState | qm_tran_ep (void const *const tatbl) noexcept |
QState | qm_tran_xp (QActionHandler const xp, void const *const tatbl) noexcept |
QState | qm_entry (QMState const *const s) noexcept |
QState | qm_exit (QMState const *const s) noexcept |
QState | qm_sm_exit (QMState const *const s) noexcept |
QState | qm_super_sub (QMState const *const s) noexcept |
Protected Attributes inherited from QP::QActive | |
std::uint8_t | m_prio |
std::uint8_t | m_pthre |
QACTIVE_THREAD_TYPE | m_thread |
QACTIVE_OS_OBJ_TYPE | m_osObject |
QACTIVE_EQUEUE_TYPE | m_eQueue |
Protected Attributes inherited from QP::QAsm | |
QAsmAttr | m_state |
QAsmAttr | m_temp |
eXtended (blocking) thread of the QXK preemptive kernel
QP::QXThread represents the eXtended (blocking) thread of the QXK kernel. Each extended thread in the application must be represented by the corresponding QP::QXThread instance
The following example illustrates how to instantiate and use an extended thread in your application.
|
noexcept |
Constructor of an extended-thread
Performs the first step of QXThread initialization by assigning the thread-handler function and the tick rate at which it will handle the timeouts.
[in] | handler | the thread-handler function |
[in] | tickRate | the tick rate for timeouts in this thread (see QXThread_delay() and QTIMEEVT_TICK_X()) |
The following example illustrates how to invoke QXThread_ctor() in the main() function
Definition at line 76 of file qxk_xthr.cpp.
|
overridevirtual |
Virtual function to take the top-most initial transition in the state machine.
Synchronously executes the top-most initial transition in a state machine (must be overridden in the subclasses).
[in] | e | pointer to an initialization parameter (might be nullptr) |
[in] | qsId | QS-id of this state machine (for QS local filter) |
qep_asm:200
Reimplemented from QP::QActive.
Definition at line 86 of file qxk_xthr.cpp.
|
inlineoverridevirtual |
Virtual function to take the top-most initial transition in the state machine (overloaded).
Synchronously executes the top-most initial transition in a state machine. This overloaded version takes no initialization parameter.
[in] | qsId | QS-id of this state machine (for QS local filter) |
Reimplemented from QP::QActive.
|
overridevirtual |
Virtual function to dispatch an event to the state machine.
Synchronously dispatches an event for processing to a state machine (must be overridden in the subclasses). The processing of an event represents one run-to-completion (RTC) step.
[in] | e | pointer to the event to be dispatched to the MSM |
[in] | qsId | QS-id of this state machine (for QS local filter) |
qep_asm:302
Reimplemented from QP::QActive.
Definition at line 96 of file qxk_xthr.cpp.
|
inlinenoexcept |
|
staticnoexcept |
Delay (block) the current extended thread for a specified # ticks
Blocking delay for the number of clock tick at the associated tick rate.
[in] | nTicks | number of clock ticks (at the associated rate) to wait for the event to arrive. |
qxk_xthr:800
qxk_xthr:801
Definition at line 106 of file qxk_xthr.cpp.
|
noexcept |
Cancel the delay
Cancel the blocking delay and cause return from the QXThread::delay() function.
Definition at line 152 of file qxk_xthr.cpp.
|
staticnoexcept |
Obtain a message from the private message queue (block if no messages)
The QXThread_queueGet() operation allows the calling extended thread to receive QP events directly into its own built-in event queue from an ISR, basic thread (AO), or another extended thread.
If QXThread_queueGet() is called when no events are present in the thread's private event queue, the operation blocks the current extended thread until either an event is received, or a user-specified timeout expires.
[in] | nTicks | number of clock ticks (at the associated rate) to wait for the event to arrive. The value of QXTHREAD_NO_TIMEOUT indicates that no timeout will occur and the queue will block indefinitely. |
qxk_xthr:500
qxk_xthr:501
Definition at line 172 of file qxk_xthr.cpp.
|
privatenoexcept |
Block QXThread private implementation
Internal implementation of blocking the given extended thread.
qxk_xthr:600
Definition at line 269 of file qxk_xthr.cpp.
|
privatenoexcept |
Unblock QXThread private implementation
Internal implementation of un-blocking the given extended thread.
Definition at line 283 of file qxk_xthr.cpp.
|
staticprivate |
Process timeout in QXThread (either delay or during blocking)
[in,out] | act | generic QActive* pointer of the thread that times out. |
Definition at line 299 of file qxk_xthr.cpp.
|
privatenoexcept |
Arm internal time event private implementation
Internal implementation of arming the private time event for a given timeout at a given system tick rate.
qxk_xthr:700
Definition at line 311 of file qxk_xthr.cpp.
|
privatenoexcept |
Disarm internal time event private implementation
Internal implementation of disarming the private time event.
Definition at line 356 of file qxk_xthr.cpp.
|
privatenoexcept |
Initialize the private stack of a given eXtended thread (defined in QXK port)
|
friend |
|
private |
|
staticconstexpr |