46 #error "Q_SPY must be defined to include qs.h"
66#if (QS_CTR_SIZE != 2U) && (QS_CTR_SIZE != 4U)
67#error QS_CTR_SIZE defined incorrectly, expected 2U or 4U;
80#define QS_TIME_SIZE 4U
84#if (QS_TIME_SIZE != 1U) && (QS_TIME_SIZE != 2U) && (QS_TIME_SIZE != 4U)
85#error QS_TIME_SIZE defined incorrectly, expected 1U, 2U, or 4U;
93#if (QS_CTR_SIZE == 2U)
99#if (QS_CTR_SIZE == 4U)
100typedef uint_fast32_t
QSCtr;
104#if (QS_TIME_SIZE == 4U)
110#if (QS_TIME_SIZE == 2U)
115#if (QS_TIME_SIZE == 1U)
120#if (QS_FUN_PTR_SIZE == 4U)
126#if (QS_FUN_PTR_SIZE == 8U)
127typedef uint64_t
QSFun;
131#if (QS_FUN_PTR_SIZE == 2U)
132typedef uint16_t
QSFun;
136#if (QS_FUN_PTR_SIZE == 1U)
137typedef uint8_t
QSFun;
341typedef void (* QSpyFunPtr )(void);
359 uint8_t glbFilter[16];
362 uint8_t locFilter[16];
449 uint_fast32_t
const stoSize);
634 uint8_t
const format,
646 uint8_t
const format,
657 uint8_t
const format,
671 uint8_t
const *
const blk,
682 void const *
const obj,
683 char const *
const name);
692 void const *
const obj,
693 char const *
const name);
702 void const *
const obj,
703 uint_fast16_t
const idx,
704 char const *
const name);
713 QSpyFunPtr
const fun,
714 char const *
const name);
724 char const *
const name);
735 char const *
const name);
745 char const *
const module,
747 uint32_t
const delay);
802 uint8_t
const format,
812 uint8_t
const format,
886 uint16_t
const stoSize);
894 if (head == QS_rxPriv_.
end) {
897 if (head != QS_rxPriv_.
tail) {
898 QS_rxPriv_.
buf[QS_rxPriv_.
head] = b;
899 QS_rxPriv_.
head = head;
935 uint8_t
const obj_kind,
936 void *
const obj_ptr);
995#define QS_INIT(arg_) (QS_onStartup(arg_))
1005#define QS_EXIT() (QS_onCleanup())
1013#define QS_OUTPUT() (QS_output())
1021#define QS_RX_INPUT() (QS_rx_input())
1038#define QS_GLB_FILTER(rec_) (QS_glbFilter_((int_fast16_t)(rec_)))
1054#define QS_LOC_FILTER(qs_id_) (QS_locFilter_((int_fast16_t)(qs_id_)))
1069#define QS_BEGIN_ID(rec_, qs_id_) \
1070if (QS_GLB_CHECK_(rec_) && QS_LOC_CHECK_(qs_id_)) { \
1073 QS_beginRec_((uint_fast8_t)(rec_)); \
1096#define QS_FLUSH() (QS_onFlush())
1100#define QS_BEGIN_NOCRIT(rec_, qs_id_) \
1101if (QS_GLB_CHECK_(rec_) && QS_LOC_CHECK_(qs_id_)) { \
1102 QS_beginRec_((uint_fast8_t)(rec_)); \
1107#define QS_END_NOCRIT() } \
1113#define QS_GLB_CHECK_(rec_) \
1114 (((uint_fast8_t)QS_priv_.glbFilter[(uint_fast8_t)(rec_) >> 3U] \
1115 & ((uint_fast8_t)1U << ((uint_fast8_t)(rec_) & 7U))) != 0U)
1119#define QS_LOC_CHECK_(qs_id_) \
1120 (((uint_fast8_t)QS_priv_.locFilter[(uint_fast8_t)(qs_id_) >> 3U] \
1121 & ((uint_fast8_t)1U << ((uint_fast8_t)(qs_id_) & 7U))) != 0U)
1130#define QS_REC_DONE() ((void)0)
1135#define QS_I8(width_, data_) \
1136 (QS_u8_fmt_((uint8_t)(((width_) << 4U) & 0x7U) | (uint8_t)QS_I8_ENUM_T, \
1141#define QS_U8(width_, data_) \
1142 (QS_u8_fmt_((uint8_t)(((width_) << 4)) | (uint8_t)QS_U8_T, (data_)))
1146#define QS_I16(width_, data_) \
1147 (QS_u16_fmt_((uint8_t)(((width_) << 4)) | (uint8_t)QS_I16_T, (data_)))
1151#define QS_U16(width_, data_) \
1152 (QS_u16_fmt_((uint8_t)(((width_) << 4)) | (uint8_t)QS_U16_T, (data_)))
1156#define QS_I32(width_, data_) \
1157 (QS_u32_fmt_((uint8_t)(((width_) << 4)) | (uint8_t)QS_I32_T, (data_)))
1161#define QS_U32(width_, data_) \
1162 (QS_u32_fmt_((uint8_t)(((width_) << 4)) | (uint8_t)QS_U32_T, (data_)))
1166#define QS_I64(width_, data_) \
1167 (QS_u64_fmt_((uint8_t)(((width_) << 4)) | (uint8_t)QS_I64_T, (data_)))
1171#define QS_U64(width_, data_) \
1172 (QS_u64_fmt_((uint8_t)(((width_) << 4)) | (uint8_t)QS_U64_T, (data_)))
1176#define QS_F32(width_, data_) \
1177 (QS_f32_fmt_((uint8_t)(((width_) << 4)) | (uint8_t)QS_F32_T, (data_)))
1181#define QS_F64(width_, data_) \
1182 (QS_f64_fmt_((uint8_t)(((width_) << 4)) | (uint8_t)QS_F64_T, (data_)))
1186#define QS_STR(str_) (QS_str_fmt_((str_)))
1190#define QS_MEM(mem_, size_) (QS_mem_fmt_((mem_), (size_)))
1194#define QS_ENUM(group_, value_) \
1195 (QS_u8_fmt_((uint8_t)(0x80U | ((group_) << 4U)) | (uint8_t)QS_I8_ENUM_T,\
1199#if (QS_TIME_SIZE == 4U)
1203#define QS_TIME_PRE_() (QS_u32_raw_(QS_onGetTime()))
1207#if (QS_TIME_SIZE == 2U)
1208#define QS_TIME_PRE_() (QS_u16_raw_(QS_onGetTime()))
1212#if (QS_TIME_SIZE == 1U)
1213#define QS_TIME_PRE_() (QS_u8_raw_(QS_onGetTime()))
1217#if (QS_OBJ_PTR_SIZE == 4U)
1219#define QS_OBJ(obj_) (QS_u32_fmt_(QS_OBJ_T, (uint32_t)(obj_)))
1223#if (QS_OBJ_PTR_SIZE == 2U)
1224#define QS_OBJ(obj_) (QS_u16_fmt_(QS_OBJ_T, (uint16_t)(obj_)))
1228#if (QS_OBJ_PTR_SIZE == 1U)
1229#define QS_OBJ(obj_) (QS_u8_fmt_(QS_OBJ_T, (uint8_t)(obj_)))
1233#if (QS_OBJ_PTR_SIZE == 8U)
1234#define QS_OBJ(obj_) (QS_u64_fmt_(QS_OBJ_T, (uint64_t)(obj_)))
1238#if (QS_FUN_PTR_SIZE == 4U)
1240#define QS_FUN(fun_) (QS_u32_fmt_(QS_FUN_T, (uint32_t)(fun_)))
1244#if (QS_FUN_PTR_SIZE == 2U)
1245#define QS_FUN(fun_) (QS_u16_fmt_(QS_FUN_T, (uint16_t)(fun_)))
1249#if (QS_FUN_PTR_SIZE == 1U)
1250#define QS_FUN(fun_) (QS_u8_fmt_(QS_FUN_T, (uint8_t)(fun_)))
1254#if (QS_FUN_PTR_SIZE == 8U)
1255#define QS_FUN(fun_) (QS_u64_fmt_(QS_FUN_T, (uint64_t)(fun_)))
1259#if (Q_SIGNAL_SIZE == 4U)
1263#define QS_SIG(sig_, obj_) \
1264 QS_u32_fmt_(QS_SIG_T, (sig_)); \
1269#if (Q_SIGNAL_SIZE == 2U)
1270#define QS_SIG(sig_, obj_) \
1271 QS_u16_fmt_(QS_SIG_T, (sig_)); \
1276#if (Q_SIGNAL_SIZE == 1U)
1277#define QS_SIG(sig_, obj_) \
1278 QS_u8_fmt_(QS_SIG_T, (sig_)); \
1315#define QS_SIG_DICTIONARY(sig_, obj_) \
1316 (QS_sig_dict_pre_((sig_), (obj_), #sig_))
1331#define QS_OBJ_DICTIONARY(obj_) \
1332 (QS_obj_dict_pre_((obj_), #obj_))
1349#define QS_OBJ_ARR_DICTIONARY(obj_, idx_) \
1350 (QS_obj_arr_dict_pre_((obj_), (idx_), #obj_))
1366#define QS_FUN_DICTIONARY(fun_) \
1367 (QS_fun_dict_pre_((void (*)(void))(fun_), #fun_))
1376#define QS_USR_DICTIONARY(rec_) \
1377 (QS_usr_dict_pre_((rec_), #rec_))
1386#define QS_ENUM_DICTIONARY(value_, group_) \
1387 (QS_enum_dict_pre_((value_), (group_), #value_))
1400 uint_fast8_t
const isrnest,
1401 uint_fast8_t
const prio_);
1406 uint_fast8_t isrnest,
1411#define QF_QS_ACTION(act_) (act_)
1417#define QS_EOD ((uint16_t)0xFFFFU)
1424#define QS_CMD ((uint8_t)7U)
1430#define QS_HEX_FMT ((uint8_t)0x0FU)
1439#ifndef QS_CRIT_STAT_TYPE
1440 #define QS_CRIT_STAT_
1441 #define QS_CRIT_E_() QS_CRIT_ENTRY(dummy)
1442 #define QS_CRIT_X_() QS_CRIT_EXIT(dummy); QS_REC_DONE()
1444 #define QS_CRIT_STAT_ QS_CRIT_STAT_TYPE critStat_;
1445 #define QS_CRIT_E_() QS_CRIT_ENTRY(critStat_)
1446 #define QS_CRIT_X_() QS_CRIT_EXIT(critStat_); QS_REC_DONE()
1451#ifndef QF_CRIT_STAT_TYPE
1462 #define QS_CRIT_STAT_
1473 #define QS_CRIT_E_() QF_CRIT_ENTRY(dummy)
1484 #define QS_CRIT_X_() QF_CRIT_EXIT(dummy); QS_REC_DONE()
1486#elif (!defined QS_CRIT_STAT_)
1488 #define QS_CRIT_STAT_ QF_CRIT_STAT_TYPE critStat_;
1489 #define QS_CRIT_E_() QF_CRIT_ENTRY(critStat_)
1490 #define QS_CRIT_X_() QF_CRIT_EXIT(critStat_); QS_REC_DONE()
1545 void const * sender,
1546 QActive * recipient,
1556#define QUTEST_ON_POST 124
1599 void const *
const par,
1600 uint_fast8_t
const qs_id);
1607 QEvt
const *
const e,
1608 uint_fast8_t
const qs_id);
1638 void const *
const par,
1639 uint_fast8_t
const qs_id);
1646 QEvt
const *
const e,
1647 uint_fast8_t
const qs_id);
1654 QPrioSpec
const prioSpec,
1655 QEvt
const * *
const qSto,
1656 uint_fast16_t
const qLen,
1657 void *
const stkSto,
1658 uint_fast16_t
const stkSize,
1659 void const *
const par);
1666 QEvt
const *
const e,
1667 uint_fast16_t
const margin,
1668 void const *
const sender);
1675 QEvt
const *
const e);
1680#define QS_TEST_PROBE_DEF(fun_) \
1681 uint32_t const qs_tp_ = QS_getTestProbe_((void (*)(void))(fun_));
1684#define QS_TEST_PROBE(code_) \
1685 if (qs_tp_ != 0U) { code_ }
1688#define QS_TEST_PROBE_ID(id_, code_) \
1689 if (qs_tp_ == (uint32_t)(id_)) { code_ }
1692#define QS_TEST_PAUSE() (QS_test_pause_())
1697#define QS_TEST_PROBE_DEF(fun_)
1698#define QS_TEST_PROBE(code_)
1699#define QS_TEST_PROBE_ID(id_, code_)
1700#define QS_TEST_PAUSE() ((void)0)
@ QS_QF_TIMEEVT_AUTO_DISARM
void QF_QS_ISR_EXIT(uint_fast8_t isrnest, uint_fast8_t prio)
@ QS_QF_MPOOL_GET_ATTEMPT
void QS_onTestPost(void const *sender, QActive *recipient, QEvt const *e, bool status)
uint32_t QS_getTestProbe_(QSpyFunPtr const api)
void QF_QS_ISR_ENTRY(uint_fast8_t const isrnest, uint_fast8_t const prio_)
void QS_onTestSetup(void)
@ QS_QF_EQUEUE_POST_ATTEMPT
void QF_QS_CRIT_EXIT(void)
@ QS_QF_TIMEEVT_DISARM_ATTEMPT
@ QS_QF_ACTIVE_RECALL_ATTEMPT
void QS_processTestEvts_(void)
@ QS_QF_ACTIVE_POST_ATTEMPT
void QS_test_pause_(void)
@ QS_QF_ACTIVE_UNSUBSCRIBE
void QS_onTestTeardown(void)
struct QS_TestData QS_testData
void QS_onTestEvt(QEvt *e)
void QF_QS_CRIT_ENTRY(void)
struct QS_TProbe tpBuf[16]
QS ID type for applying local filtering.
QActiveDummy Object class.
void QActiveDummy_start_(QActive *const me, QPrioSpec const prioSpec, QEvt const **const qSto, uint_fast16_t const qLen, void *const stkSto, uint_fast16_t const stkSize, void const *const par)
void QActiveDummy_ctor(QActiveDummy *const me)
void QActiveDummy_postLIFO_(QActive *const me, QEvt const *const e)
void QActiveDummy_dispatch_(QHsm *const me, QEvt const *const e, uint_fast8_t const qs_id)
void QActiveDummy_init_(QHsm *const me, void const *const par, uint_fast8_t const qs_id)
bool QActiveDummy_post_(QActive *const me, QEvt const *const e, uint_fast16_t const margin, void const *const sender)
void QHsmDummy_ctor(QHsmDummy *const me)
void QHsmDummy_dispatch_(QHsm *const me, QEvt const *const e, uint_fast8_t const qs_id)
void QHsmDummy_init_(QHsm *const me, void const *const par, uint_fast8_t const qs_id)
QS software tracing parameters for QS input (QS-RX)
void QS_queryCurrObj(uint8_t const obj_kind)
void QS_rxInitBuf(uint8_t *const sto, uint16_t const stoSize)
static bool QS_rxPut(uint8_t const b)
void QS_rxHandleGoodFrame_(uint8_t const state)
bool QS_RX_PUT(uint8_t const b)
void QS_setCurrObj(uint8_t const obj_kind, void *const obj_ptr)
uint16_t QS_rxGetNfree(void)
void QS_onCommand(uint8_t cmdId, uint32_t param1, uint32_t param2, uint32_t param3)
Software tracing, output QS-TX.
void QS_mem_fmt_(uint8_t const *const blk, uint8_t const size)
void QS_locFilter_(int_fast16_t const filter)
void const * locFilter_AP
void QS_u16_raw_(uint16_t const d)
void QS_target_info_pre_(uint8_t const isReset)
void QS_u32_fmt_(uint8_t const format, uint32_t const d)
void QS_beginRec_(uint_fast8_t const rec)
void QS_fun_dict_pre_(QSpyFunPtr const fun, char const *const name)
void QS_u64_fmt_(uint8_t format, uint64_t d)
void QS_obj_arr_dict_pre_(void const *const obj, uint_fast16_t const idx, char const *const name)
uint8_t const * QS_getBlock(uint16_t *const pNbytes)
void QS_u8_raw_(uint8_t const d)
void QS_u64_raw_(uint64_t d)
void QS_f64_fmt_(uint8_t const format, float64_t const d)
void QS_u8_fmt_(uint8_t const format, uint8_t const d)
void QS_usr_dict_pre_(enum_t const rec, char const *const name)
void QS_str_raw_(char const *const str)
void QS_u16_fmt_(uint8_t const format, uint16_t const d)
void QS_ASSERTION(char const *const module, int_t const loc, uint32_t const delay)
QSTimeCtr QS_onGetTime(void)
uint8_t QS_onStartup(void const *arg)
void QS_enum_dict_pre_(enum_t const value, uint8_t const group, char const *const name)
void QS_obj_dict_pre_(void const *const obj, char const *const name)
uint16_t QS_getByte(void)
void QS_sig_dict_pre_(enum_t const sig, void const *const obj, char const *const name)
void QS_glbFilter_(int_fast16_t const filter)
void QS_str_fmt_(char const *const str)
void QS_initBuf(uint8_t *const sto, uint_fast32_t const stoSize)
void QS_u32_raw_(uint32_t const d)
void QS_2u8_raw_(uint8_t const d1, uint8_t const d2)
void QS_obj_raw_(void const *const obj)
uint8_t volatile critNest
void QS_f32_fmt_(uint8_t const format, float32_t const d)