49Q_DEFINE_THIS_MODULE(
"qs")
57#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U))
58#error qpc version 7.3.0 or higher required
68 uint_fast32_t
const stoSize)
70 QS_priv_.buf = &sto[0];
71 QS_priv_.end = (QSCtr)stoSize;
77 QS_priv_.critNest = 0U;
81 QS_priv_.locFilter_AP = (
void *)0;
84 QS_beginRec_((uint_fast8_t)
QS_EMPTY);
88 QS_target_info_pre_(0xFFU);
95uint16_t QS_getByte(
void) {
97 if (QS_priv_.used == 0U) {
101 uint8_t
const *
const buf = QS_priv_.buf;
102 QSCtr tail = QS_priv_.tail;
103 ret = (uint16_t)buf[tail];
105 if (tail == QS_priv_.end) {
108 QS_priv_.tail = tail;
116uint8_t
const * QS_getBlock(uint16_t *
const pNbytes) {
117 QSCtr
const used = QS_priv_.used;
122 QSCtr tail = QS_priv_.tail;
123 QSCtr
const end = QS_priv_.end;
124 QSCtr n = (QSCtr)(end - tail);
128 if (n > (QSCtr)(*pNbytes)) {
129 n = (QSCtr)(*pNbytes);
131 *pNbytes = (uint16_t)n;
132 buf = &QS_priv_.buf[tail];
134 QS_priv_.used = (QSCtr)(used - n);
139 QS_priv_.tail = tail;
149#ifndef QF_MEM_ISOLATE
165void QS_glbFilter_(int_fast16_t
const filter) {
166 bool const isRemove = (filter < 0);
167 uint8_t
const rec = isRemove ? (uint8_t)(-filter) : (uint8_t)filter;
170 uint8_t
const tmp = (isRemove ? 0x00U : 0xFFU);
173 for (uint_fast8_t i = 0U;
177 QS_filt_.
glb[i ] = tmp;
178 QS_filt_.
glb[i + 1U] = tmp;
179 QS_filt_.
glb[i + 2U] = tmp;
180 QS_filt_.
glb[i + 3U] = tmp;
185 QS_filt_.
glb[0] = 0x01U;
186 QS_filt_.
glb[6] = 0x40U;
187 QS_filt_.
glb[7] = 0xFCU;
188 QS_filt_.
glb[8] = 0x7FU;
192 QS_filt_.
glb[15] = 0x1FU;
198 QS_filt_.
glb[0] &= (uint8_t)(~0xFEU & 0xFFU);
199 QS_filt_.
glb[1] &= (uint8_t)(~0x03U & 0xFFU);
200 QS_filt_.
glb[6] &= (uint8_t)(~0x80U & 0xFFU);
201 QS_filt_.
glb[7] &= (uint8_t)(~0x03U & 0xFFU);
204 QS_filt_.
glb[0] |= 0xFEU;
205 QS_filt_.
glb[1] |= 0x03U;
206 QS_filt_.
glb[6] |= 0x80U;
207 QS_filt_.
glb[7] |= 0x03U;
212 QS_filt_.
glb[1] &= (uint8_t)(~0xFCU & 0xFFU);
213 QS_filt_.
glb[2] &= (uint8_t)(~0x07U & 0xFFU);
214 QS_filt_.
glb[5] &= (uint8_t)(~0x20U & 0xFFU);
217 QS_filt_.
glb[1] |= 0xFCU;
218 QS_filt_.
glb[2] |= 0x07U;
219 QS_filt_.
glb[5] |= 0x20U;
224 QS_filt_.
glb[2] &= (uint8_t)(~0x78U & 0xFFU);
225 QS_filt_.
glb[5] &= (uint8_t)(~0x40U & 0xFFU);
228 QS_filt_.
glb[2] |= 0x78U;
229 QS_filt_.
glb[5] |= 0x40U;
234 QS_filt_.
glb[3] &= (uint8_t)(~0x03U & 0xFFU);
235 QS_filt_.
glb[5] &= (uint8_t)(~0x80U & 0xFFU);
238 QS_filt_.
glb[3] |= 0x03U;
239 QS_filt_.
glb[5] |= 0x80U;
244 QS_filt_.
glb[2] &= (uint8_t)(~0x80U & 0xFFU);
245 QS_filt_.
glb[3] &= (uint8_t)(~0xFCU & 0xFFU);
246 QS_filt_.
glb[4] &= (uint8_t)(~0xC0U & 0xFFU);
247 QS_filt_.
glb[5] &= (uint8_t)(~0x1FU & 0xFFU);
250 QS_filt_.
glb[2] |= 0x80U;
251 QS_filt_.
glb[3] |= 0xFCU;
252 QS_filt_.
glb[4] |= 0xC0U;
253 QS_filt_.
glb[5] |= 0x1FU;
258 QS_filt_.
glb[4] &= (uint8_t)(~0x3FU & 0xFFU);
261 QS_filt_.
glb[4] |= 0x3FU;
266 QS_filt_.
glb[6] &= (uint8_t)(~0x3FU & 0xFFU);
269 QS_filt_.
glb[6] |= 0x3FU;
274 QS_filt_.
glb[8] &= (uint8_t)(~0x80U & 0xFFU);
275 QS_filt_.
glb[9] &= (uint8_t)(~0x07U & 0xFFU);
278 QS_filt_.
glb[8] |= 0x80U;
279 QS_filt_.
glb[9] |= 0x07U;
284 QS_filt_.
glb[9] &= (uint8_t)(~0xF8U & 0xFFU);
285 QS_filt_.
glb[10] &= (uint8_t)(~0x01U & 0xFFU);
288 QS_filt_.
glb[9] |= 0xF8U;
289 QS_filt_.
glb[10] |= 0x01U;
294 QS_filt_.
glb[12] &= (uint8_t)(~0xF0U & 0xFFU);
295 QS_filt_.
glb[13] &= (uint8_t)(~0x01U & 0xFFU);
298 QS_filt_.
glb[12] |= 0xF0U;
299 QS_filt_.
glb[13] |= 0x01U;
304 QS_filt_.
glb[13] &= (uint8_t)(~0x3EU & 0xFFU);
307 QS_filt_.
glb[13] |= 0x3EU;
312 QS_filt_.
glb[13] &= (uint8_t)(~0xC0U & 0xFFU);
313 QS_filt_.
glb[14] &= (uint8_t)(~0x07U & 0xFFU);
316 QS_filt_.
glb[13] |= 0xC0U;
317 QS_filt_.
glb[14] |= 0x07U;
322 QS_filt_.
glb[14] &= (uint8_t)(~0xF8U & 0xFFU);
325 QS_filt_.
glb[14] |= 0xF8U;
330 QS_filt_.
glb[15] &= (uint8_t)(~0x1FU & 0xFFU);
333 QS_filt_.
glb[15] |= 0x1FU;
338 QS_filt_.
glb[12] &= (uint8_t)(~0xF0U & 0xFFU);
339 QS_filt_.
glb[13] = 0U;
340 QS_filt_.
glb[14] = 0U;
341 QS_filt_.
glb[15] &= (uint8_t)(~0x1FU & 0xFFU);
344 QS_filt_.
glb[12] |= 0xF0U;
345 QS_filt_.
glb[13] |= 0xFFU;
346 QS_filt_.
glb[14] |= 0xFFU;
347 QS_filt_.
glb[15] |= 0x1FU;
358 QS_filt_.
glb[rec >> 3U]
359 &= (uint8_t)(~(1U << (rec & 7U)) & 0xFFU);
362 QS_filt_.
glb[rec >> 3U]
363 |= (1U << (rec & 7U));
365 QS_filt_.
glb[15] &= 0x1FU;
373void QS_locFilter_(int_fast16_t
const filter) {
374 bool const isRemove = (filter < 0);
375 uint8_t
const qsId = isRemove ? (uint8_t)(-filter) : (uint8_t)filter;
376 uint8_t
const tmp = (isRemove ? 0x00U : 0xFFU);
381 for (i = 0U; i <
Q_DIM(QS_filt_.
loc); i += 4U) {
382 QS_filt_.
loc[i ] = tmp;
383 QS_filt_.
loc[i + 1U] = tmp;
384 QS_filt_.
loc[i + 2U] = tmp;
385 QS_filt_.
loc[i + 3U] = tmp;
389 for (i = 0U; i < 8U; i += 4U) {
390 QS_filt_.
loc[i ] = tmp;
391 QS_filt_.
loc[i + 1U] = tmp;
392 QS_filt_.
loc[i + 2U] = tmp;
393 QS_filt_.
loc[i + 3U] = tmp;
398 QS_filt_.
loc[i ] = tmp;
399 QS_filt_.
loc[i + 1U] = tmp;
403 QS_filt_.
loc[i ] = tmp;
404 QS_filt_.
loc[i + 1U] = tmp;
405 QS_filt_.
loc[i + 2U] = tmp;
406 QS_filt_.
loc[i + 3U] = tmp;
415 QS_filt_.
loc[qsId >> 3U]
416 &= (uint8_t)(~(1U << (qsId & 7U)) & 0xFFU);
419 QS_filt_.
loc[qsId >> 3U]
420 |= (1U << (qsId & 7U));
425 QS_filt_.
loc[0] |= 0x01U;
429void QS_beginRec_(uint_fast8_t
const rec) {
430 uint8_t
const b = (uint8_t)(QS_priv_.seq + 1U);
432 uint8_t *
const buf = QS_priv_.buf;
433 QSCtr head = QS_priv_.head;
434 QSCtr
const end = QS_priv_.end;
439 QS_INSERT_ESC_BYTE_(b)
441 chksum = (uint8_t)(chksum + rec);
442 QS_INSERT_BYTE_((uint8_t)rec)
444 QS_priv_.head = head;
445 QS_priv_.chksum = chksum;
449void QS_endRec_(
void) {
450 uint8_t *
const buf = QS_priv_.buf;
451 QSCtr head = QS_priv_.head;
452 QSCtr
const end = QS_priv_.end;
453 uint8_t b = QS_priv_.chksum;
458 if ((b != QS_FRAME) && (b != QS_ESC)) {
462 QS_INSERT_BYTE_(QS_ESC)
463 QS_INSERT_BYTE_(b ^ QS_ESC_XOR)
467 QS_INSERT_BYTE_(QS_FRAME)
469 QS_priv_.head = head;
472 if (QS_priv_.used > end) {
474 QS_priv_.tail = head;
479void QS_u8_raw_(uint8_t
const d) {
480 uint8_t chksum = QS_priv_.chksum;
481 uint8_t *
const buf = QS_priv_.buf;
482 QSCtr head = QS_priv_.head;
483 QSCtr
const end = QS_priv_.end;
486 QS_INSERT_ESC_BYTE_(d)
488 QS_priv_.head = head;
489 QS_priv_.chksum = chksum;
497 uint8_t chksum = QS_priv_.chksum;
498 uint8_t *
const buf = QS_priv_.buf;
499 QSCtr head = QS_priv_.head;
500 QSCtr
const end = QS_priv_.end;
503 QS_INSERT_ESC_BYTE_(d1)
504 QS_INSERT_ESC_BYTE_(d2)
506 QS_priv_.head = head;
507 QS_priv_.chksum = chksum;
511void QS_u16_raw_(uint16_t
const d) {
512 uint8_t chksum = QS_priv_.chksum;
513 uint8_t *
const buf = QS_priv_.buf;
514 QSCtr head = QS_priv_.head;
515 QSCtr
const end = QS_priv_.end;
520 QS_INSERT_ESC_BYTE_((uint8_t)x)
522 QS_INSERT_ESC_BYTE_((uint8_t)x)
524 QS_priv_.head = head;
525 QS_priv_.chksum = chksum;
529void QS_u32_raw_(uint32_t
const d) {
530 uint8_t chksum = QS_priv_.chksum;
531 uint8_t *
const buf = QS_priv_.buf;
532 QSCtr head = QS_priv_.head;
533 QSCtr
const end = QS_priv_.end;
537 for (uint_fast8_t i = 4U; i != 0U; --i) {
538 QS_INSERT_ESC_BYTE_((uint8_t)x)
542 QS_priv_.head = head;
543 QS_priv_.chksum = chksum;
547void QS_obj_raw_(
void const *
const obj) {
548 #if (QS_OBJ_PTR_SIZE == 1U)
549 QS_u8_raw_((uint8_t)obj);
550 #elif (QS_OBJ_PTR_SIZE == 2U)
551 QS_u16_raw_((uint16_t)obj);
552 #elif (QS_OBJ_PTR_SIZE == 4U)
553 QS_u32_raw_((uint32_t)obj);
554 #elif (QS_OBJ_PTR_SIZE == 8U)
555 QS_u64_raw_((uint64_t)obj);
557 QS_u32_raw_((uint32_t)obj);
562void QS_str_raw_(
char const *
const str) {
563 uint8_t chksum = QS_priv_.chksum;
564 uint8_t *
const buf = QS_priv_.buf;
565 QSCtr head = QS_priv_.head;
566 QSCtr
const end = QS_priv_.end;
567 QSCtr used = QS_priv_.used;
569 for (
char const *s = str; *s !=
'\0'; ++s) {
570 chksum += (uint8_t)*s;
571 QS_INSERT_BYTE_((uint8_t)*s)
574 QS_INSERT_BYTE_((uint8_t)
'\0')
577 QS_priv_.head = head;
578 QS_priv_.chksum = chksum;
579 QS_priv_.used = used;
584 uint8_t
const format,
587 uint8_t chksum = QS_priv_.chksum;
588 uint8_t *
const buf = QS_priv_.buf;
589 QSCtr head = QS_priv_.head;
590 QSCtr
const end = QS_priv_.end;
594 QS_INSERT_ESC_BYTE_(format)
595 QS_INSERT_ESC_BYTE_(d)
597 QS_priv_.head = head;
598 QS_priv_.chksum = chksum;
603 uint8_t
const format,
606 uint8_t chksum = QS_priv_.chksum;
607 uint8_t *
const buf = QS_priv_.buf;
608 QSCtr head = QS_priv_.head;
609 QSCtr
const end = QS_priv_.end;
610 uint8_t b = (uint8_t)d;
614 QS_INSERT_ESC_BYTE_(format)
615 QS_INSERT_ESC_BYTE_(b)
616 b = (uint8_t)(d >> 8U);
617 QS_INSERT_ESC_BYTE_(b)
619 QS_priv_.head = head;
620 QS_priv_.chksum = chksum;
625 uint8_t
const format,
628 uint8_t chksum = QS_priv_.chksum;
629 uint8_t *
const buf = QS_priv_.buf;
630 QSCtr head = QS_priv_.head;
631 QSCtr
const end = QS_priv_.end;
635 QS_INSERT_ESC_BYTE_(format)
638 for (uint_fast8_t i = 4U; i != 0U; --i) {
639 QS_INSERT_ESC_BYTE_((uint8_t)x)
643 QS_priv_.head = head;
644 QS_priv_.chksum = chksum;
648void QS_str_fmt_(
char const *
const str) {
649 uint8_t chksum = QS_priv_.chksum;
650 uint8_t *
const buf = QS_priv_.buf;
651 QSCtr head = QS_priv_.head;
652 QSCtr
const end = QS_priv_.end;
653 QSCtr used = QS_priv_.used;
659 for (
char const *s = str; *s !=
'\0'; ++s) {
660 QS_INSERT_BYTE_((uint8_t)*s)
661 chksum += (uint8_t)*s;
666 QS_priv_.head = head;
667 QS_priv_.chksum = chksum;
668 QS_priv_.used = used;
673 uint8_t
const *
const blk,
676 uint8_t chksum = QS_priv_.chksum;
677 uint8_t *
const buf = QS_priv_.buf;
678 QSCtr head = QS_priv_.head;
679 QSCtr
const end = QS_priv_.end;
680 uint8_t
const *pb = blk;
682 QS_priv_.used += ((QSCtr)size + 2U);
687 QS_INSERT_ESC_BYTE_(size)
689 for (uint8_t len = size; len > 0U; --len) {
690 QS_INSERT_ESC_BYTE_(*pb)
694 QS_priv_.head = head;
695 QS_priv_.chksum = chksum;
699void QS_sig_dict_pre_(
701 void const *
const obj,
702 char const *
const name)
711 QS_STR_PRE_((*name ==
'&') ? &name[1] : name);
720void QS_obj_dict_pre_(
721 void const *
const obj,
722 char const *
const name)
730 QS_STR_PRE_((*name ==
'&') ? &name[1] : name);
739void QS_obj_arr_dict_pre_(
740 void const *
const obj,
741 uint_fast16_t
const idx,
742 char const *
const name)
751 uint_fast16_t tmp = idx;
754 idx_str[2] = (uint8_t)((uint8_t)
'0' + (tmp % 10U));
756 idx_str[1] = (uint8_t)((uint8_t)
'0' + (tmp % 10U));
757 if (idx_str[1] == (uint8_t)
'0') {
762 idx_str[0] = (uint8_t)((uint8_t)
'0' + (tmp % 10U));
763 if (idx_str[0] == (uint8_t)
'0') {
771 uint8_t j = ((*name ==
'&') ? 1U : 0U);
778 for (; name[j] !=
'\0'; ++j) {
780 if (name[j] ==
'[') {
785 for (; idx_str[i] != 0U; ++i) {
786 QS_U8_PRE_(idx_str[i]);
789 for (; name[j] !=
'\0'; ++j) {
790 if (name[j] ==
']') {
794 for (; name[j] !=
'\0'; ++j) {
806void QS_fun_dict_pre_(
807 QSpyFunPtr
const fun,
808 char const *
const name)
816 QS_STR_PRE_((*name ==
'&') ? &name[1] : name);
825void QS_usr_dict_pre_(
827 char const *
const name)
844void QS_enum_dict_pre_(
847 char const *
const name)
854 QS_2U8_PRE_(value, group);
864void QS_assertion_pre_(
865 char const *
const module,
867 uint32_t
const delay)
874 QS_STR_PRE_((module != (
char *)0) ? module :
"?");
879 for (uint32_t
volatile delay_ctr = delay;
880 delay_ctr > 0U; --delay_ctr)
886void QS_target_info_pre_(uint8_t
const isReset) {
889 static uint8_t
const ZERO = (uint8_t)
'0';
890 static uint8_t
const *
const TIME = (uint8_t
const *)&
Q_BUILD_TIME[0];
891 static uint8_t
const *
const DATE = (uint8_t
const *)&
Q_BUILD_DATE[0];
897 endian_test.u16 = 0x0102U;
900 QS_U16_PRE_(((endian_test.u8[0] == 0x01U)
907#ifdef QF_EQUEUE_CTR_SIZE
913#ifdef QF_MPOOL_CTR_SIZE
927 QS_U8_PRE_((10U * (uint8_t)(TIME[6] - ZERO))
928 + (uint8_t)(TIME[7] - ZERO));
929 QS_U8_PRE_((10U * (uint8_t)(TIME[3] - ZERO))
930 + (uint8_t)(TIME[4] - ZERO));
932 QS_U8_PRE_(TIME[1] - ZERO);
935 QS_U8_PRE_((10U * (uint8_t)(TIME[0] - ZERO))
936 + (uint8_t)(TIME[1] - ZERO));
941 QS_U8_PRE_(DATE[5] - ZERO);
944 QS_U8_PRE_((10U * (uint8_t)(DATE[4] - ZERO))
945 + (uint8_t)(DATE[5] - ZERO));
991 QS_U8_PRE_((10U * (uint8_t)(DATE[9] - ZERO))
992 + (uint8_t)(DATE[10] - ZERO));
#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_ASSERT_FAIL
assertion failed in the code
@ QS_U2_RECORDS
User Group 110-114 records.
@ QS_ENUM_DICT
enumeration dictionary entry
@ QS_FUN_DICT
function dictionary entry
@ QS_MP_RECORDS
Memory Pools QS records.
@ QS_STR_T
zero-terminated ASCII string format
@ QS_MEM_T
up to 255-bytes memory block format
@ QS_TE_RECORDS
Time Events QS records.
@ QS_EP_IDS
event-pool IDs
@ QS_USER
the first record available to QS users
@ QS_PRE_MAX
the # predefined signals
@ QS_AO_IDS
AO IDs (priorities)
@ QS_SM_RECORDS
State Machine QS records.
@ QS_OBJ_DICT
object dictionary entry
@ QS_U0_RECORDS
User Group 100-104 records.
@ QS_TARGET_INFO
reports the Target information
@ QS_U3_RECORDS
User Group 115-119 records.
@ QS_MTX_RECORDS
Mutex QS records.
@ QS_U4_RECORDS
User Group 120-124 records.
@ QS_AO_RECORDS
Active Object QS records.
@ QS_SEM_RECORDS
Semaphore QS records.
@ QS_QF_RECORDS
QF QS records.
@ QS_SC_RECORDS
Scheduler QS records.
@ QS_EMPTY
QS record for cleanly starting a session.
@ QS_SIG_DICT
signal dictionary entry
@ QS_U1_RECORDS
User Group 105-109 records.
@ QS_EQ_RECORDS
Event Queues QS records.
@ QS_USR_DICT
user QS record dictionary entry
@ QS_ALL_RECORDS
all maskable QS records
@ QS_UA_RECORDS
All User records.
@ QS_AP_IDS
Application-specific IDs.
QS/C package-scope interface.
QP Functional Safety (FuSa) Subsystem.
#define Q_ASSERT_STATIC(expr_)
#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)
char const Q_BUILD_TIME[9]
the time of the last translation of the form: "hh:mm:ss"
char const Q_BUILD_DATE[12]
the calendar date of the last translation of the form: "Mmm dd yyyy"
QS type for output filters (global and local)