51Q_DEFINE_THIS_MODULE(
"qs")
56#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U))
57#error qpcpp version 7.3.0 or higher required
67 std::uint8_t *
const sto,
68 std::uint_fast32_t
const stoSize)
noexcept
71 priv_.end =
static_cast<QSCtr
>(stoSize);
81 priv_.locFilter_AP =
nullptr;
88 target_info_pre_(0xFFU);
99 if (priv_.used == 0U) {
103 std::uint8_t
const *
const buf = priv_.buf;
104 QSCtr tail = priv_.tail;
105 ret =
static_cast<std::uint16_t
>(buf[tail]);
107 if (tail == priv_.end) {
111 priv_.used = (priv_.used - 1U);
117std::uint8_t
const *
getBlock(std::uint16_t *
const pNbytes)
noexcept {
121 QSCtr
const used = priv_.used;
126 QSCtr tail = priv_.tail;
127 QSCtr
const end = priv_.end;
128 QSCtr n =
static_cast<QSCtr
>(end - tail);
132 if (n >
static_cast<QSCtr
>(*pNbytes)) {
133 n =
static_cast<QSCtr
>(*pNbytes);
135 *pNbytes =
static_cast<std::uint16_t
>(n);
139 priv_.used =
static_cast<QSCtr
>(used - n);
157#ifndef QF_MEM_ISOLATE
180void glbFilter_(std::int_fast16_t
const filter)
noexcept {
181 bool const isRemove = (filter < 0);
182 std::uint16_t
const rec = isRemove
183 ?
static_cast<std::uint16_t
>(-filter)
184 :
static_cast<std::uint16_t
>(filter);
187 std::uint8_t
const tmp = (isRemove ? 0x00U : 0xFFU);
213 filt_.
glb[0] &=
static_cast<std::uint8_t
>(~0xFEU & 0xFFU);
214 filt_.
glb[1] &=
static_cast<std::uint8_t
>(~0x03U & 0xFFU);
215 filt_.
glb[6] &=
static_cast<std::uint8_t
>(~0x80U & 0xFFU);
216 filt_.
glb[7] &=
static_cast<std::uint8_t
>(~0x03U & 0xFFU);
227 filt_.
glb[1] &=
static_cast<std::uint8_t
>(~0xFCU & 0xFFU);
228 filt_.
glb[2] &=
static_cast<std::uint8_t
>(~0x07U & 0xFFU);
229 filt_.
glb[5] &=
static_cast<std::uint8_t
>(~0x20U & 0xFFU);
239 filt_.
glb[2] &=
static_cast<std::uint8_t
>(~0x78U & 0xFFU);
240 filt_.
glb[5] &=
static_cast<std::uint8_t
>(~0x40U & 0xFFU);
249 filt_.
glb[3] &=
static_cast<std::uint8_t
>(~0x03U & 0xFFU);
250 filt_.
glb[5] &=
static_cast<std::uint8_t
>(~0x80U & 0xFFU);
259 filt_.
glb[2] &=
static_cast<std::uint8_t
>(~0x80U & 0xFFU);
260 filt_.
glb[3] &=
static_cast<std::uint8_t
>(~0xFCU & 0xFFU);
261 filt_.
glb[4] &=
static_cast<std::uint8_t
>(~0xC0U & 0xFFU);
262 filt_.
glb[5] &=
static_cast<std::uint8_t
>(~0x1FU & 0xFFU);
273 filt_.
glb[4] &=
static_cast<std::uint8_t
>(~0x3FU & 0xFFU);
281 filt_.
glb[6] &=
static_cast<std::uint8_t
>(~0x3FU & 0xFFU);
289 filt_.
glb[8] &=
static_cast<std::uint8_t
>(~0x80U & 0xFFU);
290 filt_.
glb[9] &=
static_cast<std::uint8_t
>(~0x07U & 0xFFU);
299 filt_.
glb[9] &=
static_cast<std::uint8_t
>(~0xF8U & 0xFFU);
300 filt_.
glb[10] &=
static_cast<std::uint8_t
>(~0x01U & 0xFFU);
309 filt_.
glb[12] &=
static_cast<std::uint8_t
>(~0xF0U & 0xFFU);
310 filt_.
glb[13] &=
static_cast<std::uint8_t
>(~0x01U & 0xFFU);
319 filt_.
glb[13] &=
static_cast<std::uint8_t
>(~0x3EU & 0xFFU);
327 filt_.
glb[13] &=
static_cast<std::uint8_t
>(~0xC0U & 0xFFU);
328 filt_.
glb[14] &=
static_cast<std::uint8_t
>(~0x07U & 0xFFU);
337 filt_.
glb[14] &=
static_cast<std::uint8_t
>(~0xF8U & 0xFFU);
345 filt_.
glb[15] &=
static_cast<std::uint8_t
>(~0x1FU & 0xFFU);
353 filt_.
glb[12] &=
static_cast<std::uint8_t
>(~0xF0U & 0xFFU);
356 filt_.
glb[15] &=
static_cast<std::uint8_t
>(~0x1FU & 0xFFU);
374 &=
static_cast<std::uint8_t
>(~(1U << (rec & 7U)) & 0xFFU);
378 |=
static_cast<std::uint8_t
>(1U << (rec & 7U));
388void locFilter_(std::int_fast16_t
const filter)
noexcept {
389 bool const isRemove = (filter < 0);
390 std::uint16_t
const qsId = isRemove
391 ?
static_cast<std::uint16_t
>(-filter)
392 : static_cast<std::uint16_t>(filter);
393 std::uint8_t
const tmp = (isRemove ? 0x00U : 0xFFU);
406 for (i = 0U; i < 8U; i += 4U) {
433 static_cast<std::uint8_t
>(
434 ~(1U << (qsId & 7U)) & 0xFFU);
438 |= (1U << (qsId & 7U));
447void beginRec_(std::uint_fast8_t
const rec)
noexcept {
448 std::uint8_t
const b =
priv_.seq + 1U;
449 std::uint8_t chksum = 0U;
450 std::uint8_t *
const buf =
priv_.buf;
451 QSCtr head =
priv_.head;
452 QSCtr
const end =
priv_.end;
457 QS_INSERT_ESC_BYTE_(b)
459 chksum +=
static_cast<std::uint8_t
>(rec);
460 QS_INSERT_BYTE_(
static_cast<std::uint8_t
>(rec))
463 priv_.chksum = chksum;
467void endRec_() noexcept {
468 std::uint8_t *
const buf =
priv_.buf;
469 QSCtr head =
priv_.head;
470 QSCtr
const end =
priv_.end;
471 std::uint8_t b =
priv_.chksum;
476 if ((b != QS_FRAME) && (b != QS_ESC)) {
480 QS_INSERT_BYTE_(QS_ESC)
481 QS_INSERT_BYTE_(b ^ QS_ESC_XOR)
485 QS_INSERT_BYTE_(QS_FRAME)
488 if (
priv_.used > end) {
495void u8_raw_(std::uint8_t
const d)
noexcept {
496 std::uint8_t chksum =
priv_.chksum;
497 std::uint8_t *
const buf =
priv_.buf;
498 QSCtr head =
priv_.head;
499 QSCtr
const end =
priv_.end;
502 QS_INSERT_ESC_BYTE_(d)
505 priv_.chksum = chksum;
510 std::uint8_t
const d1,
511 std::uint8_t
const d2)
noexcept
513 std::uint8_t chksum =
priv_.chksum;
514 std::uint8_t *
const buf =
priv_.buf;
515 QSCtr head =
priv_.head;
516 QSCtr
const end =
priv_.end;
519 QS_INSERT_ESC_BYTE_(d1)
520 QS_INSERT_ESC_BYTE_(d2)
523 priv_.chksum = chksum;
527void u16_raw_(std::uint16_t d)
noexcept {
528 std::uint8_t b =
static_cast<std::uint8_t
>(d);
529 std::uint8_t chksum =
priv_.chksum;
530 std::uint8_t *
const buf =
priv_.buf;
531 QSCtr head =
priv_.head;
532 QSCtr
const end =
priv_.end;
536 QS_INSERT_ESC_BYTE_(b)
539 b =
static_cast<std::uint8_t
>(d);
540 QS_INSERT_ESC_BYTE_(b)
543 priv_.chksum = chksum;
547void u32_raw_(std::uint32_t d)
noexcept {
548 std::uint8_t chksum =
priv_.chksum;
549 std::uint8_t *
const buf =
priv_.buf;
550 QSCtr head =
priv_.head;
551 QSCtr
const end =
priv_.end;
554 for (std::uint_fast8_t i = 4U; i != 0U; --i) {
555 std::uint8_t
const b =
static_cast<std::uint8_t
>(d);
556 QS_INSERT_ESC_BYTE_(b)
561 priv_.chksum = chksum;
565void obj_raw_(
void const *
const obj)
noexcept {
566 #if (QS_OBJ_PTR_SIZE == 1U)
567 u8_raw_(
reinterpret_cast<std::uint8_t
>(obj));
568 #elif (QS_OBJ_PTR_SIZE == 2U)
569 u16_raw_(
reinterpret_cast<std::uint16_t
>(obj));
570 #elif (QS_OBJ_PTR_SIZE == 4U)
571 u32_raw_(
reinterpret_cast<std::uint32_t
>(obj));
572 #elif (QS_OBJ_PTR_SIZE == 8U)
573 u64_raw_(
reinterpret_cast<std::uint64_t
>(obj));
575 u32_raw_(
reinterpret_cast<std::uint32_t
>(obj));
580void str_raw_(
char const * s)
noexcept {
581 std::uint8_t b =
static_cast<std::uint8_t
>(*s);
582 std::uint8_t chksum =
priv_.chksum;
583 std::uint8_t *
const buf =
priv_.buf;
584 QSCtr head =
priv_.head;
585 QSCtr
const end =
priv_.end;
586 QSCtr used =
priv_.used;
592 b =
static_cast<std::uint8_t
>(*s);
599 priv_.chksum = chksum;
605 std::uint8_t
const format,
606 std::uint8_t
const d)
noexcept
608 std::uint8_t chksum =
priv_.chksum;
609 std::uint8_t *
const buf =
priv_.buf;
610 QSCtr head =
priv_.head;
611 QSCtr
const end =
priv_.end;
615 QS_INSERT_ESC_BYTE_(format)
616 QS_INSERT_ESC_BYTE_(d)
619 priv_.chksum = chksum;
625 std::uint16_t d)
noexcept
627 std::uint8_t chksum =
priv_.chksum;
628 std::uint8_t *
const buf =
priv_.buf;
629 QSCtr head =
priv_.head;
630 QSCtr
const end =
priv_.end;
634 QS_INSERT_ESC_BYTE_(format)
636 format =
static_cast<std::uint8_t
>(d);
637 QS_INSERT_ESC_BYTE_(format)
640 format =
static_cast<std::uint8_t
>(d);
641 QS_INSERT_ESC_BYTE_(format)
644 priv_.chksum = chksum;
650 std::uint32_t d)
noexcept
652 std::uint8_t chksum =
priv_.chksum;
653 std::uint8_t *
const buf =
priv_.buf;
654 QSCtr head =
priv_.head;
655 QSCtr
const end =
priv_.end;
658 QS_INSERT_ESC_BYTE_(format)
660 for (std::uint_fast8_t i = 4U; i != 0U; --i) {
661 format =
static_cast<std::uint8_t
>(d);
662 QS_INSERT_ESC_BYTE_(format)
667 priv_.chksum = chksum;
671void str_fmt_(
char const * s)
noexcept {
672 std::uint8_t b =
static_cast<std::uint8_t
>(*s);
673 std::uint8_t chksum =
static_cast<std::uint8_t
>(
674 priv_.chksum +
static_cast<std::uint8_t
>(
STR_T));
675 std::uint8_t *
const buf =
priv_.buf;
676 QSCtr head =
priv_.head;
677 QSCtr
const end =
priv_.end;
678 QSCtr used =
priv_.used;
682 QS_INSERT_BYTE_(
static_cast<std::uint8_t
>(
STR_T))
688 b =
static_cast<std::uint8_t
>(*s);
694 priv_.chksum = chksum;
700 std::uint8_t
const * blk,
701 std::uint8_t size)
noexcept
703 std::uint8_t b =
static_cast<std::uint8_t
>(
MEM_T);
704 std::uint8_t chksum =
priv_.chksum + b;
705 std::uint8_t *
const buf =
priv_.buf;
706 QSCtr head =
priv_.head;
707 QSCtr
const end =
priv_.end;
712 QS_INSERT_ESC_BYTE_(size)
715 for (; size != 0U; --size) {
717 QS_INSERT_ESC_BYTE_(b)
722 priv_.chksum = chksum;
728 void const *
const obj,
729 char const *
const name)
noexcept
735 beginRec_(
static_cast<std::uint_fast8_t
>(
QS_SIG_DICT));
738 QS_STR_PRE_((*name ==
'&') ? &name[1] : name);
748 void const *
const obj,
749 char const *
const name)
noexcept
755 beginRec_(
static_cast<std::uint_fast8_t
>(
QS_OBJ_DICT));
757 QS_STR_PRE_((*name ==
'&') ? &name[1] : name);
766void obj_arr_dict_pre_(
767 void const *
const obj,
768 std::uint_fast16_t
const idx,
769 char const *
const name)
noexcept
777 std::uint8_t idx_str[4];
778 std::uint_fast16_t tmp = idx;
781 idx_str[2] =
static_cast<std::uint8_t
>(
782 static_cast<std::uint8_t
>(
'0') + (tmp % 10U));
784 idx_str[1] =
static_cast<std::uint8_t
>(
785 static_cast<std::uint8_t
>(
'0') + (tmp % 10U));
786 if (idx_str[1] ==
static_cast<std::uint8_t
>(
'0')) {
791 idx_str[0] =
static_cast<std::uint8_t
>(
792 static_cast<std::uint8_t
>(
'0') + (tmp % 10U));
793 if (idx_str[0] ==
static_cast<std::uint8_t
>(
'0')) {
801 std::uint8_t j = ((*name ==
'&') ? 1U : 0U);
806 beginRec_(
static_cast<std::uint_fast8_t
>(
QS_OBJ_DICT));
808 for (; name[j] !=
'\0'; ++j) {
810 if (name[j] ==
'[') {
815 for (; idx_str[i] != 0U; ++i) {
816 QS_U8_PRE_(idx_str[i]);
819 for (; name[j] !=
'\0'; ++j) {
820 if (name[j] ==
']') {
824 for (; name[j] !=
'\0'; ++j) {
838 char const *
const name)
noexcept
844 beginRec_(
static_cast<std::uint_fast8_t
>(
QS_FUN_DICT));
846 QS_STR_PRE_((*name ==
'&') ? &name[1] : name);
857 char const *
const name)
noexcept
863 beginRec_(
static_cast<std::uint_fast8_t
>(
QS_USR_DICT));
876 std::uint8_t
const group,
877 char const *
const name)
noexcept
883 beginRec_(
static_cast<std::uint_fast8_t
>(
QS_ENUM_DICT));
884 QS_2U8_PRE_(
static_cast<std::uint8_t
>(value), group);
895 char const *
const module,
897 std::uint32_t
const delay)
noexcept
904 QS_STR_PRE_((module !=
nullptr) ? module :
"?");
909 for (std::uint32_t
volatile ctr = delay; ctr > 0U; ) {
916void crit_entry_pre_() noexcept {
920 QS_U8_PRE_(
priv_.critNest);
925void crit_exit_pre_() noexcept {
928 QS_U8_PRE_(QS::priv_.critNest);
935 std::uint8_t
const isrnest,
936 std::uint8_t
const prio)
noexcept
947 std::uint8_t
const isrnest,
948 std::uint8_t
const prio)
noexcept
958void target_info_pre_(std::uint8_t
const isReset) {
961 static constexpr std::uint8_t ZERO =
static_cast<std::uint8_t
>(
'0');
962 static std::uint8_t
const *
const TIME =
963 reinterpret_cast<std::uint8_t
const *
>(&
BUILD_TIME[0]);
964 static std::uint8_t
const *
const DATE =
965 reinterpret_cast<std::uint8_t
const *
>(&
BUILD_DATE[0]);
974 endian_test.u16 = 0x0102U;
976 QS_U16_PRE_(((endian_test.u8[0] == 0x01U)
984#ifdef QF_EQUEUE_CTR_SIZE
991#ifdef QF_MPOOL_CTR_SIZE
1006 QS::u8_raw_((10U * (TIME[6] - ZERO)) + (TIME[7] - ZERO));
1007 QS::u8_raw_((10U * (TIME[3] - ZERO)) + (TIME[4] - ZERO));
1008 if (
BUILD_TIME[0] ==
static_cast<std::uint8_t
>(
' ')) {
1009 QS::u8_raw_(TIME[1] - ZERO);
1012 QS::u8_raw_((10U * (TIME[0] - ZERO)) + (TIME[1] - ZERO));
1016 if (
BUILD_DATE[4] ==
static_cast<std::uint8_t
>(
' ')) {
1017 QS::u8_raw_(DATE[5] - ZERO);
1020 QS::u8_raw_((10U * (DATE[4] - ZERO)) + (DATE[5] - ZERO));
1024 switch (DATE[0] + DATE[1] + DATE[2]) {
1025 case 'J' +
'a' +
'n':
1028 case 'F' +
'e' +
'b':
1031 case 'M' +
'a' +
'r':
1034 case 'A' +
'p' +
'r':
1037 case 'M' +
'a' +
'y':
1040 case 'J' +
'u' +
'n':
1043 case 'J' +
'u' +
'l':
1046 case 'A' +
'u' +
'g':
1049 case 'S' +
'e' +
'p':
1052 case 'O' +
'c' +
't':
1055 case 'N' +
'o' +
'v':
1058 case 'D' +
'e' +
'c':
1066 QS::u8_raw_((10U * (DATE[9] - ZERO)) + (DATE[10] - ZERO));
QS type for output filters (global and local)
std::uint16_t getByte() noexcept
@ STR_T
zero-terminated ASCII string format
@ MEM_T
up to 255-bytes memory block format
std::uint8_t const * getBlock(std::uint16_t *const pNbytes) noexcept
void initBuf(std::uint8_t *const sto, std::uint_fast32_t const stoSize) noexcept
char const BUILD_DATE[12]
@ QS_EP_IDS
event-pool IDs
@ QS_AP_IDS
Application-specific IDs.
@ QS_AO_IDS
AO IDs (priorities)
@ QS_MTX_RECORDS
Mutex QS records.
@ QS_UA_RECORDS
All User records.
@ QS_SEM_RECORDS
Semaphore QS records.
@ QS_ALL_RECORDS
all maskable QS records
@ QS_U0_RECORDS
User Group 100-104 records.
@ QS_EQ_RECORDS
Event Queues QS records.
@ QS_SC_RECORDS
Scheduler QS records.
@ QS_U2_RECORDS
User Group 110-114 records.
@ QS_SM_RECORDS
State Machine QS records.
@ QS_U4_RECORDS
User Group 120-124 records.
@ QS_U3_RECORDS
User Group 115-119 records.
@ QS_AO_RECORDS
Active Object QS records.
@ QS_TE_RECORDS
Time Events QS records.
@ QS_U1_RECORDS
User Group 105-109 records.
@ QS_MP_RECORDS
Memory Pools QS records.
@ QS_QF_RECORDS
QF QS records.
@ QS_FUN_DICT
function dictionary entry
@ QS_ASSERT_FAIL
assertion failed in the code
@ QS_USR_DICT
user QS record dictionary entry
@ QS_ENUM_DICT
enumeration dictionary entry
@ QS_SIG_DICT
signal dictionary entry
@ QS_OBJ_DICT
object dictionary entry
@ QS_QF_CRIT_ENTRY
critical section was entered
@ QS_QF_CRIT_EXIT
critical section was exited
@ QS_QF_ISR_ENTRY
an ISR was entered
@ QS_TARGET_INFO
reports the Target information
@ QS_QF_ISR_EXIT
an ISR was exited
@ QS_EMPTY
QS record for cleanly starting a session.
#define QF_EVENT_SIZ_SIZE
#define QF_EQUEUE_CTR_SIZE
#define QF_TIMEEVT_CTR_SIZE
#define QF_MPOOL_SIZ_SIZE
#define QF_MPOOL_CTR_SIZE
QS/C++ package-scope interface.
QS/C++ port to a 32-bit CPU, generic C++ compiler.
QP Functional Safety (FuSa) Subsystem.
#define Q_ASSERT_INCRIT(id_, expr_)
#define Q_REQUIRE_INCRIT(id_, expr_)
Date/time for time-stamping the QP builds (used in QS software tracing)