QP/C++  7.0.1
Real-Time Embedded Framework
qs.hpp
Go to the documentation of this file.
1//============================================================================
2// QP/C++ Real-Time Embedded Framework (RTEF)
3// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved.
4//
5// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-QL-commercial
6//
7// This software is dual-licensed under the terms of the open source GNU
8// General Public License version 3 (or any later version), or alternatively,
9// under the terms of one of the closed source Quantum Leaps commercial
10// licenses.
11//
12// The terms of the open source GNU General Public License version 3
13// can be found at: <www.gnu.org/licenses/gpl-3.0>
14//
15// The terms of the closed source Quantum Leaps commercial licenses
16// can be found at: <www.state-machine.com/licensing>
17//
18// Redistributions in source code must retain this top-level comment block.
19// Plagiarizing this software to sidestep the license obligations is illegal.
20//
21// Contact information:
22// <www.state-machine.com>
23// <info@state-machine.com>
24//============================================================================
30
31#ifndef QS_HPP
32#define QS_HPP
33
34#ifndef Q_SPY
35 #error "Q_SPY must be defined to include qs.hpp"
36#endif
37
38//============================================================================
39namespace QP {
40
41#if (QS_TIME_SIZE == 1U)
42 using QSTimeCtr = std::uint8_t;
43#elif (QS_TIME_SIZE == 2U)
44 using QSTimeCtr = std::uint16_t;
45#elif (QS_TIME_SIZE == 4U)
47 // range of QS time stamps
48 //
49 using QSTimeCtr = std::uint32_t;
50#endif
51
53using QSCtr = std::uint_fast16_t;
54
57struct QSrx {
58 void *currObj[8];
59 std::uint8_t *buf;
61 QSCtr volatile head;
62 QSCtr volatile tail;
63#ifdef Q_UTEST
66#endif
67};
68
74class QS {
75public:
99 static void initBuf(std::uint8_t * const sto,
100 std::uint_fast16_t const stoSize) noexcept;
101
122 static void glbFilter_(std::int_fast16_t const filter) noexcept;
123
144 static void locFilter_(std::int_fast16_t const filter) noexcept;
145
154 static void beginRec_(std::uint_fast8_t const rec) noexcept;
155
164 static void endRec_(void) noexcept;
165
166 // raw (unformatted) output of data elements .............................
167
169 static void u8_raw_(std::uint8_t const d) noexcept;
170
172 static void u8u8_raw_(std::uint8_t const d1,
173 std::uint8_t const d2) noexcept;
174
176 static void u16_raw_(std::uint16_t d) noexcept;
177
179 static void u32_raw_(std::uint32_t d) noexcept;
180
182 static void obj_raw_(void const * const obj) noexcept;
183
185 static void str_raw_(char const *s) noexcept;
186
187
188 // formatted data elements output ........................................
189
196 static void u8_fmt_(std::uint8_t const format,
197 std::uint8_t const d) noexcept;
198
205 static void u16_fmt_(std::uint8_t format, std::uint16_t d) noexcept;
206
212 static void u32_fmt_(std::uint8_t format, std::uint32_t d) noexcept;
213
219 static void f32_fmt_(std::uint8_t format, float32_t const d) noexcept;
220
226 static void f64_fmt_(std::uint8_t format, float64_t const d) noexcept;
227
233 static void str_fmt_(char const *s) noexcept;
234
240 static void mem_fmt_(std::uint8_t const *blk, std::uint8_t size) noexcept;
241
247 static void u64_raw_(std::uint64_t d) noexcept;
248
254 static void u64_fmt_(std::uint8_t format, std::uint64_t d) noexcept;
255
261 static void sig_dict_pre_(enum_t const sig, void const * const obj,
262 char const * const name) noexcept;
263
269 static void obj_dict_pre_(void const * const obj,
270 char const * const name) noexcept;
271
277 static void obj_arr_dict_pre_(void const * const obj,
278 std::uint_fast16_t const idx,
279 char const * const name) noexcept;
280
282 static void fun_dict_pre_(void (* const fun)(void),
283 char const * const name) noexcept;
284
290 static void usr_dict_pre_(enum_t const rec,
291 char const * const name) noexcept;
292
317 static void rxInitBuf(std::uint8_t * const sto,
318 std::uint16_t const stoSize) noexcept;
319
321 static void rxParse(void);
322
333 static std::uint16_t rxGetNfree(void) noexcept;
334
336 static bool rxPut(std::uint8_t const b) noexcept;
337
343 static void setCurrObj(std::uint8_t obj_kind, void *obj_ptr) noexcept;
344
352 static void queryCurrObj(std::uint8_t obj_kind) noexcept;
353
354 // QS buffer access ......................................................
368 static std::uint16_t getByte(void) noexcept;
369
396 static std::uint8_t const *getBlock(
397 std::uint16_t * const pNbytes) noexcept;
398
399 // platform-dependent callback functions to be implemented by clients ....
400
402 static bool onStartup(void const *arg);
403
405 static void onCleanup(void);
406
408 static void onFlush(void);
409
411 static QSTimeCtr onGetTime(void);
412
414 static void onReset(void);
415
417 static void onCommand(std::uint8_t cmdId,
418 std::uint32_t param1,
419 std::uint32_t param2,
420 std::uint32_t param3);
421
423 static void rxHandleGoodFrame_(std::uint8_t const state);
424
426 static void assertion_pre_(char const * const module, int_t const loc,
427 std::uint32_t const delay);
428
430 static void crit_entry_pre_(void);
431
433 static void crit_exit_pre_(void);
434
436 static void isr_entry_pre_(std::uint8_t const isrnest,
437 std::uint8_t const prio);
438
440 static void isr_exit_pre_(std::uint8_t const isrnest,
441 std::uint8_t const prio);
442
443#ifdef Q_UTEST
445 static void onTestSetup(void);
446
448 static void onTestTeardown(void);
449
451 static void onTestEvt(QEvt *e);
452
453 // callback to examine an event that is about to be posted
454 static void onTestPost(void const *sender, QActive *recipient,
455 QEvt const *e, bool status);
456
458 static void onTestLoop(void);
459
461 static void processTestEvts_(void);
462
464 static void tickX_(std::uint_fast8_t const tickRate,
465 void const * const sender) noexcept;
466
481 static std::uint32_t getTestProbe_(void (* const api)(void)) noexcept;
482
484 static void test_pause_(void);
485
486#endif // Q_UTEST
487
493 enum QSType : std::uint8_t {
509 HEX_FMT
510 };
511
513 enum QSpyObjKind : std::uint8_t {
520 MAX_OBJ
521 };
522
523 enum OSpyObjCombnation : std::uint8_t {
525 };
526
529 template<typename T_OUT, typename T_IN>
530 static T_OUT force_cast(T_IN in) {
531 union TCast {
532 T_IN in;
533 T_OUT out;
534 } u = { in };
535 return u.out;
536 }
537
538 // private QS attributes .................................................
539 std::uint8_t glbFilter[16];
540 std::uint8_t locFilter[16];
541 void const *locFilter_AP;
542 std::uint8_t *buf;
544 QSCtr volatile head;
545 QSCtr volatile tail;
546 QSCtr volatile used;
547 std::uint8_t volatile seq;
548 std::uint8_t volatile chksum;
549
550 std::uint_fast8_t volatile critNest;
551
552 static QS priv_;
553
554 static QSrx rxPriv_;
555};
556
571enum QSpyRecords : std::int8_t {
572 // [0] QS session (not maskable)
574
575 // [1] SM records
585
586 // [10] Active Object (AO) records
596
597 // [19] Event Queue (EQ) records
602
603 // [23] Framework (QF) records */
605
606 // [24] Memory Pool (MP) records
609
610 // [26] Additional Framework (QF) records
617
618 // [32] Time Event (TE) records
625
626 // [38] Additional Framework (QF) records
634
635 // [45] Additional Active Object (AO) records
637
638 // [46] Additional Event Queue (EQ) records
640
641 // [47] Additional Memory Pool (MP) records
643
644 // [48] Scheduler (SC) records
652
653 // [55] Additional QEP records
657
658 // [58] Miscellaneous QS records (not maskable)
672};
673
675enum QSpyUserOffsets : std::int16_t {
676 QS_USER = 100,
682};
683
685enum QSpyRecordGroups : std::int16_t {
686 QS_ALL_RECORDS = static_cast<std::uint8_t>(0xF0U),
701
703enum QSpyIdOffsets : std::int16_t {
705 QS_EP_ID = 64,
706 QS_EQ_ID = 80,
707 QS_AP_ID = 96,
708};
709
711enum QSpyIdGroups : std::int16_t {
712 QS_ALL_IDS = 0xF0,
717};
718
720struct QSpyId {
721 std::uint8_t m_prio;
722 std::uint_fast8_t getPrio(void) const noexcept {
723 return static_cast<std::uint_fast8_t>(m_prio);
724 }
725};
726
727} // namespace QP ************************************************************
728
729#ifndef QS_TIME_SIZE
730
738
739 #define QS_TIME_SIZE 4U
740#endif
741
742#if (QS_TIME_SIZE == 1U)
743 #define QS_TIME_PRE_() (QP::QS::u8_raw_(QP::QS::onGetTime()))
744#elif (QS_TIME_SIZE == 2U)
745 #define QS_TIME_PRE_() (QP::QS::u16_raw_(QP::QS::onGetTime()))
746#elif (QS_TIME_SIZE == 4U)
748 #define QS_TIME_PRE_() (QP::QS::u32_raw_(QP::QS::onGetTime()))
749#else
750 #error "QS_TIME_SIZE defined incorrectly, expected 1U, 2U, or 4U"
751#endif
752
753//============================================================================
754namespace QP {
755
758constexpr std::uint16_t QS_EOD = 0xFFFFU;
759
760//============================================================================
761// QS receive channel
762
763inline bool QS::rxPut(std::uint8_t const b) noexcept {
764 QSCtr head = rxPriv_.head + 1U;
765 if (head == rxPriv_.end) {
766 head = 0U;
767 }
768 if (head != rxPriv_.tail) { // buffer NOT full?
769 rxPriv_.buf[rxPriv_.head] = b;
770 rxPriv_.head = head;
771 return true; // byte placed in the buffer
772 }
773 else {
774 return false; // byte NOT placed in the buffer
775 }
776}
777
778//============================================================================
779#ifdef Q_UTEST
780
787class QHsmDummy : public QHsm {
788public:
789 QHsmDummy(void); // ctor
790
791 void init(void const * const e,
792 std::uint_fast8_t const qs_id) noexcept override;
793 void init(std::uint_fast8_t const qs_id) noexcept override;
794 void dispatch(QEvt const * const e,
795 std::uint_fast8_t const qs_id) noexcept override;
796};
797
804class QActiveDummy : public QActive {
805public:
806 QActiveDummy(void); // ctor
807
808 void start(std::uint_fast8_t const prio,
809 QEvt const * * const qSto, std::uint_fast16_t const qLen,
810 void * const stkSto, std::uint_fast16_t const stkSize,
811 void const * const par) override;
812
814 void start(std::uint_fast8_t const prio,
815 QEvt const * * const qSto, std::uint_fast16_t const qLen,
816 void * const stkSto, std::uint_fast16_t const stkSize) override
817 {
818 start(prio, qSto, qLen, stkSto, stkSize, nullptr);
819 }
820
821 void init(void const * const e,
822 std::uint_fast8_t const qs_id) noexcept override;
823 void init(std::uint_fast8_t const qs_id) noexcept override;
824 void dispatch(QEvt const * const e,
825 std::uint_fast8_t const qs_id) noexcept override;
826 bool post_(QEvt const * const e,
827 std::uint_fast16_t const margin,
828 void const * const sender) noexcept override;
829 void postLIFO(QEvt const * const e) noexcept override;
830};
831
832constexpr std::uint8_t QUTEST_ON_POST {124U};
833
834// interrupt nesting up-down counter
835extern std::uint8_t volatile QF_intNest;
836
837#endif // Q_UTEST
838
839} // namespace QP
840
841//============================================================================
842// Macros for adding QS instrumentation to the client code
843
851#define QS_INIT(arg_) (QP::QS::onStartup(arg_))
852
859#define QS_EXIT() (QP::QS::onCleanup())
860
874#define QS_GLB_FILTER(rec_) \
875 (QP::QS::glbFilter_(static_cast<std::int_fast16_t>(rec_)))
876
888#define QS_LOC_FILTER(qs_id_) \
889 (QP::QS::locFilter_(static_cast<std::int_fast16_t>(qs_id_)))
890
891//============================================================================
892// Macros to generate application-specific (user) QS records
893
905#define QS_BEGIN_ID(rec_, qs_id_) \
906 if (QS_GLB_CHECK_(rec_) && QS_LOC_CHECK_(qs_id_)) { \
907 QS_CRIT_STAT_ \
908 QS_CRIT_E_(); \
909 QP::QS::beginRec_(static_cast<std::uint_fast8_t>(rec_)); \
910 QS_TIME_PRE_();
911
915#define QS_END() \
916 QP::QS::endRec_(); \
917 QS_CRIT_X_(); \
918 }
919
921#define QS_BEGIN_NOCRIT(rec_, qs_id_) \
922 if (QS_GLB_CHECK_(rec_) && QS_LOC_CHECK_(qs_id_)) { \
923 QP::QS::beginRec_(rec_); \
924 QS_TIME_PRE_();
925
927#define QS_END_NOCRIT() \
928 QP::QS::endRec_(); \
929 }
930
931#ifndef QS_REC_DONE
933 #define QS_REC_DONE() (static_cast<void>(0))
934#endif // QS_REC_DONE
935
937#define QS_GLB_CHECK_(rec_) \
938 ((static_cast<std::uint_fast8_t>(QP::QS::priv_.glbFilter[ \
939 static_cast<std::uint_fast8_t>(rec_) >> 3U]) \
940 & (static_cast<std::uint_fast8_t>(1U) \
941 << (static_cast<std::uint_fast8_t>(rec_) & 7U))) != 0U)
942
944#define QS_LOC_CHECK_(qs_id_) \
945 ((static_cast<std::uint_fast8_t>(QP::QS::priv_.locFilter \
946 [static_cast<std::uint_fast8_t>(qs_id_) >> 3U]) \
947 & (static_cast<std::uint_fast8_t>(1U) \
948 << (static_cast<std::uint_fast8_t>(qs_id_) & 7U))) != 0U)
949
950//============================================================================
951// Facilities for QS ciritical section
952
953// QS-specific critical section
954#ifdef QS_CRIT_ENTRY // separate QS critical section defined?
955
956#ifndef QS_CRIT_STAT_TYPE
957 #define QS_CRIT_STAT_
958 #define QS_CRIT_E_() QS_CRIT_ENTRY(dummy)
959 #define QS_CRIT_X_() QS_CRIT_EXIT(dummy); QS_REC_DONE()
960#else
961 #define QS_CRIT_STAT_ QS_CRIT_STAT_TYPE critStat_;
962 #define QS_CRIT_E_() QS_CRIT_ENTRY(critStat_)
963 #define QS_CRIT_X_() QS_CRIT_EXIT(critStat_); QS_REC_DONE()
964#endif // QS_CRIT_STAT_TYPE
965
966#else // separate QS critical section not defined--use the QF definition
967#ifndef QF_CRIT_STAT_TYPE
978 #define QS_CRIT_STAT_
979
989 #define QS_CRIT_E_() QF_CRIT_ENTRY(dummy)
990
1000 #define QS_CRIT_X_() QF_CRIT_EXIT(dummy); QS_REC_DONE()
1001
1002#elif (!defined QS_CRIT_STAT_)
1003 #define QS_CRIT_STAT_ QF_CRIT_STAT_TYPE critStat_;
1004 #define QS_CRIT_E_() QF_CRIT_ENTRY(critStat_)
1005 #define QS_CRIT_X_() QF_CRIT_EXIT(critStat_); QS_REC_DONE()
1006#endif // simple unconditional interrupt disabling used
1007
1008#endif // separate QS critical section not defined
1009
1010//============================================================================
1011// Macros for use in the client code
1012
1014#define QS_I8(width_, data_) \
1015 (QP::QS::u8_fmt_(static_cast<std::uint8_t>( \
1016 (static_cast<std::uint8_t>((width_) << 4)) \
1017 | static_cast<std::uint8_t>(QP::QS::I8_T)), (data_)))
1018
1020#define QS_U8(width_, data_) \
1021 (QP::QS::u8_fmt_(static_cast<std::uint8_t>( \
1022 (static_cast<std::uint8_t>((width_) << 4)) \
1023 | static_cast<std::uint8_t>(QP::QS::U8_T)), (data_)))
1024
1026#define QS_I16(width_, data_) \
1027 (QP::QS::u16_fmt_(static_cast<std::uint8_t>( \
1028 (static_cast<std::uint8_t>((width_) << 4)) \
1029 | static_cast<std::uint8_t>(QP::QS::I16_T)), (data_)))
1030
1032#define QS_U16(width_, data_) \
1033 (QP::QS::u16_fmt_(static_cast<std::uint8_t>((((width_) << 4)) \
1034 | static_cast<std::uint8_t>(QP::QS::U16_T)), (data_)))
1035
1037#define QS_I32(width_, data_) \
1038 (QP::QS::u32_fmt_( \
1039 static_cast<std::uint8_t>((static_cast<std::uint8_t>((width_) << 4)) \
1040 | static_cast<std::uint8_t>(QP::QS::I32_T)), (data_)))
1041
1043#define QS_U32(width_, data_) \
1044 (QP::QS::u32_fmt_(static_cast<std::uint8_t>( \
1045 (static_cast<std::uint8_t>((width_) << 4)) \
1046 | static_cast<std::uint8_t>(QP::QS::U32_T)), (data_)))
1047
1049#define QS_I64(width_, data_) \
1050 (QP::QS::u64_fmt_(static_cast<std::uint8_t>( \
1051 (static_cast<std::uint8_t>((width_) << 4)) \
1052 | static_cast<std::uint8_t>(QP::QS::I64_T)), (data_)))
1053
1055#define QS_U64(width_, data_) \
1056 (QP::QS::u64_fmt_(static_cast<std::uint8_t>( \
1057 (static_cast<std::uint8_t>((width_) << 4)) \
1058 | static_cast<std::uint8_t>(QP::QS::U64_T)), (data_)))
1059
1061#define QS_F32(width_, data_) \
1062 (QP::QS::f32_fmt_(static_cast<std::uint8_t>( \
1063 (static_cast<std::uint8_t>((width_) << 4)) \
1064 | static_cast<std::uint8_t>(QP::QS::F32_T)), (data_)))
1065
1067#define QS_F64(width_, data_) \
1068 (QP::QS::f64_fmt_(static_cast<std::uint8_t>( \
1069 (static_cast<std::uint8_t>((width_) << 4)) \
1070 | static_cast<std::uint8_t>(QP::QS::F64_T)), (data_)))
1071
1073#define QS_STR(str_) (QP::QS::str_fmt_(str_))
1074
1076#define QS_MEM(mem_, size_) (QP::QS::mem_fmt_((mem_), (size_)))
1077
1078
1079#if (QS_OBJ_PTR_SIZE == 1U)
1080 #define QS_OBJ(obj_) (QP::QS::u8_fmt_(QP::QS::OBJ_T, \
1081 reinterpret_cast<std::uint8_t>(obj_)))
1082#elif (QS_OBJ_PTR_SIZE == 2U)
1083 #define QS_OBJ(obj_) (QP::QS::u16_fmt_(QP::QS::OBJ_T, \
1084 reinterpret_cast<std::uint16_t>(obj_)))
1085#elif (QS_OBJ_PTR_SIZE == 4U)
1086 #define QS_OBJ(obj_) (QP::QS::u32_fmt_(QP::QS::OBJ_T, \
1087 reinterpret_cast<std::uint32_t>(obj_)))
1088#elif (QS_OBJ_PTR_SIZE == 8U)
1089 #define QS_OBJ(obj_) (QP::QS::u64_fmt_(QP::QS::OBJ_T, \
1090 reinterpret_cast<std::uint64_t>(obj_)))
1091#else
1093 #define QS_OBJ(obj_) (QP::QS::u32_fmt_(QP::QS::OBJ_T, \
1094 reinterpret_cast<std::uint32_t>(obj_)))
1095#endif
1096
1097
1098#if (QS_FUN_PTR_SIZE == 1U)
1099 #define QS_FUN(fun_) (QP::QS::u8_fmt_(QP::QS::FUN_T, \
1100 reinterpret_cast<std::uint8_t>(fun_)))
1101#elif (QS_FUN_PTR_SIZE == 2U)
1102 #define QS_FUN(fun_) (QP::QS::u16_fmt_(QP::QS::FUN_T, \
1103 reinterpret_cast<std::uint16_t>(fun_)))
1104#elif (QS_FUN_PTR_SIZE == 4U)
1105 #define QS_FUN(fun_) (QP::QS::u32_fmt_(QP::QS::FUN_T, \
1106 reinterpret_cast<std::uint32_t>(fun_)))
1107#elif (QS_FUN_PTR_SIZE == 8U)
1108 #define QS_FUN(fun_) (QP::QS::u64_fmt_(QP::QS::FUN_T, \
1109 reinterpret_cast<std::uint64_t>(fun_)))
1110#else
1112 #define QS_FUN(fun_) (QP::QS::u32_fmt_(QP::QS::FUN_T, \
1113 reinterpret_cast<std::uint32_t>(fun_)))
1114#endif
1115
1116
1117#if (Q_SIGNAL_SIZE == 1U)
1118 #define QS_SIG(sig_, obj_) \
1119 QP::QS::u8_fmt_(QP::QS::SIG_T, static_cast<std::uint8_t>(sig_)); \
1120 QP::QS::obj_raw_(obj_)
1121#elif (Q_SIGNAL_SIZE == 2U)
1122 #define QS_SIG(sig_, obj_) \
1123 QP::QS::u16_fmt_(QP::QS::SIG_T, static_cast<std::uint16_t>(sig_)); \
1124 QP::QS::obj_raw_(obj_)
1125#elif (Q_SIGNAL_SIZE == 4U)
1126 #define QS_SIG(sig_, obj_) \
1127 QP::QS::u32_fmt_(QP::QS::SIG_T, static_cast<std::uint32_t>(sig_)); \
1128 QP::QS::obj_raw_(obj_)
1129#else
1132 #define QS_SIG(sig_, obj_) \
1133 QP::QS::u16_fmt_(QP::QS::SIG_T, static_cast<std::uint16_t>(sig_)); \
1134 QP::QS::obj_raw_(obj_)
1135#endif
1136
1137//============================================================================
1178#define QS_SIG_DICTIONARY(sig_, obj_) \
1179 (QP::QS::sig_dict_pre_((sig_), (obj_), #sig_))
1180
1194#define QS_OBJ_DICTIONARY(obj_) \
1195 (QP::QS::obj_dict_pre_((obj_), #obj_))
1196
1211#define QS_OBJ_ARR_DICTIONARY(obj_, idx_) \
1212 (QP::QS::obj_arr_dict_pre_((obj_), (idx_), #obj_))
1213
1226#define QS_FUN_DICTIONARY(fun_) \
1227 (QP::QS::fun_dict_pre_( \
1228 QP::QS::force_cast<void (*)(void)>(fun_), #fun_))
1229
1235#define QS_USR_DICTIONARY(rec_) do { \
1236 static char const usr_name_[] = #rec_; \
1237 QP::QS::usr_dict_pre_((rec_), &usr_name_[0]); \
1238} while (false)
1239
1241#define QS_ASSERTION(module_, loc_, delay_) \
1242 (QP::QS::assertion_pre_((module_), (loc_), (delay_)))
1243
1245#define QF_QS_CRIT_ENTRY() (QP::QS::crit_entry_pre_())
1246
1248#define QF_QS_CRIT_EXIT() (QP::QS::crit_exit_pre_())
1249
1251#define QF_QS_ISR_ENTRY(isrnest_, prio_) \
1252 (QP::QS::isr_entry_pre_((isrnest_), (prio_)))
1253
1255#define QF_QS_ISR_EXIT(isrnest_, prio_) \
1256 (QP::QS::isr_exit_pre_((isrnest_), (prio_)))
1257
1265#define QS_FLUSH() (QP::QS::onFlush())
1266
1268#define QF_QS_ACTION(act_) (act_)
1269
1272#define QS_OUTPUT() (QS_output())
1273
1276#define QS_RX_INPUT() (QS_rx_input())
1277
1278//============================================================================
1279// Macros for use in QUTest only
1280
1281#ifdef Q_UTEST
1283 #define QS_TEST_PROBE_DEF(fun_) \
1284 std::uint32_t const qs_tp_ = \
1285 QP::QS::getTestProbe_(QP::QS::force_cast<void (*)(void)>(fun_));
1286
1288 #define QS_TEST_PROBE(code_) \
1289 if (qs_tp_ != 0U) { code_ }
1290
1292 #define QS_TEST_PROBE_ID(id_, code_) \
1293 if (qs_tp_ == static_cast<std::uint32_t>(id_)) { code_ }
1294
1296 #define QS_TEST_PAUSE() (QP::QS::test_pause_())
1297
1298#else
1299 // dummy definitions when not building for QUTEST
1300 #define QS_TEST_PROBE_DEF(fun_)
1301 #define QS_TEST_PROBE(code_)
1302 #define QS_TEST_PROBE_ID(id_, code_)
1303 #define QS_TEST_PAUSE() ((void)0)
1304#endif // Q_UTEST
1305
1306#endif // QS_HPP
Dummy Active Object class for testing (inherits QP::QActive)
Definition: qs.hpp:804
void start(std::uint_fast8_t const prio, QEvt const **const qSto, std::uint_fast16_t const qLen, void *const stkSto, std::uint_fast16_t const stkSize, void const *const par) override
Starts execution of an active object and registers the object with the framework.
Definition: qutest.cpp:155
QActiveDummy(void)
Definition: qutest.cpp:151
void init(void const *const e, std::uint_fast8_t const qs_id) noexcept override
executes the top-most initial transition in QP::QHsm
Definition: qutest.cpp:175
void postLIFO(QEvt const *const e) noexcept override
Posts an event directly to the event queue of the active object using the Last-In-First-Out (LIFO) po...
Definition: qutest.cpp:262
void start(std::uint_fast8_t const prio, QEvt const **const qSto, std::uint_fast16_t const qLen, void *const stkSto, std::uint_fast16_t const stkSize) override
Overloaded start function (no initialization event)
Definition: qs.hpp:814
bool post_(QEvt const *const e, std::uint_fast16_t const margin, void const *const sender) noexcept override
Definition: qutest.cpp:207
void dispatch(QEvt const *const e, std::uint_fast8_t const qs_id) noexcept override
Dispatches an event to QHsm.
Definition: qutest.cpp:193
QActive active object class (based on QP::QHsm implementation strategy)
Definition: qf.hpp:139
Dummy HSM class for testing (inherits QP::QHsm)
Definition: qs.hpp:787
void init(void const *const e, std::uint_fast8_t const qs_id) noexcept override
executes the top-most initial transition in QP::QHsm
Definition: qutest.cpp:121
QHsmDummy(void)
Definition: qutest.cpp:117
void dispatch(QEvt const *const e, std::uint_fast8_t const qs_id) noexcept override
Dispatches an event to QHsm.
Definition: qutest.cpp:138
Hierarchical State Machine base class.
Definition: qep.hpp:258
QS software tracing facilities for output (QS-TX)
Definition: qs.hpp:74
static T_OUT force_cast(T_IN in)
template for forcing cast of member functions for function dictionaries and test probes.
Definition: qs.hpp:530
static void sig_dict_pre_(enum_t const sig, void const *const obj, char const *const name) noexcept
Output signal dictionary record.
Definition: qs.cpp:801
static void str_raw_(char const *s) noexcept
Output zero-terminated ASCII string element without format information.
Definition: qs.cpp:720
static void test_pause_(void)
internal function to pause test and enter the test event loop
Definition: qutest.cpp:446
std::uint_fast8_t volatile critNest
critical section nesting level
Definition: qs.hpp:550
static void crit_entry_pre_(void)
internal function to produce the critical section entry record
Definition: qs.cpp:926
static void setCurrObj(std::uint8_t obj_kind, void *obj_ptr) noexcept
Set the "current object" in the Target.
Definition: qs_rx.cpp:271
static std::uint16_t getByte(void) noexcept
Byte-oriented interface to the QS data buffer.
Definition: qs.cpp:744
void const * locFilter_AP
deprecated local QS filter
Definition: qs.hpp:541
static void obj_arr_dict_pre_(void const *const obj, std::uint_fast16_t const idx, char const *const name) noexcept
Output predefined object-array dictionary record.
Definition: qs.cpp:832
static void onCleanup(void)
Callback to cleanup the QS facility.
static void assertion_pre_(char const *const module, int_t const loc, std::uint32_t const delay)
internal function to produce the assertion failure trace record
Definition: qs.cpp:910
static void onTestLoop(void)
callback to run the test loop
static void crit_exit_pre_(void)
internal function to produce the critical section exit record
Definition: qs.cpp:935
static void u16_raw_(std::uint16_t d) noexcept
Output std::uint16_t data element without format information.
Definition: qs.cpp:667
static void f64_fmt_(std::uint8_t format, float64_t const d) noexcept
Output 64-bit floating point data element with format information.
Definition: qs_fp.cpp:70
static void usr_dict_pre_(enum_t const rec, char const *const name) noexcept
Output user dictionary record.
Definition: qs.cpp:569
std::uint8_t volatile seq
the record sequence number
Definition: qs.hpp:547
static QS priv_
Definition: qs.hpp:552
static bool rxPut(std::uint8_t const b) noexcept
Put one byte into the QS RX lock-free buffer.
Definition: qs.hpp:763
static std::uint8_t const * getBlock(std::uint16_t *const pNbytes) noexcept
Block-oriented interface to the QS data buffer.
Definition: qs.cpp:767
static void onFlush(void)
Callback to flush the QS trace data to the host.
static void u32_fmt_(std::uint8_t format, std::uint32_t d) noexcept
Output std::uint32_t data element with format information.
Definition: qs.cpp:549
static QSTimeCtr onGetTime(void)
Callback to obtain a timestamp for a QS record.
Definition: qs_rx.cpp:752
static void u64_fmt_(std::uint8_t format, std::uint64_t d) noexcept
Output uint64_t data element with format information.
Definition: qs_64bit.cpp:62
static void u64_raw_(std::uint64_t d) noexcept
Output uint64_t data element without format information.
Definition: qs_64bit.cpp:41
static void isr_exit_pre_(std::uint8_t const isrnest, std::uint8_t const prio)
internal function to produce the ISR exit record
Definition: qs.cpp:955
static void rxHandleGoodFrame_(std::uint8_t const state)
internal function to handle incoming (QS-RX) packet
Definition: qs_rx.cpp:377
QSCtr volatile tail
offset of where next record will be extracted
Definition: qs.hpp:545
static void onTestTeardown(void)
callback to teardown after a unit test inside the Target
static std::uint32_t getTestProbe_(void(*const api)(void)) noexcept
internal function to get the Test-Probe for a given API
Definition: qs_rx.cpp:723
static void glbFilter_(std::int_fast16_t const filter) noexcept
Set/clear the global Filter for a given QS record or a group of records.
Definition: qs.cpp:84
static QSrx rxPriv_
Definition: qs.hpp:554
static void beginRec_(std::uint_fast8_t const rec) noexcept
Mark the begin of a QS record rec
Definition: qs.cpp:350
static void onTestSetup(void)
callback to setup a unit test inside the Target
static void isr_entry_pre_(std::uint8_t const isrnest, std::uint8_t const prio)
internal function to produce the ISR entry record
Definition: qs.cpp:944
static void u8_fmt_(std::uint8_t const format, std::uint8_t const d) noexcept
Output std::uint8_t data element with format information.
Definition: qs.cpp:511
QSpyObjKind
Kinds of objects used in QS.
Definition: qs.hpp:513
@ SM_OBJ
state machine object for QEP
Definition: qs.hpp:514
@ EQ_OBJ
raw queue object
Definition: qs.hpp:517
@ AO_OBJ
active object
Definition: qs.hpp:515
@ TE_OBJ
time event object
Definition: qs.hpp:518
@ MAX_OBJ
Definition: qs.hpp:520
@ AP_OBJ
generic Application-specific object
Definition: qs.hpp:519
@ MP_OBJ
event pool object
Definition: qs.hpp:516
static void obj_dict_pre_(void const *const obj, char const *const name) noexcept
Output object dictionary record.
Definition: qs.cpp:817
QSCtr volatile used
number of bytes currently in the ring buffer
Definition: qs.hpp:546
static void obj_raw_(void const *const obj) noexcept
Output obj pointer data element without format information.
Definition: qs.cpp:705
std::uint8_t locFilter[16]
local on/off QS filter
Definition: qs.hpp:540
static void f32_fmt_(std::uint8_t format, float32_t const d) noexcept
Output 32-bit floating point data element with format information.
Definition: qs_fp.cpp:41
static void onReset(void)
callback function to reset the Target (to be implemented in the BSP)
static void endRec_(void) noexcept
Mark the end of a QS record rec
Definition: qs.cpp:370
static void u8_raw_(std::uint8_t const d) noexcept
output std::uint8_t data element without format information
Definition: qs.cpp:635
static void str_fmt_(char const *s) noexcept
Output zero-terminated ASCII string element with format information.
Definition: qs.cpp:607
std::uint8_t volatile chksum
the checksum of the current record
Definition: qs.hpp:548
static void processTestEvts_(void)
internal function to process posted events during test
Definition: qutest.cpp:305
QSCtr end
offset of the end of the ring buffer
Definition: qs.hpp:543
static std::uint16_t rxGetNfree(void) noexcept
Obtain the number of free bytes in the QS RX data buffer.
Definition: qs_rx.cpp:256
static void fun_dict_pre_(void(*const fun)(void), char const *const name) noexcept
Output function dictionary record.
Definition: qs.cpp:895
static void locFilter_(std::int_fast16_t const filter) noexcept
Set/clear the local Filter for a given object-id or a group of object-ids.
Definition: qs.cpp:292
static void u8u8_raw_(std::uint8_t const d1, std::uint8_t const d2) noexcept
output two std::uint8_t data elements without format information
Definition: qs.cpp:649
static bool onStartup(void const *arg)
Callback to startup the QS facility.
static void u32_raw_(std::uint32_t d) noexcept
Output std::uint32_t data element without format information.
Definition: qs.cpp:687
std::uint8_t glbFilter[16]
global on/off QS filter
Definition: qs.hpp:539
QSType
Enumerates data formats recognized by QS.
Definition: qs.hpp:493
@ I16_T
signed 16-bit integer format
Definition: qs.hpp:496
@ STR_T
zero-terminated ASCII string format
Definition: qs.hpp:502
@ U64_T
unsigned 64-bit integer format
Definition: qs.hpp:508
@ U16_T
unsigned 16-bit integer format
Definition: qs.hpp:497
@ OBJ_T
object pointer format
Definition: qs.hpp:505
@ SIG_T
event signal format
Definition: qs.hpp:504
@ U32_T
unsigned 32-bit integer format
Definition: qs.hpp:499
@ F64_T
64-bit floating point format
Definition: qs.hpp:501
@ F32_T
32-bit floating point format
Definition: qs.hpp:500
@ I8_T
signed 8-bit integer format
Definition: qs.hpp:494
@ MEM_T
up to 255-bytes memory block format
Definition: qs.hpp:503
@ U8_T
unsigned 8-bit integer format
Definition: qs.hpp:495
@ I32_T
signed 32-bit integer format
Definition: qs.hpp:498
@ FUN_T
function pointer format
Definition: qs.hpp:506
@ HEX_FMT
HEX format for the "width" filed.
Definition: qs.hpp:509
@ I64_T
signed 64-bit integer format
Definition: qs.hpp:507
QSCtr volatile head
offset to where next byte will be inserted
Definition: qs.hpp:544
static void queryCurrObj(std::uint8_t obj_kind) noexcept
Query the "current object" in the Target.
Definition: qs_rx.cpp:277
static void onCommand(std::uint8_t cmdId, std::uint32_t param1, std::uint32_t param2, std::uint32_t param3)
Callback function to execute user commands (to be implemented in BSP)
static void onTestPost(void const *sender, QActive *recipient, QEvt const *e, bool status)
static void rxInitBuf(std::uint8_t *const sto, std::uint16_t const stoSize) noexcept
Initialize the QS RX data buffer.
Definition: qs_rx.cpp:223
static void mem_fmt_(std::uint8_t const *blk, std::uint8_t size) noexcept
Output memory block of up to 255-bytes with format information.
Definition: qs.cpp:583
OSpyObjCombnation
Definition: qs.hpp:523
@ SM_AO_OBJ
combination of SM and AO
Definition: qs.hpp:524
static void tickX_(std::uint_fast8_t const tickRate, void const *const sender) noexcept
internal function to process armed time events during test
Definition: qutest.cpp:337
static void initBuf(std::uint8_t *const sto, std::uint_fast16_t const stoSize) noexcept
Initialize the QS data buffer.
Definition: qs.cpp:50
static void u16_fmt_(std::uint8_t format, std::uint16_t d) noexcept
output std::uint16_t data element with format information
Definition: qs.cpp:527
std::uint8_t * buf
pointer to the start of the ring buffer
Definition: qs.hpp:542
static void rxParse(void)
Parse all bytes present in the QS RX data buffer.
Definition: qs_rx.cpp:332
static void onTestEvt(QEvt *e)
callback to "massage" the test event before dispatching/posting it
namespace associated with the QP/C++ framework
Definition: exa_native.dox:1
std::uint32_t QSTimeCtr
The type of the QS time stamp. This type determines the dynamic.
Definition: qs.hpp:49
QSpyIdOffsets
QS ID offsets for QS_LOC_FILTER()
Definition: qs.hpp:703
@ QS_EQ_ID
offset for event-queue IDs
Definition: qs.hpp:706
@ QS_EP_ID
offset for event-pool IDs
Definition: qs.hpp:705
@ QS_AP_ID
offset for Appl-spec IDs
Definition: qs.hpp:707
@ QS_AO_ID
offset for AO priorities
Definition: qs.hpp:704
QSpyRecords
QS pre-defined record types (TX channel)
Definition: qs.hpp:571
@ QS_ASSERT_FAIL
assertion failed in the code
Definition: qs.hpp:670
@ QS_QF_TIMEEVT_AUTO_DISARM
a time event expired and was disarmed
Definition: qs.hpp:620
@ QS_MUTEX_UNLOCK
a mutex was unlocked
Definition: qs.hpp:646
@ QS_QF_INT_ENABLE
interrupts were enabled
Definition: qs.hpp:633
@ QS_QF_RUN
QF_run() was entered.
Definition: qs.hpp:671
@ QS_QF_MPOOL_GET_ATTEMPT
attempt to get a memory block failed
Definition: qs.hpp:642
@ QS_QF_DELETE_REF
an event reference is about to be deleted
Definition: qs.hpp:627
@ QS_QF_ACTIVE_RECALL
AO recalled an event.
Definition: qs.hpp:588
@ QS_QF_EQUEUE_GET_LAST
get the last event from the queue
Definition: qs.hpp:601
@ QS_QF_TIMEEVT_DISARM
true disarming of an armed time event
Definition: qs.hpp:622
@ QS_TEST_PROBE_GET
reports that Test-Probe has been used
Definition: qs.hpp:660
@ QS_QEP_STATE_INIT
an initial transition was taken in a state
Definition: qs.hpp:578
@ QS_QEP_TRAN_HIST
a tran to history was taken
Definition: qs.hpp:654
@ QS_QF_TIMEEVT_REARM
rearming of a time event
Definition: qs.hpp:623
@ QS_FUN_DICT
function dictionary entry
Definition: qs.hpp:663
@ QS_QF_PUBLISH
an event was published
Definition: qs.hpp:611
@ QS_QF_ACTIVE_POST_LIFO
an event was posted (LIFO) directly to AO
Definition: qs.hpp:592
@ QS_QEP_TRAN_EP
a tran to entry point into a submachine
Definition: qs.hpp:655
@ QS_QEP_STATE_EXIT
a state was exited
Definition: qs.hpp:577
@ QS_TARGET_DONE
reports completion of a user callback
Definition: qs.hpp:666
@ QS_QF_GC_ATTEMPT
garbage collection attempt
Definition: qs.hpp:614
@ QS_QF_CRIT_ENTRY
critical section was entered
Definition: qs.hpp:628
@ QS_QF_MPOOL_PUT
a memory block was returned to memory pool
Definition: qs.hpp:608
@ QS_QF_EQUEUE_POST_ATTEMPT
attempt to post an evt to QEQueue failed
Definition: qs.hpp:639
@ QS_QF_GC
garbage collection
Definition: qs.hpp:615
@ QS_QF_ACTIVE_GET
AO got an event and its queue is not empty.
Definition: qs.hpp:593
@ QS_QF_CRIT_EXIT
critical section was exited
Definition: qs.hpp:629
@ QS_QF_TIMEEVT_POST
a time event posted itself directly to an AO
Definition: qs.hpp:624
@ QS_QF_INT_DISABLE
interrupts were disabled
Definition: qs.hpp:632
@ QS_OBJ_DICT
object dictionary entry
Definition: qs.hpp:662
@ QS_QF_MPOOL_GET
a memory block was removed from memory pool
Definition: qs.hpp:607
@ QS_QF_TIMEEVT_DISARM_ATTEMPT
attempt to disarm a disarmed QTimeEvt
Definition: qs.hpp:621
@ QS_QF_ACTIVE_RECALL_ATTEMPT
AO attempted to recall an event.
Definition: qs.hpp:595
@ QS_QEP_INIT_TRAN
the top-most initial transition was taken
Definition: qs.hpp:579
@ QS_MUTEX_LOCK
a mutex was locked
Definition: qs.hpp:645
@ QS_TARGET_INFO
reports the Target information
Definition: qs.hpp:665
@ QS_QEP_INTERN_TRAN
an internal transition was taken
Definition: qs.hpp:580
@ QS_QEP_TRAN_XP
a tran to exit point out of a submachine
Definition: qs.hpp:656
@ QS_RX_STATUS
reports QS data receive status
Definition: qs.hpp:667
@ QS_SCHED_IDLE
scheduler became idle
Definition: qs.hpp:650
@ QS_QF_EQUEUE_POST_LIFO
an event was posted (LIFO) to a raw queue
Definition: qs.hpp:599
@ QS_QEP_STATE_ENTRY
a state was entered
Definition: qs.hpp:576
@ QS_QEP_UNHANDLED
an event was unhandled due to a guard
Definition: qs.hpp:584
@ QS_QF_ACTIVE_POST_ATTEMPT
attempt to post an evt to AO failed
Definition: qs.hpp:636
@ QS_QEP_TRAN
a regular transition was taken
Definition: qs.hpp:581
@ QS_QF_EQUEUE_GET
get an event and queue still not empty
Definition: qs.hpp:600
@ QS_QF_ISR_ENTRY
an ISR was entered
Definition: qs.hpp:630
@ QS_QF_NEW_ATTEMPT
an attempt to allocate an event failed
Definition: qs.hpp:604
@ QS_QF_ISR_EXIT
an ISR was exited
Definition: qs.hpp:631
@ QS_QF_TICK
QP::QF::tickX() was called.
Definition: qs.hpp:616
@ QS_QF_ACTIVE_UNSUBSCRIBE
an AO unsubscribed to an event
Definition: qs.hpp:590
@ QS_QEP_DISPATCH
an event was dispatched (begin of RTC step)
Definition: qs.hpp:583
@ QS_QF_ACTIVE_DEFER
AO deferred an event.
Definition: qs.hpp:587
@ QS_SCHED_LOCK
scheduler was locked
Definition: qs.hpp:647
@ QS_QF_NEW_REF
new event reference was created
Definition: qs.hpp:612
@ QS_TEST_PAUSED
test has been paused
Definition: qs.hpp:659
@ QS_SCHED_UNLOCK
scheduler was unlocked
Definition: qs.hpp:648
@ QS_EMPTY
QS record for cleanly starting a session.
Definition: qs.hpp:573
@ QS_QF_ACTIVE_POST
an event was posted (FIFO) directly to AO
Definition: qs.hpp:591
@ QS_SIG_DICT
signal dictionary entry
Definition: qs.hpp:661
@ QS_QUERY_DATA
reports the data from "current object" query
Definition: qs.hpp:668
@ QS_QF_TIMEEVT_ARM
a time event was armed
Definition: qs.hpp:619
@ QS_QEP_IGNORED
an event was ignored (silently discarded)
Definition: qs.hpp:582
@ QS_USR_DICT
user QS record dictionary entry
Definition: qs.hpp:664
@ QS_QF_NEW
new event was created
Definition: qs.hpp:613
@ QS_QF_EQUEUE_POST
an event was posted (FIFO) to a raw queue
Definition: qs.hpp:598
@ QS_QF_ACTIVE_GET_LAST
AO got an event and its queue is empty.
Definition: qs.hpp:594
@ QS_SCHED_NEXT
scheduler found next task to execute
Definition: qs.hpp:649
@ QS_PEEK_DATA
reports the data from the PEEK query
Definition: qs.hpp:669
@ QS_QF_ACTIVE_SUBSCRIBE
an AO subscribed to an event
Definition: qs.hpp:589
@ QS_SCHED_RESUME
scheduler resumed previous task (not idle)
Definition: qs.hpp:651
constexpr std::uint16_t QS_EOD
Constant representing End-Of-Data condition returned from the QP::QS::getByte() function.
Definition: qs.hpp:758
QSpyUserOffsets
QS user record group offsets for QS_GLB_FILTER()
Definition: qs.hpp:675
@ QS_USER0
offset for User Group 0
Definition: qs.hpp:677
@ QS_USER3
offset of Group 3
Definition: qs.hpp:680
@ QS_USER1
offset of Group 1
Definition: qs.hpp:678
@ QS_USER
the first record available to QS users
Definition: qs.hpp:676
@ QS_USER2
offset of Group 2
Definition: qs.hpp:679
@ QS_USER4
offset of Group 4
Definition: qs.hpp:681
QSCtr volatile tail
offset of where next byte will be extracted
Definition: qs.hpp:62
QSpyIdGroups
QS ID groups for QS_LOC_FILTER()
Definition: qs.hpp:711
@ QS_EP_IDS
event-pool IDs
Definition: qs.hpp:714
@ QS_AO_IDS
AO IDs (priorities)
Definition: qs.hpp:713
@ QS_EQ_IDS
event-queue IDs
Definition: qs.hpp:715
@ QS_ALL_IDS
all QS IDs
Definition: qs.hpp:712
@ QS_AP_IDS
Application-specific IDs.
Definition: qs.hpp:716
void * currObj[8]
current objects
Definition: qs.hpp:58
std::uint_fast16_t QSCtr
QS ring buffer counter and offset type.
Definition: qs.hpp:53
bool inTestLoop
QUTest event loop is running.
Definition: qs.hpp:65
QSpyRecordGroups
QS record groups for QS_GLB_FILTER()
Definition: qs.hpp:685
@ QS_U2_RECORDS
User Group 110-114 records.
Definition: qs.hpp:696
@ QS_MP_RECORDS
Memory Pools QS records.
Definition: qs.hpp:690
@ QS_TE_RECORDS
Time Events QS records.
Definition: qs.hpp:691
@ QS_SM_RECORDS
State Machine QS records.
Definition: qs.hpp:687
@ QS_U0_RECORDS
User Group 100-104 records.
Definition: qs.hpp:694
@ QS_U3_RECORDS
User Group 115-119 records.
Definition: qs.hpp:697
@ QS_U4_RECORDS
User Group 120-124 records.
Definition: qs.hpp:698
@ QS_AO_RECORDS
Active Object QS records.
Definition: qs.hpp:688
@ QS_QF_RECORDS
QF QS records.
Definition: qs.hpp:692
@ QS_SC_RECORDS
Scheduler QS records.
Definition: qs.hpp:693
@ QS_U1_RECORDS
User Group 105-109 records.
Definition: qs.hpp:695
@ QS_EQ_RECORDS
Event Queues QS records.
Definition: qs.hpp:689
@ QS_ALL_RECORDS
all QS records
Definition: qs.hpp:686
@ QS_UA_RECORDS
All User records.
Definition: qs.hpp:699
QP::QPSet readySet
QUTEST ready-set of active objects.
Definition: qs.hpp:64
QSCtr end
offset of the end of the ring buffer
Definition: qs.hpp:60
constexpr std::uint8_t QUTEST_ON_POST
Definition: qs.hpp:832
QSCtr volatile head
offset to where next byte will be inserted
Definition: qs.hpp:61
std::uint8_t * buf
pointer to the start of the ring buffer
Definition: qs.hpp:59
std::uint8_t volatile QF_intNest
Definition: qutest.cpp:52
QS software tracing parameters for input (QS-RX)
Definition: qs.hpp:57
int enum_t
alias for enumerations used for event signals
Definition: qep.hpp:67
int int_t
alias for line numbers in assertions and return from QF::run()
Definition: qep.hpp:64
float float32_t
alias for 32-bit IEEE 754 floating point numbers
Definition: qep.hpp:77
double float64_t
alias for 64-bit IEEE 754 floating point numbers
Definition: qep.hpp:87
QEvt base class.
Definition: qep.hpp:155
Priority Set of up to 64 elements.
Definition: qpset.hpp:133
QS ID type for applying local filtering.
Definition: qs.hpp:720
std::uint8_t m_prio
Definition: qs.hpp:721
std::uint_fast8_t getPrio(void) const noexcept
Definition: qs.hpp:722