Movatterモバイル変換


[0]ホーム

URL:


Logo
QP/C++ 8.1.1
Real-Time Event Framework
Loading...
Searching...
No Matches
qp.hpp
Go to the documentation of this file.
1//============================================================================
2// QP/C++ Real-Time Event Framework (RTEF)
3//
4// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved.
5//
6// Q u a n t u m L e a P s
7// ------------------------
8// Modern Embedded Software
9//
10// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-QL-commercial
11//
12// This software is dual-licensed under the terms of the open-source GNU
13// General Public License (GPL) or under the terms of one of the closed-
14// source Quantum Leaps commercial licenses.
15//
16// Redistributions in source code must retain this top-level comment block.
17// Plagiarizing this software to sidestep the license obligations is illegal.
18//
19// NOTE:
20// The GPL does NOT permit the incorporation of this code into proprietary
21// programs. Please contact Quantum Leaps for commercial licensing options,
22// which expressly supersede the GPL and are designed explicitly for
23// closed-source distribution.
24//
25// Quantum Leaps contact information:
26// <www.state-machine.com/licensing>
27// <info@state-machine.com>
28//============================================================================
29#ifndef QP_HPP_
30#define QP_HPP_
31
32//============================================================================
33#define QP_VERSION_STR "8.1.2"
34#define QP_VERSION 812U
35// <VER>=812 <DATE>=251201
36#define QP_RELEASE 0x6A45C1C3U
37
38//----------------------------------------------------------------------------
39// default configuration settings
40//! @cond INTERNAL
41
42#ifndef QF_MAX_ACTIVE
43#define QF_MAX_ACTIVE 32U
44#endif
45
46#if (QF_MAX_ACTIVE > 64U)
47#error QF_MAX_ACTIVE exceeds the maximum of 64U;
48#endif
49
50#ifndef QF_MAX_TICK_RATE
51#define QF_MAX_TICK_RATE 1U
52#endif
53
54#if (QF_MAX_TICK_RATE > 15U)
55#error QF_MAX_TICK_RATE exceeds the maximum of 15U;
56#endif
57
58#ifndef QF_MAX_EPOOL
59#define QF_MAX_EPOOL 3U
60#endif
61
62#if (QF_MAX_EPOOL > 15U)
63#error QF_MAX_EPOOL exceeds the maximum of 15U;
64#endif
65
66#ifndef QF_TIMEEVT_CTR_SIZE
67#define QF_TIMEEVT_CTR_SIZE 4U
68#endif
69
70#if (QF_TIMEEVT_CTR_SIZE > 4U)
71#error QF_TIMEEVT_CTR_SIZE defined incorrectly, expected 1U, 2U, or 4U;
72#endif
73
74#ifndef QF_EVENT_SIZ_SIZE
75#define QF_EVENT_SIZ_SIZE 2U
76#endif
77
78#if (QF_EVENT_SIZ_SIZE > 4U)
79#error QF_EVENT_SIZ_SIZE defined incorrectly, expected 1U, 2U, or 4U;
80#endif
81
82//! @endcond
83
84//----------------------------------------------------------------------------
85// global types/utilities
86
87usingint_t = int;
88
89#define Q_UNUSED_PAR(par_) (static_cast<void>(par_))
90#define Q_DIM(array_) (sizeof(array_) / sizeof((array_)[0U]))
91#define Q_UINT2PTR_CAST(type_, uint_) (reinterpret_cast<type_ *>(uint_))
92
93//============================================================================
94namespaceQP {
95
96charconst *version()noexcept;
97
98usingQSignal = std::uint16_t;
99
100//----------------------------------------------------------------------------
101classQEvt {
102public:
103 std::uint32_tsig : 16;
104 std::uint32_tpoolNum_ : 8;
105 std::uint32_trefCtr_ : 8;
106 std::uint32_tfiller_;
107
108enumDynEvt: std::uint8_t {DYNAMIC };
109
110explicitconstexprQEvt(QSignalconst s) noexcept
111 :sig(s)// the provided event signal
112 ,poolNum_(0x00U)// no-pool event
113 ,refCtr_ (0xE0U)// special event "marker"
114 ,filler_ (0xE0E0E0E0U)// the "filler" ensures the same QEvt size
115// as in SafeQP/C++
116 {}
117
118QEvt()// disallow the default ctor
119 =delete;
120voidinit() const noexcept {
121// no event parameters to initialize
122 }
123voidinit(DynEvtconst dummy)constnoexcept {
124Q_UNUSED_PAR(dummy);
125// no event parameters to initialize
126 }
127};// class QEvt
128
129usingQEvtPtr =QEvtconst *;
130
131//----------------------------------------------------------------------------
132// QEP (hierarchical event processor) types
133
134usingQState = std::uint_fast8_t;
135
136classQXThread;// forward declaration
137
138usingQStateHandler =QState (*)(void *const me,QEvtconst *const e);
139usingQActionHandler =QState (*)(void *const me);
140usingQXThreadHandler = void (*)(QXThread *const me);
141
142structQMState {
148};
149
153};
154
161 std::uintptr_tuint;
162};
163
164constexprQSignalQ_USER_SIG {4U};
165
166//----------------------------------------------------------------------------
167classQAsm {
168public:
171
172// All possible values returned from state/action handlers...
173// NOTE: The numerical order is important for algorithmic correctness.
174staticconstexprQStateQ_RET_SUPER {0U};
175staticconstexprQStateQ_RET_UNHANDLED {1U};
176staticconstexprQStateQ_RET_HANDLED {2U};
177staticconstexprQStateQ_RET_TRAN {3U};
178staticconstexprQStateQ_RET_TRAN_HIST {4U};
179
180// used in QHsm only...
181staticconstexprQStateQ_RET_IGNORED {5U};
182
183// used in QMsm only...
184staticconstexprQStateQ_RET_ENTRY {6U};
185staticconstexprQStateQ_RET_EXIT {7U};
186staticconstexprQStateQ_RET_TRAN_INIT {8U};
187
188
189// Reserved signals by the QP-framework (used in QHsm only)
190staticconstexprQSignalQ_EMPTY_SIG {0U};
191staticconstexprQSignalQ_ENTRY_SIG {1U};
192staticconstexprQSignalQ_EXIT_SIG {2U};
193staticconstexprQSignalQ_INIT_SIG {3U};
194
195staticconstexprQStateQ_HANDLED() {// for coding QHsm state machines
196returnQ_RET_HANDLED; }
197staticconstexprQStateQ_UNHANDLED() {// for coding QHsm state machines
198returnQ_RET_UNHANDLED; }
199staticconstexprQStateQM_HANDLED() {// for coding QMsm state machines
200returnQ_RET_HANDLED; }
201staticconstexprQStateQM_UNHANDLED() {// for coding QMsm state machines
202returnQ_RET_HANDLED; }
203staticconstexprQStateQM_SUPER() {// for coding QMsm state machines
204returnQ_RET_SUPER; }
205staticconstexprQMStateconst *QM_STATE_NULL {nullptr };
206staticconstexprQActionHandlerconstQ_ACTION_NULL {nullptr };
207
208#ifdef Q_XTOR
209virtual~QAsm() noexcept {
210// empty
211 }
212#endif// def Q_XTOR
213virtualvoidinit(
214voidconst *const e,
215 std::uint_fast8_tconst qsId) = 0;
216virtualvoidinit(std::uint_fast8_tconst qsId);
217virtualvoiddispatch(
218QEvtconst *const e,
219 std::uint_fast8_tconst qsId) = 0;
220virtualboolisIn(QStateHandlerconst stateHndl) = 0;
221virtualQStateHandlergetStateHandler() const noexcept = 0;
222
223QStateHandlerstate() const noexcept {
224returnm_state.fun;// public "getter" for the state handler
225 }
226QMStateconst *stateObj() const noexcept {
227returnm_state.obj;// public "getter" for the state object
228 }
229
230staticQStatetop(void *const me,QEvtconst *const e)noexcept;
231
232protected:
233explicitQAsm() noexcept;
234
235QStatetran(QStateHandler const target) noexcept {
236// for coding QMsm state machines
237m_temp.fun = target;
238returnQ_RET_TRAN;
239 }
240QStatetran_hist(QStateHandlerconst hist)noexcept {
241// for coding QMsm state machines
242m_temp.fun = hist;
243returnQ_RET_TRAN_HIST;
244 }
245QStatesuper(QStateHandlerconst superstate)noexcept {
246// for coding QMsm state machines
247m_temp.fun = superstate;
248returnQ_RET_SUPER;
249 }
250QStateqm_tran(voidconst *const tatbl)noexcept {
251// for coding QMsm state machines
252m_temp.tatbl =static_cast<QP::QMTranActTableconst*>(tatbl);
253returnQ_RET_TRAN;
254 }
255QStateqm_tran_init(voidconst *const tatbl)noexcept {
256// for coding QMsm state machines
257m_temp.tatbl =static_cast<QP::QMTranActTableconst*>(tatbl);
258returnQ_RET_TRAN_INIT;
259 }
261QMStateconst *const hist,
262voidconst *const tatbl)noexcept
263 {// for coding QMsm state machines
264m_state.obj = hist;// store the history in state
265m_temp.tatbl =static_cast<QP::QMTranActTableconst*>(tatbl);
266returnQ_RET_TRAN_HIST;
267 }
268
269#ifdef Q_SPY
270QStateqm_entry(QMStateconst *const s)noexcept {
271// for coding QMsm state machines
272m_temp.obj = s;
273returnQ_RET_ENTRY;
274 }
275#else
276QStateqm_entry(QMStateconst *const s)constnoexcept {
277// for coding QMsm state machines
278static_cast<void>(s);// unused parameter
279returnQ_RET_ENTRY;
280 }
281#endif// Q_SPY
282
283#ifdef Q_SPY
284QStateqm_exit(QMStateconst *const s)noexcept {
285// for coding QMsm state machines
286m_temp.obj = s;
287returnQ_RET_EXIT;
288 }
289#else
290QStateqm_exit(QMStateconst *const s)constnoexcept {
291// for coding QMsm state machines
292static_cast<void>(s);// unused parameter
293returnQ_RET_EXIT;
294 }
295#endif// Q_SPY
296};// class QAsm
297
298//----------------------------------------------------------------------------
299classQHsm :publicQP::QAsm {
300protected:
301explicitQHsm(QStateHandlerconst initial)noexcept;
302
303public:
304usingQAsm::init;
305voidinit(
306voidconst *const e,
307 std::uint_fast8_tconst qsId)override;
308voiddispatch(
309QEvtconst *const e,
310 std::uint_fast8_tconst qsId)override;
311boolisIn(QStateHandlerconst stateHndl)noexceptoverride;
312QStateHandlergetStateHandler()constnoexceptoverride;
313
314QStateHandlerchildState(QStateHandlerconst parentHndl)noexcept;
315
316private:
317 std::int_fast8_ttran_simple_(
318QStateHandler *const path,
319 std::uint_fast8_tconst qsId);
320
321 std::int_fast8_ttran_complex_(
322QStateHandler *const path,
323 std::uint_fast8_tconst qsId);
324
326QStateHandler *const path,
327 std::int_fast8_tconst depth,
328 std::uint_fast8_tconst qsId);
329
330// friends...
331friendclassQS;
332};// class QHsm
333
334//----------------------------------------------------------------------------
335classQMsm :publicQP::QAsm {
336protected:
337explicitQMsm(QStateHandlerconst initial)noexcept;
338
339public:
340usingQAsm::init;
342voidconst *const e,
343 std::uint_fast8_tconst qsId)override;
345QEvtconst *const e,
346 std::uint_fast8_tconst qsId)override;
347boolisIn(QStateHandlerconst stateHndl)noexceptoverride;
348QStateHandlergetStateHandler() const noexcept override;
349
350QMState const *childStateObj(QMState const * const parentHndl)
351 const noexcept;
352 staticQMState const *topQMState() noexcept;
353
354private:
356QMTranActTable const * const tatbl,
357 std::uint_fast8_t const qsId);
359QMState const * const curr_state,
360QMState const * const tran_source,
361 std::uint_fast8_t const qsId);
363QMState const * const hist,
364 std::uint_fast8_t const qsId);
365
366// friends...
367 friend classQS;
368};// class QMsm
369
370}// namespace QP
371
372//============================================================================
373// QEP-macros
374
375#define Q_STATE_DECL(state_) \
376 QP::QState state_ ## _h(QP::QEvt const * const e); \
377 static QP::QState state_(void * const me, QP::QEvt const * const e)
378
379#define Q_STATE_DEF(subclass_, state_) \
380 QP::QState subclass_::state_(void * const me, QP::QEvt const * const e) { \
381 return static_cast<subclass_ *>(me)->state_ ## _h(e); } \
382 QP::QState subclass_::state_ ## _h(QP::QEvt const * const e)
383
384#define Q_EVT_CAST(subclass_) (static_cast<subclass_ const *>(e))
385#define Q_STATE_CAST(handler_) (reinterpret_cast<QP::QStateHandler>(handler_))
386
387#define QM_STATE_DECL(state_) \
388 QP::QState state_ ## _h(QP::QEvt const * const e); \
389 static QP::QState state_(void * const me, QP::QEvt const * const e); \
390 static QP::QMState const state_ ## _s
391
392#define QM_ACTION_DECL(action_) \
393 QP::QState action_ ## _h(); \
394 static QP::QState action_(void * const me)
395
396#define QM_STATE_DEF(subclass_, state_) \
397 QP::QState subclass_::state_(void * const me, QP::QEvt const * const e) {\
398 return static_cast<subclass_ *>(me)->state_ ## _h(e); } \
399 QP::QState subclass_::state_ ## _h(QP::QEvt const * const e)
400
401#define QM_ACTION_DEF(subclass_, action_) \
402 QP::QState subclass_::action_(void * const me) { \
403 return static_cast<subclass_ *>(me)->action_ ## _h(); } \
404 QP::QState subclass_::action_ ## _h()
405
406#ifdef Q_SPY
407 #define INIT(qsId_) init((qsId_))
408 #define DISPATCH(e_, qsId_) dispatch((e_), (qsId_))
409#else
410 #define INIT(dummy) init(0U)
411 #define DISPATCH(e_, dummy) dispatch((e_), 0U)
412#endif// ndef Q_SPY
413
414//============================================================================
415namespaceQP {
416
417usingQPrioSpec = std::uint16_t;
418
419classQEQueue;// forward declaration
420classQActive;// forward declaration
421
422#if (QF_TIMEEVT_CTR_SIZE == 1U)
423usingQTimeEvtCtr = std::uint8_t;
424#elif (QF_TIMEEVT_CTR_SIZE == 2U)
425usingQTimeEvtCtr = std::uint16_t;
426#elif (QF_TIMEEVT_CTR_SIZE == 4U)
427usingQTimeEvtCtr = std::uint32_t;
428#endif// (QF_TIMEEVT_CTR_SIZE == 4U)
429
430#if (QF_MAX_ACTIVE <= 8U)
431usingQPSetBits = std::uint8_t;
432#elif (8U < QF_MAX_ACTIVE) && (QF_MAX_ACTIVE <= 16U)
433usingQPSetBits = std::uint16_t;
434#elif (16 < QF_MAX_ACTIVE)
435usingQPSetBits = std::uint32_t;
436#endif// (16 < QF_MAX_ACTIVE)
437
438#ifndef QF_LOG2
439 std::uint_fast8_tQF_LOG2(QP::QPSetBitsconst bitmask)noexcept;
440#endif// ndef QF_LOG2
441
442//----------------------------------------------------------------------------
443classQPSet {
444private:
446#if (QF_MAX_ACTIVE > 32U)
448#endif
449
450public:
451voidsetEmpty() noexcept;
452boolisEmpty() const noexcept;
453boolnotEmpty() const noexcept;
454boolhasElement(std::uint_fast8_t const n) const noexcept;
455voidinsert(std::uint_fast8_t const n) noexcept;
456voidremove(std::uint_fast8_t const n) noexcept;
457 std::uint_fast8_tfindMax() const noexcept;
458
459// friends...
460 friend classQS;
461};// class QPSet
462
463//----------------------------------------------------------------------------
465private:
467
468// friends...
469friendclassQActive;
470friendclassQS;
471};// class QSubscrList
472
473//----------------------------------------------------------------------------
474// declarations for friendship with the QActive class
475
476namespaceQF {
477voidinit();
478voidstop();
479int_trun();
480
483
484constexpr std::uint_fast16_tNO_MARGIN {0xFFFFU};
485}// namespace QF
486
487//----------------------------------------------------------------------------
488classQActive :publicQAsm {
489private:
490 std::uint8_tm_prio;
491 std::uint8_tm_pthre;
492
493#ifdef QACTIVE_THREAD_TYPE
495#endif
496
497#ifdef QACTIVE_OS_OBJ_TYPE
499#endif
500
501#ifdef QACTIVE_EQUEUE_TYPE
503#endif
504
505protected:
506explicitQActive(QStateHandlerconst initial)noexcept;
507
508public:
509usingQAsm::init;
510voidinit(
511voidconst *const e,
512 std::uint_fast8_tconst qsId)override;
513voiddispatch(
514QEvtconst *const e,
515 std::uint_fast8_tconst qsId)override;
516boolisIn(QStateHandlerconst stateHndl)noexceptoverride;
517QStateHandlergetStateHandler() const noexcept override;
518
519QStateHandlerchildState(QStateHandler const parentHandler) noexcept;
521 std::uint32_t attr1,
522void const * attr2 =nullptr);
523voidstart(QPrioSpec const prioSpec,
524QEvtPtr * const qSto, std::uint_fast16_t const qLen,
525void * const stkSto, std::uint_fast16_t const stkSize,
526void const * const par =nullptr);
527
528#ifdef QACTIVE_CAN_STOP
529voidstop();
530#endif// def QACTIVE_CAN_STOP
531voidregister_() noexcept;
532voidunregister_() noexcept;
533voidpost_(QEvt const * const e,
534void const * const sender) noexcept
535 {
536// delegate to postx_() with margin==QF::NO_MARGIN
537static_cast<void>(postx_(e,QF::NO_MARGIN, sender));
538 }
539bool postx_(QEvtconst *const e,
540 std::uint_fast16_tconst margin,
541voidconst *const sender)noexcept;
542void postLIFO(QEvtconst *const e)noexcept;
543QEvtconst * get_() noexcept;
544 static std::uint16_t getQueueUse(
545 std::uint_fast8_t const prio) noexcept;
546 static std::uint16_t getQueueFree(
547 std::uint_fast8_t const prio) noexcept;
548 static std::uint16_t getQueueMin(
549 std::uint_fast8_t const prio) noexcept;
550 staticvoid psInit(
551QSubscrList * const subscrSto,
552QSignal const maxSignal) noexcept;
553 staticvoid publish_(
554QEvt const * const e,
555void const * const sender,
556 std::uint_fast8_t const qsId) noexcept;
557void subscribe(QSignal const sig) const noexcept;
558void unsubscribe(QSignal const sig) const noexcept;
559void unsubscribeAll() const noexcept;
560bool defer(
561QEQueue * const eq,
562QEvt const * const e) const noexcept;
563bool recall(QEQueue * const eq) noexcept;
564 std::uint16_t flushDeferred(
565QEQueue * const eq,
566 std::uint_fast16_t const num = 0xFFFFU) const noexcept;
567 constexpr std::uint8_tgetPrio() const noexcept {
568returnm_prio;// public "getter" for the AO's prio
569 }
570staticvoidevtLoop_(QActive *act);
571staticQActive *fromRegistry(std::uint_fast8_tconst prio);
572
573#ifdef QACTIVE_THREAD_TYPE
574constexprQACTIVE_THREAD_TYPEconst &getThread() const & {
575// ref-qualified reference (MISRA-C++:2023 Rule 6.8.4)
576returnm_thread;
577 }
579// ref-qualified reference (MISRA-C++:2023 Rule 6.8.4)
580 = delete;
581voidsetThread(QACTIVE_THREAD_TYPE const & thr) noexcept {
582m_thread = thr;// public "setter", useful for MPU applications
583 }
584#endif// QACTIVE_THREAD_TYPE
585
586#ifdef QACTIVE_OS_OBJ_TYPE
587constexprQACTIVE_OS_OBJ_TYPEconst &getOsObject() const & {
588// ref-qualified reference (MISRA-C++:2023 Rule 6.8.4)
589returnm_osObject;
590 }
592// ref-qualified reference (MISRA-C++:2023 Rule 6.8.4)
593 = delete;
594#endif// QACTIVE_OS_OBJ_TYPE
595
596#ifdef QF_ISR_API
597virtualboolpostFromISR(
598QEvtconst *const e,
599 std::uint_fast16_tconst margin,
600void * par,
601voidconst *const sender)noexcept;
602
604QEvtconst * e,
605void * par,
606voidconst * sender)noexcept;
607#endif// QF_ISR_API
608
609private:
610voidpostFIFO_(
611QEvtconst *const e,
612voidconst *const sender);
613staticvoidmulticast_(
614QPSet *const subscrSet,
615QEvtconst *const e,
616voidconst *const sender);
617
618// friends...
619friendclassQTimeEvt;
620friendclassQTicker;
621friendclassQXThread;
622friendclassQXMutex;
623friendclassQXSemaphore;
624friendclassQMActive;
625friendclassQActiveDummy;
626friendclassQK;
627friendclassQXK;
628friendclassQS;
629
630friendvoidQF::init();
631friendvoidQF::stop();
633friendvoidQF::onStartup();
634friendvoidQF::onCleanup();
635
636};// class QActive
637
638//----------------------------------------------------------------------------
639classQMActive :publicQActive {
640protected:
641explicitQMActive(QStateHandlerconst initial)noexcept;
642
643public:
644usingQActive::init;
645voidinit(
646voidconst *const e,
647 std::uint_fast8_tconst qsId)override;
648voiddispatch(
649QEvtconst *const e,
650 std::uint_fast8_tconst qsId)override;
651boolisIn(QStateHandlerconst stateHndl)noexceptoverride;
652QStateHandlergetStateHandler()constnoexceptoverride;
653
654QMStateconst *childStateObj(QMStateconst *const parent)constnoexcept;
655};// class QMActive
656
657//----------------------------------------------------------------------------
658#if (QF_MAX_TICK_RATE > 0U)
659
660classQTimeEvt :publicQEvt {
661private:
663void *m_act;
666 std::uint8_tm_tickRate;
667 std::uint8_tm_flags;
668
669public:
671QActive *const act,
672QSignalconstsig,
673 std::uint_fast8_tconst tickRate = 0U)noexcept;
674voidarmX(
675 std::uint32_tconst nTicks,
676 std::uint32_tconst interval = 0U)noexcept;
677booldisarm() noexcept;
678boolrearm(std::uint32_t const nTicks) noexcept;
679boolwasDisarmed() noexcept;
680void const *getAct() const & {
681// ref-qualified reference (MISRA-C++:2023 Rule 6.8.4)
682returnm_act;
683 }
684voidconst *getAct() const &&
685// ref-qualified reference (MISRA-C++:2023 Rule 6.8.4)
686 = delete;
687QTimeEvtCtrgetCtr() const noexcept {
688returnm_ctr;// public "getter" for the current time-evt count
689 }
690QTimeEvtCtrgetInterval() const noexcept {
691returnm_interval;// public "getter" for the time-evt interval
692 }
693 std::uint8_tgetTickRate() const noexcept {
694returnm_tickRate;// public "getter" for the time-evt tick rate
695 }
696staticvoid tick(
697 std::uint_fast8_tconst tickRate,
698voidconst *const sender)noexcept;
699
700#ifdef Q_UTEST
701staticvoid tick1_(
702 std::uint_fast8_tconst tickRate,
703voidconst *const sender);
704#endif// def Q_UTEST
705
706#ifdef QF_ISR_API
707staticvoidtickFromISR(
708 std::uint_fast8_tconst tickRate,
709void * par,
710voidconst * sender)noexcept;
711#endif// def QF_ISR_API
712staticboolnoActive(std::uint_fast8_tconst tickRate)noexcept;
713QActive *toActive() noexcept {
714// public "getter" for the AO associated with this time-evt
715returnstatic_cast<QActive *>(m_act);
716 }
717QTimeEvt *toTimeEvt() noexcept {
718// public "getter" for the AO associated with this time-evt
719// NOTE: used for the special time-evts in QTimeEvt_head_[] array
720returnstatic_cast<QTimeEvt *>(m_act);
721 }
722QTimeEvt() noexcept;
723
724private:
725QTimeEvt *expire_(
726QTimeEvt * const prev_link,
727QActive const * const act,
728 std::uint_fast8_t const tickRate) noexcept;
729
730// fiends...
731 friend classQXThread;
732 friend classQS;
733};// class QTimeEvt
734
735//----------------------------------------------------------------------------
736classQTicker : publicQActive {
737public:
738explicitQTicker(std::uint8_tconst tickRate)noexcept;
739usingQActive::init;
740voidinit(
741voidconst *const e,
742 std::uint_fast8_tconst qsId)override;
743voiddispatch(
744QEvtconst *const e,
745 std::uint_fast8_tconst qsId)override;
746voidtrig_(voidconst *const sender)noexcept;
747};// class QTicker
748
749#endif// (QF_MAX_TICK_RATE > 0U)
750
751//----------------------------------------------------------------------------
752namespaceQF {
753
754//! @deprecated
755inlinevoidpsInit(QSubscrList *const subscrSto,
756QSignalconst maxSignal)noexcept
757{
758// use QActive::psInit() instead of the deprecated QF::psInit()
759QActive::psInit(subscrSto, maxSignal);
760}
761
762//! @deprecated
763inlinevoidpublish_(QEvtconst *const e,
764voidconst *const sender, std::uint_fast8_tconst qsId)noexcept
765{
766// use QTimeEvt::tick() instead of the deprecated QF::tick()
767QActive::publish_(e, sender, qsId);
768}
769
770//! @deprecated
771staticinline std::uint_fast16_tgetQueueMin(
772 std::uint_fast8_tconst prio)noexcept
773{
774// use QActive::getQueueMin() instead of the deprecated QF::getQueueMin()
775returnQActive::getQueueMin(prio);
776}
777
778#if (QF_MAX_TICK_RATE > 0U)
779//! @deprecated
780inlinevoidtick(
781 std::uint_fast8_tconst tickRate,
782voidconst *const sender)noexcept
783{
784// use QTimeEvt::tick() instead of the deprecated QF::tick()
785QTimeEvt::tick(tickRate, sender);
786}
787#endif// (QF_MAX_TICK_RATE > 0U)
788
789//----------------------------------------------------------------------------
790// QF dynamic memory facilities
791void poolInit(
792void *const poolSto,
793 std::uint_fast32_tconst poolSize,
794 std::uint_fast16_tconst evtSize)noexcept;
795
796std::uint16_t poolGetMaxBlockSize() noexcept;
797std::uint16_tgetPoolUse(std::uint_fast8_t const poolNum) noexcept;
798std::uint16_tgetPoolFree(std::uint_fast8_t const poolNum) noexcept;
799std::uint16_tgetPoolMin(std::uint_fast8_t const poolNum) noexcept;
800QEvt *newX_(
801 std::uint_fast16_t const evtSize,
802 std::uint_fast16_t const margin,
803QSignal const sig) noexcept;
804voidgc(QEvt const * const e) noexcept;
805QEvt const *newRef_(
806QEvt const * const e,
807QEvt const * const evtRef) noexcept;
808
809voiddeleteRef_(QEvt const * const evtRef) noexcept;
810
811#ifndef QEVT_PAR_INIT
812template<class evtT_>
813inline evtT_ *q_new(QSignalconst sig) {
814// allocate a dynamic (mutable) event with NO_MARGIN
815// NOTE: the returned event ptr is guaranteed NOT to be nullptr
816returnstatic_cast<evtT_*>(
817QP::QF::newX_(sizeof(evtT_),QP::QF::NO_MARGIN, sig));
818 }
819template<class evtT_>
820inline evtT_ * q_new_x(std::uint_fast16_tconst margin,
821QSignalconst sig)
822 {
823// allocate a dynamic (mutable) event with a provided margin
824// NOTE: the returned event ptr is MIGHT be nullptr
825returnstatic_cast<evtT_*>(QP::QF::newX_(sizeof(evtT_), margin, sig));
826 }
827#else
828template<classevtT_,typename... Args>
829inline evtT_ *q_new(QSignalconst sig, Args... args) {
830// allocate a dynamic (mutable) event with NO_MARGIN
831// NOTE: the returned event ptr is guaranteed NOT to be nullptr
832 evtT_ *e =static_cast<evtT_*>(
833QP::QF::newX_(sizeof(evtT_),QP::QF::NO_MARGIN, sig));
834 e->init(args...);// immediately initialize the event (RAII)
835return e;
836 }
837template<classevtT_,typename... Args>
838inline evtT_ *q_new_x(std::uint_fast16_tconst margin,
839QSignalconst sig, Args... args)
840 {
841// allocate a dynamic (mutable) event with a provided margin
842// NOTE: the event allocation is MIGHT fail
843 evtT_ *e =
844static_cast<evtT_*>(QP::QF::newX_(sizeof(evtT_), margin, sig));
845if (e !=nullptr) {// was the allocation successfull?
846 e->init(args...);// immediately initialize the event (RAII)
847 }
848// NOTE: the returned event ptr is MIGHT be nullptr
849return e;
850 }
851#endif// QEVT_PAR_INIT
852
853template<class evtT_>
854inlinevoidq_new_ref(
855QP::QEvtconst *const e,
856 evtT_const *& evtRef)
857{
858// set the const event reference (must NOT be nullptr)
859 evtRef =static_cast<evtT_const*>(QP::QF::newRef_(e, evtRef));
860}
861
862template<class evtT_>
863inlinevoidq_delete_ref(evtT_const *& evtRef) {
864QP::QF::deleteRef_(evtRef);
865 evtRef =nullptr;// invalidate the associated event reference
866}
867
868#ifdef QF_ISR_API
869QEvt *newXfromISR_(
870 std::uint_fast16_tconst evtSize,
871 std::uint_fast16_tconst margin,
872QSignalconst sig)noexcept;
873voidgcFromISR(QEvtconst * e)noexcept;
874#endif// def QF_ISR_API
875
876}// namespace QF
877}// namespace QP
878
879//============================================================================
880extern"C" {
881
882//${QF-extern-C::QF_onContextSw} .............................................
883#ifdef QF_ON_CONTEXT_SW
884voidQF_onContextSw(
885QP::QActive * prev,
886QP::QActive * next);
887#endif// def QF_ON_CONTEXT_SW
888}// extern "C"
889
890//----------------------------------------------------------------------------
891// QF base facilities
892
893#define Q_PRIO(prio_, pthre_) \
894 (static_cast<QP::QPrioSpec>((prio_) | (pthre_) << 8U))
895
896#ifndef QEVT_PAR_INIT
897 #define Q_NEW(evtT_, sig_) (QP::QF::q_new<evtT_>((sig_)))
898 #define Q_NEW_X(evtT_, margin_, sig_) \
899 (QP::QF::q_new_x<evtT_>((margin_), (sig_)))
900#else
901 #define Q_NEW(evtT_, sig_, ...) \
902 (QP::QF::q_new<evtT_>((sig_), __VA_ARGS__))
903 #define Q_NEW_X(evtT_, margin_, sig_, ...) \
904 (QP::QF::q_new_x<evtT_>((margin_), (sig_), __VA_ARGS__))
905#endif// QEVT_PAR_INIT
906
907#define Q_NEW_REF(evtRef_, evtT_) (QP::QF::q_new_ref<evtT_>(e, (evtRef_)))
908#define Q_DELETE_REF(evtRef_) do { \
909 QP::QF::deleteRef_((evtRef_)); \
910 (evtRef_) = nullptr; \
911} while (false)
912
913#ifdef Q_SPY
914 #define PUBLISH(e_, sender_) \
915 publish_((e_), (sender_), (sender_)->getPrio())
916 #define POST(e_, sender_) post_((e_), (sender_))
917 #define POST_X(e_, margin_, sender_) \
918 postx_((e_), (margin_), (sender_))
919 #define TICK_X(tickRate_, sender_) tick((tickRate_), (sender_))
920 #define TRIG(sender_) trig_((sender_))
921#else
922 #define PUBLISH(e_, dummy) publish_((e_), nullptr, 0U)
923 #define POST(e_, dummy) post_((e_), nullptr)
924 #define POST_X(e_, margin_, dummy) postx_((e_), (margin_), nullptr)
925 #define TICK_X(tickRate_, dummy) tick((tickRate_), nullptr)
926 #define TRIG(sender_) trig_(nullptr)
927#endif// ndef Q_SPY
928
929#define TICK(sender_) TICK_X(0U, (sender_))
930
931#ifndef QF_CRIT_EXIT_NOP
932 #define QF_CRIT_EXIT_NOP() (static_cast<void>(0))
933#endif// ndef QF_CRIT_EXIT_NOP
934
935//----------------------------------------------------------------------------
936// memory protection facilities
937
938#ifdef QF_MEM_ISOLATE
939 #error Memory isolation not supported in this QP edition, need SafeQP
940#endif// def QF_MEM_ISOLATE
941
942#endif// QP_HPP_
Active object class (based on the QP::QHsm implementation strategy).
Definitionqp.hpp:488
friend class QActiveDummy
Definitionqp.hpp:625
virtual bool postFromISR(QEvt const *const e, std::uint_fast16_t const margin, void *par, void const *const sender) noexcept
The "FromISR" variant used in the QP port to "FreeRTOS".
QACTIVE_THREAD_TYPE m_thread
Port-dependent representation of the thread of the active object.
Definitionqp.hpp:494
static std::uint16_t getQueueMin(std::uint_fast8_t const prio) noexcept
Definitionqf_actq.cpp:368
void unregister_() noexcept
Un-register the active object from the framework.
Definitionqf_qact.cpp:116
friend class QTicker
Definitionqp.hpp:620
friend class QXMutex
Definitionqp.hpp:622
void init(void const *const e, std::uint_fast8_t const qsId) override
Virtual function to take the top-most initial transition in the state machine.
Definitionqf_qact.cpp:134
friend class QS
Definitionqp.hpp:628
static void multicast_(QPSet *const subscrSet, QEvt const *const e, void const *const sender)
Definitionqf_ps.cpp:127
void post_(QEvt const *const e, void const *const sender) noexcept
Posts an event e directly to the event queue of the active object using the First-In-First-Out (FIFO)...
Definitionqp.hpp:533
void register_() noexcept
Register this active object to be managed by the framework.
Definitionqf_qact.cpp:68
void postFIFO_(QEvt const *const e, void const *const sender)
Definitionqf_actq.cpp:261
static void publishFromISR(QEvt const *e, void *par, void const *sender) noexcept
The "FromISR" variant used in the QP port to "FreeRTOS".
static void publish_(QEvt const *const e, void const *const sender, std::uint_fast8_t const qsId) noexcept
Publish event to all subscribers of a given signal e->sig.
Definitionqf_ps.cpp:71
void stop()
Stops execution of an active object and removes it from the framework's supervision.
Definitionqutest.cpp:278
static void evtLoop_(QActive *act)
Event loop thread routine for executing an active object act (defined some in QP ports).
void setAttr(std::uint32_t attr1, void const *attr2=nullptr)
Generic setting of additional attributes (defined in some QP ports).
void dispatch(QEvt const *const e, std::uint_fast8_t const qsId) override
Virtual function to dispatch an event to the state machine.
Definitionqf_qact.cpp:142
constexpr QACTIVE_OS_OBJ_TYPE const & getOsObject() const &
Definitionqp.hpp:587
constexpr std::uint8_t getPrio() const noexcept
Definitionqp.hpp:567
bool isIn(QStateHandler const stateHndl) noexcept override
Virtual function to check whether the state machine is in a given state.
Definitionqf_qact.cpp:150
bool postx_(QEvt const *const e, std::uint_fast16_t const margin, void const *const sender) noexcept
Posts an event e directly to the event queue of the active object using the First-In-First-Out (FIFO)...
Definitionqf_actq.cpp:49
static QActive * fromRegistry(std::uint_fast8_t const prio)
Definitionqf_qact.cpp:160
friend class QXSemaphore
Definitionqp.hpp:623
QActive(QStateHandler const initial) noexcept
QActive constructor (abstract base class).
Definitionqf_qact.cpp:55
QACTIVE_EQUEUE_TYPE m_eQueue
Port-dependent event-queue type (often QP::QEQueue).
Definitionqp.hpp:502
QACTIVE_THREAD_TYPE const & getThread() const &&=delete
friend class QK
Definitionqp.hpp:626
QStateHandler childState(QStateHandler const parentHandler) noexcept
Definitionqf_qact.cpp:155
constexpr QACTIVE_THREAD_TYPE const & getThread() const &
Definitionqp.hpp:574
static void psInit(QSubscrList *const subscrSto, QSignal const maxSignal) noexcept
Publish event to all subscribers of a given signal e->sig.
Definitionqf_ps.cpp:51
friend class QTimeEvt
Definitionqp.hpp:619
void start(QPrioSpec const prioSpec, QEvtPtr *const qSto, std::uint_fast16_t const qLen, void *const stkSto, std::uint_fast16_t const stkSize, void const *const par=nullptr)
Starts execution of an active object and registers the object with the framework.
Definitionqv.cpp:212
QACTIVE_OS_OBJ_TYPE const & getOsObject() const &&=delete
void setThread(QACTIVE_THREAD_TYPE const &thr) noexcept
Definitionqp.hpp:581
QStateHandler getStateHandler() const noexcept override
Virtual method for getting the current state handler.
Definitionqf_qact.cpp:165
std::uint8_t m_pthre
Preemption-threshold [1..QF_MAX_ACTIVE] of this AO.
Definitionqp.hpp:491
QACTIVE_OS_OBJ_TYPE m_osObject
Port-dependent per-thread object.
Definitionqp.hpp:498
std::uint8_t m_prio
QF-priority [1..QF_MAX_ACTIVE] of this AO.
Definitionqp.hpp:490
friend class QMActive
Definitionqp.hpp:624
friend class QXThread
Definitionqp.hpp:621
friend class QXK
Definitionqp.hpp:627
Abstract State Machine class (state machine interface).
Definitionqp.hpp:167
QState qm_entry(QMState const *const s) noexcept
Internal helper function to execute state entry actions in QP::QMsm.
Definitionqp.hpp:270
QAsm() noexcept
Constructor of the QP::QAsm base class.
Definitionqf_act.cpp:75
QState qm_tran_hist(QMState const *const hist, void const *const tatbl) noexcept
Internal helper function to take a state transition to history in QP::QMsm.
Definitionqp.hpp:260
QStateHandler state() const noexcept
Definitionqp.hpp:223
static constexpr QState Q_RET_UNHANDLED
Definitionqp.hpp:175
QState qm_tran(void const *const tatbl) noexcept
Internal helper function to take a state transition in QP::QMsm.
Definitionqp.hpp:250
static constexpr QState Q_RET_TRAN
Definitionqp.hpp:177
static constexpr QState QM_SUPER()
Definitionqp.hpp:203
static constexpr QState Q_RET_ENTRY
Definitionqp.hpp:184
QState qm_exit(QMState const *const s) noexcept
Internal helper function to execute state exit actions in QP::QMsm.
Definitionqp.hpp:284
QState tran_hist(QStateHandler const hist) noexcept
Internal helper function to take a state transition to history in sublclasses of QP::QAsm.
Definitionqp.hpp:240
QState super(QStateHandler const superstate) noexcept
Internal helper function to indicate superstate of a given state in sublclasses of QP::QAsm.
Definitionqp.hpp:245
QState qm_tran_init(void const *const tatbl) noexcept
Definitionqp.hpp:255
QAsmAttr m_temp
Temporary storage for target/act-table etc.
Definitionqp.hpp:170
static constexpr QState Q_RET_IGNORED
Definitionqp.hpp:181
virtual bool isIn(QStateHandler const stateHndl)=0
Virtual function to check whether the state machine is in a given state.
static constexpr QState Q_RET_SUPER
Definitionqp.hpp:174
static constexpr QState Q_UNHANDLED()
Definitionqp.hpp:197
virtual QStateHandler getStateHandler() const noexcept=0
Virtual method for getting the current state handler.
static constexpr QState Q_RET_TRAN_INIT
Definitionqp.hpp:186
static constexpr QState Q_RET_TRAN_HIST
Definitionqp.hpp:178
static constexpr QState Q_RET_EXIT
Definitionqp.hpp:185
QMState const * stateObj() const noexcept
Definitionqp.hpp:226
static constexpr QState Q_HANDLED()
Definitionqp.hpp:195
virtual void init(void const *const e, std::uint_fast8_t const qsId)=0
Virtual function to take the top-most initial transition in the state machine.
QState tran(QStateHandler const target) noexcept
Internal helper function to take a state transition in sublclasses of QP::QAsm.
Definitionqp.hpp:235
static constexpr QState QM_UNHANDLED()
Definitionqp.hpp:201
virtual ~QAsm() noexcept
Virtual destructor of the QP::QAsm abstract base class.
Definitionqp.hpp:209
static constexpr QSignal Q_INIT_SIG
Definitionqp.hpp:193
static constexpr QActionHandler const Q_ACTION_NULL
Definitionqp.hpp:206
QAsmAttr m_state
Current state (pointer to the current state-handler function).
Definitionqp.hpp:169
virtual void dispatch(QEvt const *const e, std::uint_fast8_t const qsId)=0
Virtual function to dispatch an event to the state machine.
static constexpr QSignal Q_ENTRY_SIG
Definitionqp.hpp:191
static constexpr QSignal Q_EXIT_SIG
Definitionqp.hpp:192
static constexpr QSignal Q_EMPTY_SIG
Definitionqp.hpp:190
static constexpr QState Q_RET_HANDLED
Definitionqp.hpp:176
static constexpr QMState const * QM_STATE_NULL
Definitionqp.hpp:205
static QState top(void *const me, QEvt const *const e) noexcept
Top state handler that ignores all events.
Definitionqf_act.cpp:80
static constexpr QState QM_HANDLED()
Definitionqp.hpp:199
Native QF Event Queue.
Definitionqequeue.hpp:53
Event class.
Definitionqp.hpp:101
void init(DynEvt const dummy) const noexcept
Event initialization for dynamic events (overload).
Definitionqp.hpp:123
DynEvt
Definitionqp.hpp:108
@ DYNAMIC
Dummy parameter for dynamic event initialization (see QEvt::QEvt(DynEvt)).
Definitionqp.hpp:108
void init() const noexcept
Event initialization for dynamic events.
Definitionqp.hpp:120
std::uint32_t poolNum_
Event pool number of this event.
Definitionqp.hpp:104
constexpr QEvt(QSignal const s) noexcept
Event constexpr constructor applicable to immutable and mutable event instances.
Definitionqp.hpp:110
std::uint32_t refCtr_
Event reference counter.
Definitionqp.hpp:105
QEvt()=delete
Disallowed default event constructor.
std::uint32_t filler_
Member of QP::QEvt to make it identical size in QP/C++ and SafeQP/C++.
Definitionqp.hpp:106
std::uint32_t sig
Signal of the event (see Event Signal).
Definitionqp.hpp:103
friend class QS
Definitionqp.hpp:331
std::int_fast8_t tran_complex_(QStateHandler *const path, std::uint_fast8_t const qsId)
void dispatch(QEvt const *const e, std::uint_fast8_t const qsId) override
Virtual function to dispatch an event to the state machine.
Definitionqep_hsm.cpp:230
std::int_fast8_t tran_simple_(QStateHandler *const path, std::uint_fast8_t const qsId)
QStateHandler childState(QStateHandler const parentHndl) noexcept
Obtain the current active child state of a given parent in QP::QMsm.
Definitionqep_hsm.cpp:572
void init(void const *const e, std::uint_fast8_t const qsId) override
Virtual function to take the top-most initial transition in the state machine.
Definitionqep_hsm.cpp:154
QHsm(QStateHandler const initial) noexcept
Definitionqep_hsm.cpp:146
void enter_target_(QStateHandler *const path, std::int_fast8_t const depth, std::uint_fast8_t const qsId)
bool isIn(QStateHandler const stateHndl) noexcept override
Check whether the HSM is in a given state.
Definitionqep_hsm.cpp:542
QStateHandler getStateHandler() const noexcept override
Virtual method for getting the current state handler.
Definitionqep_hsm.cpp:603
QMActive(QStateHandler const initial) noexcept
Constructor of QP::QMActive class.
Definitionqf_qmact.cpp:48
QStateHandler getStateHandler() const noexcept override
Virtual method for getting the current state handler.
Definitionqf_qmact.cpp:85
bool isIn(QStateHandler const stateHndl) noexcept override
Virtual function to check whether the state machine is in a given state.
Definitionqf_qmact.cpp:74
void dispatch(QEvt const *const e, std::uint_fast8_t const qsId) override
Virtual function to dispatch an event to the state machine.
Definitionqf_qmact.cpp:66
void init(void const *const e, std::uint_fast8_t const qsId) override
Virtual function to take the top-most initial transition in the state machine.
Definitionqf_qmact.cpp:58
QMState const * childStateObj(QMState const *const parent) const noexcept
Definitionqf_qmact.cpp:79
QMState const * childStateObj(QMState const *const parentHndl) const noexcept
Obtain the current active child state of a given parent in QP::QMsm.
void exitToTranSource_(QMState const *const curr_state, QMState const *const tran_source, std::uint_fast8_t const qsId)
Exit the current state up to the explicit transition source.
friend class QS
Definitionqp.hpp:367
QState execTatbl_(QMTranActTable const *const tatbl, std::uint_fast8_t const qsId)
Execute transition-action table.
static QMState const * topQMState() noexcept
void dispatch(QEvt const *const e, std::uint_fast8_t const qsId) override
Virtual function to dispatch an event to the state machine.
QState enterHistory_(QMState const *const hist, std::uint_fast8_t const qsId)
Enter history of a composite state.
void init(void const *const e, std::uint_fast8_t const qsId) override
Virtual function to take the top-most initial transition in the state machine.
bool isIn(QStateHandler const stateHndl) noexcept override
Tests if a given state is part of the current active state configuration.
QMsm(QStateHandler const initial) noexcept
Constructor of QP::QMsm.
QStateHandler getStateHandler() const noexcept override
Obtain the current active state from a MSM (read only).
Set of Active Objects of up to QF_MAX_ACTIVE elements.
Definitionqp.hpp:443
std::uint_fast8_t findMax() const noexcept
Find the maximum element in the set.
Definitionqf_qact.cpp:273
friend class QS
Definitionqp.hpp:460
void remove(std::uint_fast8_t const n) noexcept
Remove element n from the priority-set (n = 1..QF_MAX_ACTIVE).
Definitionqf_qact.cpp:259
QPSetBits m_bits1
Bitmask for elements 33..64.
Definitionqp.hpp:447
bool notEmpty() const noexcept
Find out whether the priority-set is NOT empty.
Definitionqf_qact.cpp:224
bool hasElement(std::uint_fast8_t const n) const noexcept
Find out whether the priority-set has element n.
Definitionqf_qact.cpp:234
QPSetBits m_bits0
Bitmask for elements 1..32.
Definitionqp.hpp:445
void setEmpty() noexcept
Make the priority set empty.
Definitionqf_qact.cpp:207
bool isEmpty() const noexcept
Find out whether the priority-set is empty.
Definitionqf_qact.cpp:214
void insert(std::uint_fast8_t const n) noexcept
Insert element n into the priority-set (n = 1..QF_MAX_ACTIVE).
Definitionqf_qact.cpp:245
Subscriber List (for publish-subscribe).
Definitionqp.hpp:464
QPSet m_set
The set of AOs that subscribed to a given event signal.
Definitionqp.hpp:466
friend class QActive
Definitionqp.hpp:469
friend class QS
Definitionqp.hpp:470
void trig_(void const *const sender) noexcept
Asynchronously trigger the QTicker active object to perform tick processing.
Definitionqf_actq.cpp:447
void dispatch(QEvt const *const e, std::uint_fast8_t const qsId) override
Virtual function to dispatch an event to the state machine.
Definitionqf_actq.cpp:418
void init(void const *const e, std::uint_fast8_t const qsId) override
Virtual function to take the top-most initial transition in the state machine.
Definitionqf_actq.cpp:399
QTicker(std::uint8_t const tickRate) noexcept
Constructor of the QTicker Active Object class.
Definitionqf_actq.cpp:391
Time Event class.
Definitionqp.hpp:660
void const * getAct() const &&=delete
static void tick(std::uint_fast8_t const tickRate, void const *const sender) noexcept
Processes all armed time events at every clock tick.
Definitionqf_time.cpp:276
QTimeEvt * m_next
Link to the next time event in the list.
Definitionqp.hpp:662
QTimeEvt * toTimeEvt() noexcept
Definitionqp.hpp:717
friend class QS
Definitionqp.hpp:732
bool disarm() noexcept
Disarm a time event.
Definitionqf_time.cpp:148
std::uint8_t m_flags
Definitionqp.hpp:667
QTimeEvt(QActive *const act, QSignal const sig, std::uint_fast8_t const tickRate=0U) noexcept
The "extended" constructor to initialize a Time Event.
Definitionqf_time.cpp:54
QTimeEvtCtr getInterval() const noexcept
Definitionqp.hpp:690
static bool noActive(std::uint_fast8_t const tickRate) noexcept
Check if any time events are active at a given clock tick rate.
Definitionqf_time.cpp:360
static void tickFromISR(std::uint_fast8_t const tickRate, void *par, void const *sender) noexcept
void * m_act
Active object that receives the time events.
Definitionqp.hpp:663
QActive * toActive() noexcept
Definitionqp.hpp:713
std::uint8_t m_tickRate
Definitionqp.hpp:666
void armX(std::uint32_t const nTicks, std::uint32_t const interval=0U) noexcept
Arm a time event (extended version for one shot or periodic time event).
Definitionqf_time.cpp:80
QTimeEvtCtr getCtr() const noexcept
Get the current value of the down-counter of a time event.
Definitionqp.hpp:687
bool rearm(std::uint32_t const nTicks) noexcept
Rearm a time event.
Definitionqf_time.cpp:191
std::uint8_t getTickRate() const noexcept
Definitionqp.hpp:693
QTimeEvtCtr m_ctr
Down-counter of the time event.
Definitionqp.hpp:664
QTimeEvtCtr m_interval
Interval for periodic time event (zero for one-shot time event).
Definitionqp.hpp:665
void const * getAct() const &
Definitionqp.hpp:680
bool wasDisarmed() noexcept
Check the "was disarmed" status of a time event.
Definitionqf_time.cpp:261
friend class QXThread
Definitionqp.hpp:731
eXtended (blocking) thread of the QXK preemptive kernel
Definitionqxk.hpp:79
QF Active Object Framework namespace.
Definitionqp.hpp:476
void deleteRef_(QEvt const *const evtRef) noexcept
Definitionqf_dyn.cpp:378
void onCleanup()
Cleanup QF callback.
QEvt const * newRef_(QEvt const *const e, QEvt const *const evtRef) noexcept
Definitionqf_dyn.cpp:336
QEvt * newXfromISR_(std::uint_fast16_t const evtSize, std::uint_fast16_t const margin, QSignal const sig) noexcept
void gc(QEvt const *const e) noexcept
Recycle a mutable (mutable) event.
Definitionqf_dyn.cpp:276
QEvt * newX_(std::uint_fast16_t const evtSize, std::uint_fast16_t const margin, QSignal const sig) noexcept
Definitionqf_dyn.cpp:197
static std::uint_fast16_t getQueueMin(std::uint_fast8_t const prio) noexcept
This function returns the minimum of free entries of the given event queue.
Definitionqp.hpp:771
evtT_ * q_new_x(std::uint_fast16_t const margin, QSignal const sig, Args... args)
Definitionqp.hpp:838
void tick(std::uint_fast8_t const tickRate, void const *const sender) noexcept
Definitionqp.hpp:780
evtT_ * q_new(QSignal const sig, Args... args)
Definitionqp.hpp:829
void psInit(QSubscrList *const subscrSto, QSignal const maxSignal) noexcept
Definitionqp.hpp:755
void gcFromISR(QEvt const *e) noexcept
std::uint16_t getPoolUse(std::uint_fast8_t const poolNum) noexcept
constexpr std::uint_fast16_t NO_MARGIN
Special value of margin that causes asserting failure in case event allocation or event posting fails...
Definitionqp.hpp:484
void init()
QF initialization.
Definitionqv.cpp:96
void q_new_ref(QP::QEvt const *const e, evtT_ const *&evtRef)
Create a new reference of the current event e.
Definitionqp.hpp:854
std::uint16_t getPoolMin(std::uint_fast8_t const poolNum) noexcept
Obtain the minimum of free entries of the given event pool.
void q_delete_ref(evtT_ const *&evtRef)
Delete a new reference of the current event e.
Definitionqp.hpp:863
int_t run()
Transfers control to QF to run the application.
Definitionqv.cpp:109
void stop()
Invoked by the application layer to stop the QF framework and return control to the OS/Kernel (used i...
Definitionqv.cpp:103
std::uint16_t getPoolFree(std::uint_fast8_t const poolNum) noexcept
void publish_(QEvt const *const e, void const *const sender, std::uint_fast8_t const qsId) noexcept
Definitionqp.hpp:763
void onStartup()
Startup QF callback.
QP/C++ Framework namespace.
Definitionqequeue.hpp:36
constexpr QSignal Q_USER_SIG
Definitionqp.hpp:164
std::uint32_t QTimeEvtCtr
Data type to store the block-size defined based on the macro QF_TIMEEVT_CTR_SIZE.
Definitionqp.hpp:427
QState(*)(void *const me) QActionHandler
Pointer to an action-handler function.
Definitionqp.hpp:139
char const * version() noexcept
Definitionqf_act.cpp:52
std::uint_fast8_t QF_LOG2(QP::QPSetBits const bitmask) noexcept
Definitionqf_qact.cpp:172
QEvt const * QEvtPtr
Pointer to const event instances passed around in QP/C++ Framework.
Definitionqp.hpp:129
std::uint_fast8_t QState
Type returned from state-handler functions.
Definitionqp.hpp:134
QState(*)(void *const me, QEvt const *const e) QStateHandler
Pointer to a state-handler function.
Definitionqp.hpp:138
std::uint32_t QPSetBits
Bitmask for the internal representation of QPSet elements.
Definitionqp.hpp:435
std::uint16_t QSignal
The signal of event QP::QEvt.
Definitionqp.hpp:98
void(*)(QXThread *const me) QXThreadHandler
Pointer to an extended-thread handler function.
Definitionqp.hpp:140
std::uint16_t QPrioSpec
Priority specification for Active Objects in QP.
Definitionqp.hpp:417
int int_t
Alias for assertion-ID numbers in QP assertions and return from QP::QF::run().
Definitionqp.hpp:87
#define Q_UNUSED_PAR(par_)
Helper macro to clearly mark unused parameters of functions.
Definitionqp.hpp:89
void QF_onContextSw(QP::QActive *prev, QP::QActive *next)
#define QACTIVE_OS_OBJ_TYPE
QP::QActive "OS-object" type used in various QP/C++ ports.
Definitionqp_port.hpp:31
#define QACTIVE_EQUEUE_TYPE
QP::QActive event queue type used in various QP/C++ ports.
Definitionqp_port.hpp:28
#define QACTIVE_THREAD_TYPE
QP::QActive "thread" type used in various QP/C++ ports.
Definitionqp_port.hpp:34
State object for the QP::QMsm class (QM State Machine).
Definitionqp.hpp:142
QActionHandler const entryAction
Definitionqp.hpp:145
QStateHandler const stateHandler
Definitionqp.hpp:144
QActionHandler const exitAction
Definitionqp.hpp:146
QMState const * superstate
Definitionqp.hpp:143
QActionHandler const initAction
Definitionqp.hpp:147
Transition-Action Table for the QP::QMsm State Machine.
Definitionqp.hpp:150
QMState const * target
Definitionqp.hpp:151
QActionHandler const act[1]
Definitionqp.hpp:152
Attribute of for the QP::QAsm class (Abstract State Machine).
Definitionqp.hpp:155
std::uintptr_t uint
Definitionqp.hpp:161
QMState const * obj
Definitionqp.hpp:159
QStateHandler fun
Definitionqp.hpp:156
QMTranActTable const * tatbl
Definitionqp.hpp:160
QXThreadHandler thr
Definitionqp.hpp:158
QActionHandler act
Definitionqp.hpp:157

[8]ページ先頭

©2009-2025 Movatter.jp