trcEvent.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  1. /*
  2. * Percepio Trace Recorder for Tracealyzer v4.9.2
  3. * Copyright 2023 Percepio AB
  4. * www.percepio.com
  5. *
  6. * SPDX-License-Identifier: Apache-2.0
  7. *
  8. * The implementation for events.
  9. */
  10. #include <trcRecorder.h>
  11. #if (TRC_USE_TRACEALYZER_RECORDER == 1) && (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING)
  12. #include <string.h>
  13. /**
  14. * @internal Macro helper for setting trace event parameter count.
  15. */
  16. #define TRC_EVENT_SET_PARAM_COUNT(id, n) ((uint16_t)(((uint16_t)(id)) | ((((uint16_t)(n)) & 0xF) << 12)))
  17. /**
  18. * @internal Macro helper for getting trace event parameter count.
  19. */
  20. #define TRC_EVENT_GET_PARAM_COUNT(id) (((id) >> 12u) & 0xFU)
  21. #if (TRC_CFG_CORE_COUNT > 1)
  22. #define TRC_EVENT_SET_EVENT_COUNT(c) ((uint16_t)(((TRC_CFG_GET_CURRENT_CORE() & 0xF) << 12) | ((uint16_t)(c) & 0xFFF)))
  23. #else
  24. #define TRC_EVENT_SET_EVENT_COUNT(c) ((uint16_t)(c))
  25. #endif
  26. /**
  27. * @internal Macro optimization for getting trace event size.
  28. */
  29. #define TRC_EVENT_GET_SIZE(pvAddress, puiSize) (*(uint32_t*)(puiSize) = sizeof(TraceEvent0_t) + (TRC_EVENT_GET_PARAM_COUNT(((TraceEvent0_t*)(pvAddress))->EventID)) * sizeof(TraceBaseType_t), TRC_SUCCESS)
  30. /**
  31. * @internal Macro helper for setting base event data.
  32. */
  33. #define SET_BASE_EVENT_DATA(pxEvent, eventId, paramCount, eventCount) \
  34. ( \
  35. (pxEvent)->EventID = TRC_EVENT_SET_PARAM_COUNT(eventId, paramCount), \
  36. (pxEvent)->EventCount = TRC_EVENT_SET_EVENT_COUNT(eventCount), \
  37. xTraceTimestampGet(&(pxEvent)->TS) \
  38. )
  39. #define TRACE_EVENT_BEGIN_OFFLINE(size) \
  40. TRACE_ENTER_CRITICAL_SECTION(); \
  41. pxTraceEventDataTable->coreEventData[TRC_CFG_GET_CURRENT_CORE()].eventCounter++; \
  42. if (xTraceStreamPortAllocate((uint32_t)(size), (void**)&pxEventData) == TRC_FAIL) /*cstat !MISRAC2004-11.4 !MISRAC2012-Rule-11.3 Suppress pointer checks*/ \
  43. { \
  44. TRACE_EXIT_CRITICAL_SECTION(); \
  45. return TRC_FAIL; \
  46. } \
  47. SET_BASE_EVENT_DATA(pxEventData, uiEventCode, ((size) - sizeof(TraceEvent0_t)) / sizeof(TraceUnsignedBaseType_t), pxTraceEventDataTable->coreEventData[TRC_CFG_GET_CURRENT_CORE()].eventCounter); /*cstat !MISRAC2012-Rule-11.5 Suppress pointer checks*/
  48. #define TRACE_EVENT_BEGIN(size) \
  49. /* We need to check this */ \
  50. if (!xTraceIsRecorderEnabled()) \
  51. { \
  52. return TRC_FAIL; \
  53. } \
  54. TRACE_EVENT_BEGIN_OFFLINE(size)
  55. #define TRACE_EVENT_END(size) \
  56. (void)xTraceStreamPortCommit(pxEventData, (uint32_t)(size), &iBytesCommitted); \
  57. TRACE_EXIT_CRITICAL_SECTION(); \
  58. /* We need to use iBytesCommitted for the above call but do not use the value, \
  59. * remove potential warnings */ \
  60. (void)iBytesCommitted;
  61. #define TRACE_EVENT_ADD_1(__p1) \
  62. pxEventData->uxParams[0] = __p1;
  63. #define TRACE_EVENT_ADD_2(__p1, __p2) \
  64. TRACE_EVENT_ADD_1(__p1) \
  65. pxEventData->uxParams[1] = __p2;
  66. #define TRACE_EVENT_ADD_3(__p1, __p2, __p3) \
  67. TRACE_EVENT_ADD_2(__p1, __p2) \
  68. pxEventData->uxParams[2] = __p3;
  69. #define TRACE_EVENT_ADD_4(__p1, __p2, __p3, __p4) \
  70. TRACE_EVENT_ADD_3(__p1, __p2, __p3) \
  71. pxEventData->uxParams[3] = __p4;
  72. #define TRACE_EVENT_ADD_5(__p1, __p2, __p3, __p4, __p5) \
  73. TRACE_EVENT_ADD_4(__p1, __p2, __p3, __p4) \
  74. pxEventData->uxParams[4] = __p5;
  75. #define TRACE_EVENT_ADD_6(__p1, __p2, __p3, __p4, __p5, __p6) \
  76. TRACE_EVENT_ADD_5(__p1, __p2, __p3, __p4, __p5) \
  77. pxEventData->uxParams[5] = __p6;
  78. #define TRACE_EVENT_ADD_0_DATA(__pvData, __uxSize) \
  79. memcpy(&((uint8_t*)pxEventData)[sizeof(TraceEvent0_t)], __pvData, __uxSize);
  80. #define TRACE_EVENT_ADD_1_DATA(__p1, __pvData, __uxSize) \
  81. TRACE_EVENT_ADD_1(__p1) \
  82. memcpy(&((uint8_t*)pxEventData)[sizeof(TraceEvent1_t)], __pvData, __uxSize);
  83. #define TRACE_EVENT_ADD_2_DATA(__p1, __p2, __pvData, __uxSize) \
  84. TRACE_EVENT_ADD_2(__p1, __p2) \
  85. memcpy(&((uint8_t*)pxEventData)[sizeof(TraceEvent2_t)], __pvData, __uxSize);
  86. #define TRACE_EVENT_ADD_3_DATA(__p1, __p2, __p3, __pvData, __uxSize) \
  87. TRACE_EVENT_ADD_3(__p1, __p2, __p3) \
  88. memcpy(&((uint8_t*)pxEventData)[sizeof(TraceEvent3_t)], __pvData, __uxSize);
  89. #define TRACE_EVENT_ADD_4_DATA(__p1, __p2, __p3, __p4, __pvData, __uxSize) \
  90. TRACE_EVENT_ADD_4(__p1, __p2, __p3, __p4) \
  91. memcpy(&((uint8_t*)pxEventData)[sizeof(TraceEvent4_t)], __pvData, __uxSize);
  92. #define TRACE_EVENT_ADD_5_DATA(__p1, __p2, __p3, __p4, __p5, __pvData, __uxSize) \
  93. TRACE_EVENT_ADD_5(__p1, __p2, __p3, __p4, __p5) \
  94. memcpy(&((uint8_t*)pxEventData)[sizeof(TraceEvent5_t)], __pvData, __uxSize);
  95. #define TRACE_EVENT_ADD_6_DATA(__p1, __p2, __p3, __p4, __p5, __p6, __pvData, __uxSize) \
  96. TRACE_EVENT_ADD_6(__p1, __p2, __p3, __p4, __p5, __p6) \
  97. memcpy(&((uint8_t*)pxEventData)[sizeof(TraceEvent6_t)], __pvData, __uxSize);
  98. TraceEventDataTable_t *pxTraceEventDataTable TRC_CFG_RECORDER_DATA_ATTRIBUTE;
  99. traceResult xTraceEventInitialize(TraceEventDataTable_t* pxBuffer)
  100. {
  101. uint32_t i;
  102. /* This should never fail */
  103. TRC_ASSERT(pxBuffer != (void*)0);
  104. pxTraceEventDataTable = pxBuffer;
  105. for (i = 0u; i < (uint32_t)(TRC_CFG_CORE_COUNT); i++)
  106. {
  107. pxTraceEventDataTable->coreEventData[i].eventCounter = 0u;
  108. }
  109. xTraceSetComponentInitialized(TRC_RECORDER_COMPONENT_EVENT);
  110. return TRC_SUCCESS;
  111. }
  112. traceResult xTraceEventCreate0(uint32_t uiEventCode)
  113. {
  114. TraceEvent0_t* pxEventData = (void*)0;
  115. int32_t iBytesCommitted = 0;
  116. TRACE_ALLOC_CRITICAL_SECTION();
  117. TRACE_EVENT_BEGIN(sizeof(TraceEvent0_t));
  118. TRACE_EVENT_END(sizeof(TraceEvent0_t));
  119. return TRC_SUCCESS;
  120. }
  121. traceResult xTraceEventCreate1(uint32_t uiEventCode, TraceUnsignedBaseType_t uxParam1)
  122. {
  123. TraceEvent1_t* pxEventData = (void*)0;
  124. int32_t iBytesCommitted = 0;
  125. TRACE_ALLOC_CRITICAL_SECTION();
  126. TRACE_EVENT_BEGIN(sizeof(TraceEvent1_t));
  127. TRACE_EVENT_ADD_1(uxParam1);
  128. TRACE_EVENT_END(sizeof(TraceEvent1_t));
  129. return TRC_SUCCESS;
  130. }
  131. traceResult xTraceEventCreate2(uint32_t uiEventCode, TraceUnsignedBaseType_t uxParam1, TraceUnsignedBaseType_t uxParam2)
  132. {
  133. TraceEvent2_t* pxEventData = (void*)0;
  134. int32_t iBytesCommitted = 0;
  135. TRACE_ALLOC_CRITICAL_SECTION();
  136. TRACE_EVENT_BEGIN(sizeof(TraceEvent2_t));
  137. TRACE_EVENT_ADD_2(uxParam1, uxParam2);
  138. TRACE_EVENT_END(sizeof(TraceEvent2_t));
  139. return TRC_SUCCESS;
  140. }
  141. traceResult xTraceEventCreate3(uint32_t uiEventCode, TraceUnsignedBaseType_t uxParam1, TraceUnsignedBaseType_t uxParam2, TraceUnsignedBaseType_t uxParam3)
  142. {
  143. TraceEvent3_t* pxEventData = (void*)0;
  144. int32_t iBytesCommitted = 0;
  145. TRACE_ALLOC_CRITICAL_SECTION();
  146. TRACE_EVENT_BEGIN(sizeof(TraceEvent3_t));
  147. TRACE_EVENT_ADD_3(uxParam1, uxParam2, uxParam3);
  148. TRACE_EVENT_END(sizeof(TraceEvent3_t));
  149. return TRC_SUCCESS;
  150. }
  151. traceResult xTraceEventCreate4(uint32_t uiEventCode, TraceUnsignedBaseType_t uxParam1, TraceUnsignedBaseType_t uxParam2, TraceUnsignedBaseType_t uxParam3, TraceUnsignedBaseType_t uxParam4)
  152. {
  153. TraceEvent4_t* pxEventData = (void*)0;
  154. int32_t iBytesCommitted = 0;
  155. TRACE_ALLOC_CRITICAL_SECTION();
  156. TRACE_EVENT_BEGIN(sizeof(TraceEvent4_t));
  157. TRACE_EVENT_ADD_4(uxParam1, uxParam2, uxParam3, uxParam4);
  158. TRACE_EVENT_END(sizeof(TraceEvent4_t));
  159. return TRC_SUCCESS;
  160. }
  161. traceResult xTraceEventCreate5(uint32_t uiEventCode, TraceUnsignedBaseType_t uxParam1, TraceUnsignedBaseType_t uxParam2, TraceUnsignedBaseType_t uxParam3, TraceUnsignedBaseType_t uxParam4, TraceUnsignedBaseType_t uxParam5)
  162. {
  163. TraceEvent5_t* pxEventData = (void*)0;
  164. int32_t iBytesCommitted = 0;
  165. TRACE_ALLOC_CRITICAL_SECTION();
  166. TRACE_EVENT_BEGIN(sizeof(TraceEvent5_t));
  167. TRACE_EVENT_ADD_5(uxParam1, uxParam2, uxParam3, uxParam4, uxParam5);
  168. TRACE_EVENT_END(sizeof(TraceEvent5_t));
  169. return TRC_SUCCESS;
  170. }
  171. traceResult xTraceEventCreate6(uint32_t uiEventCode, TraceUnsignedBaseType_t uxParam1, TraceUnsignedBaseType_t uxParam2, TraceUnsignedBaseType_t uxParam3, TraceUnsignedBaseType_t uxParam4, TraceUnsignedBaseType_t uxParam5, TraceUnsignedBaseType_t uxParam6)
  172. {
  173. TraceEvent6_t* pxEventData = (void*)0;
  174. int32_t iBytesCommitted = 0;
  175. TRACE_ALLOC_CRITICAL_SECTION();
  176. TRACE_EVENT_BEGIN(sizeof(TraceEvent6_t));
  177. TRACE_EVENT_ADD_6(uxParam1, uxParam2, uxParam3, uxParam4, uxParam5, uxParam6);
  178. TRACE_EVENT_END(sizeof(TraceEvent6_t));
  179. return TRC_SUCCESS;
  180. }
  181. traceResult xTraceEventCreateRawBlocking(const void* pxSource, uint32_t ulSize)
  182. {
  183. int32_t iBytesCommitted = 0;
  184. void* pxBuffer = (void*)0;
  185. TRACE_ALLOC_CRITICAL_SECTION();
  186. ulSize = TRC_ALIGN_CEIL(ulSize, sizeof(TraceUnsignedBaseType_t));
  187. TRACE_ENTER_CRITICAL_SECTION();
  188. pxTraceEventDataTable->coreEventData[TRC_CFG_GET_CURRENT_CORE()].eventCounter++;
  189. while (xTraceStreamPortAllocate(ulSize, (void**)&pxBuffer) == TRC_FAIL) {}
  190. memcpy(pxBuffer, pxSource, ulSize);
  191. while (xTraceStreamPortCommit(pxBuffer, ulSize, &iBytesCommitted) == TRC_FAIL) {}
  192. (void)iBytesCommitted;
  193. TRACE_EXIT_CRITICAL_SECTION();
  194. return TRC_SUCCESS;
  195. }
  196. traceResult xTraceEventCreateDataOffline0(uint32_t uiEventCode, const TraceUnsignedBaseType_t* const puxData, TraceUnsignedBaseType_t uxSize)
  197. {
  198. TraceEvent0_t* pxEventData = (void*)0;
  199. int32_t iBytesCommitted = 0;
  200. TRACE_ALLOC_CRITICAL_SECTION();
  201. /* Align payload size and truncate in case it is too big */
  202. uxSize = TRC_ALIGN_CEIL(uxSize, sizeof(TraceUnsignedBaseType_t));
  203. if (sizeof(TraceEvent0_t) + uxSize > TRC_MAX_BLOB_SIZE)
  204. {
  205. uxSize = TRC_MAX_BLOB_SIZE - sizeof(TraceEvent0_t);
  206. }
  207. TRACE_EVENT_BEGIN_OFFLINE(sizeof(TraceEvent0_t) + uxSize);
  208. TRACE_EVENT_ADD_0_DATA(puxData, uxSize);
  209. TRACE_EVENT_END(sizeof(TraceEvent0_t) + uxSize);
  210. return TRC_SUCCESS;
  211. }
  212. traceResult xTraceEventCreateData0(uint32_t uiEventCode, const TraceUnsignedBaseType_t* const puxData, TraceUnsignedBaseType_t uxSize)
  213. {
  214. TraceEvent0_t* pxEventData = (void*)0;
  215. int32_t iBytesCommitted = 0;
  216. TRACE_ALLOC_CRITICAL_SECTION();
  217. /* Align payload size and truncate in case it is too big */
  218. uxSize = TRC_ALIGN_CEIL(uxSize, sizeof(TraceUnsignedBaseType_t));
  219. if (sizeof(TraceEvent0_t) + uxSize > TRC_MAX_BLOB_SIZE)
  220. {
  221. uxSize = TRC_MAX_BLOB_SIZE - sizeof(TraceEvent0_t);
  222. }
  223. TRACE_EVENT_BEGIN(sizeof(TraceEvent0_t) + uxSize);
  224. TRACE_EVENT_ADD_0_DATA(puxData, uxSize);
  225. TRACE_EVENT_END(sizeof(TraceEvent0_t) + uxSize);
  226. return TRC_SUCCESS;
  227. }
  228. traceResult xTraceEventCreateData1(
  229. uint32_t uiEventCode,
  230. TraceUnsignedBaseType_t uxParam1,
  231. const TraceUnsignedBaseType_t* const puxData,
  232. TraceUnsignedBaseType_t uxSize
  233. )
  234. {
  235. TraceEvent1_t* pxEventData = (void*)0;
  236. int32_t iBytesCommitted = 0;
  237. TRACE_ALLOC_CRITICAL_SECTION();
  238. /* Align payload size and truncate in case it is too big */
  239. uxSize = TRC_ALIGN_CEIL(uxSize, sizeof(TraceUnsignedBaseType_t));
  240. if (sizeof(TraceEvent1_t) + uxSize > TRC_MAX_BLOB_SIZE)
  241. {
  242. uxSize = TRC_MAX_BLOB_SIZE - sizeof(TraceEvent1_t);
  243. }
  244. TRACE_EVENT_BEGIN(sizeof(TraceEvent1_t) + uxSize);
  245. TRACE_EVENT_ADD_1_DATA(uxParam1, puxData, uxSize);
  246. TRACE_EVENT_END(sizeof(TraceEvent1_t) + uxSize);
  247. return TRC_SUCCESS;
  248. }
  249. traceResult xTraceEventCreateData2(
  250. uint32_t uiEventCode,
  251. TraceUnsignedBaseType_t uxParam1,
  252. TraceUnsignedBaseType_t uxParam2,
  253. const TraceUnsignedBaseType_t* const puxData,
  254. TraceUnsignedBaseType_t uxSize
  255. )
  256. {
  257. TraceEvent2_t* pxEventData = (void*)0;
  258. int32_t iBytesCommitted = 0;
  259. TRACE_ALLOC_CRITICAL_SECTION();
  260. /* Align payload size and truncate in case it is too big */
  261. uxSize = TRC_ALIGN_CEIL(uxSize, sizeof(TraceUnsignedBaseType_t));
  262. if (sizeof(TraceEvent2_t) + uxSize > TRC_MAX_BLOB_SIZE)
  263. {
  264. uxSize = TRC_MAX_BLOB_SIZE - sizeof(TraceEvent2_t);
  265. }
  266. TRACE_EVENT_BEGIN(sizeof(TraceEvent2_t) + uxSize);
  267. TRACE_EVENT_ADD_2_DATA(uxParam1, uxParam2, puxData, uxSize);
  268. TRACE_EVENT_END(sizeof(TraceEvent2_t) + uxSize);
  269. return TRC_SUCCESS;
  270. }
  271. traceResult xTraceEventCreateData3(
  272. uint32_t uiEventCode,
  273. TraceUnsignedBaseType_t uxParam1,
  274. TraceUnsignedBaseType_t uxParam2,
  275. TraceUnsignedBaseType_t uxParam3,
  276. const TraceUnsignedBaseType_t* const puxData,
  277. TraceUnsignedBaseType_t uxSize
  278. )
  279. {
  280. TraceEvent3_t* pxEventData = (void*)0;
  281. int32_t iBytesCommitted = 0;
  282. TRACE_ALLOC_CRITICAL_SECTION();
  283. /* Align payload size and truncate in case it is too big */
  284. uxSize = TRC_ALIGN_CEIL(uxSize, sizeof(TraceUnsignedBaseType_t));
  285. if (sizeof(TraceEvent3_t) + uxSize > TRC_MAX_BLOB_SIZE)
  286. {
  287. uxSize = TRC_MAX_BLOB_SIZE - sizeof(TraceEvent3_t);
  288. }
  289. TRACE_EVENT_BEGIN(sizeof(TraceEvent3_t) + uxSize);
  290. TRACE_EVENT_ADD_3_DATA(uxParam1, uxParam2, uxParam3, puxData, uxSize);
  291. TRACE_EVENT_END(sizeof(TraceEvent3_t) + uxSize);
  292. return TRC_SUCCESS;
  293. }
  294. traceResult xTraceEventCreateData4(
  295. uint32_t uiEventCode,
  296. TraceUnsignedBaseType_t uxParam1,
  297. TraceUnsignedBaseType_t uxParam2,
  298. TraceUnsignedBaseType_t uxParam3,
  299. TraceUnsignedBaseType_t uxParam4,
  300. const TraceUnsignedBaseType_t* const puxData,
  301. TraceUnsignedBaseType_t uxSize
  302. )
  303. {
  304. TraceEvent4_t* pxEventData = (void*)0;
  305. int32_t iBytesCommitted = 0;
  306. TRACE_ALLOC_CRITICAL_SECTION();
  307. /* Align payload size and truncate in case it is too big */
  308. uxSize = TRC_ALIGN_CEIL(uxSize, sizeof(TraceUnsignedBaseType_t));
  309. if (sizeof(TraceEvent4_t) + uxSize > TRC_MAX_BLOB_SIZE)
  310. {
  311. uxSize = TRC_MAX_BLOB_SIZE - sizeof(TraceEvent4_t);
  312. }
  313. TRACE_EVENT_BEGIN(sizeof(TraceEvent4_t) + uxSize);
  314. TRACE_EVENT_ADD_4_DATA(uxParam1, uxParam2, uxParam3, uxParam4, puxData, uxSize);
  315. TRACE_EVENT_END(sizeof(TraceEvent4_t) + uxSize);
  316. return TRC_SUCCESS;
  317. }
  318. traceResult xTraceEventCreateData5(
  319. uint32_t uiEventCode,
  320. TraceUnsignedBaseType_t uxParam1,
  321. TraceUnsignedBaseType_t uxParam2,
  322. TraceUnsignedBaseType_t uxParam3,
  323. TraceUnsignedBaseType_t uxParam4,
  324. TraceUnsignedBaseType_t uxParam5,
  325. const TraceUnsignedBaseType_t* const puxData,
  326. TraceUnsignedBaseType_t uxSize
  327. )
  328. {
  329. TraceEvent5_t* pxEventData = (void*)0;
  330. int32_t iBytesCommitted = 0;
  331. TRACE_ALLOC_CRITICAL_SECTION();
  332. /* Align payload size and truncate in case it is too big */
  333. uxSize = TRC_ALIGN_CEIL(uxSize, sizeof(TraceUnsignedBaseType_t));
  334. if (sizeof(TraceEvent5_t) + uxSize > TRC_MAX_BLOB_SIZE)
  335. {
  336. uxSize = TRC_MAX_BLOB_SIZE - sizeof(TraceEvent5_t);
  337. }
  338. TRACE_EVENT_BEGIN(sizeof(TraceEvent5_t) + uxSize);
  339. TRACE_EVENT_ADD_5_DATA(uxParam1, uxParam2, uxParam3, uxParam4, uxParam5, puxData, uxSize);
  340. TRACE_EVENT_END(sizeof(TraceEvent5_t) + uxSize);
  341. return TRC_SUCCESS;
  342. }
  343. traceResult xTraceEventCreateData6(
  344. uint32_t uiEventCode,
  345. TraceUnsignedBaseType_t uxParam1,
  346. TraceUnsignedBaseType_t uxParam2,
  347. TraceUnsignedBaseType_t uxParam3,
  348. TraceUnsignedBaseType_t uxParam4,
  349. TraceUnsignedBaseType_t uxParam5,
  350. TraceUnsignedBaseType_t uxParam6,
  351. const TraceUnsignedBaseType_t* const puxData,
  352. TraceUnsignedBaseType_t uxSize
  353. )
  354. {
  355. TraceEvent6_t* pxEventData = (void*)0;
  356. int32_t iBytesCommitted = 0;
  357. TRACE_ALLOC_CRITICAL_SECTION();
  358. /* Align payload size and truncate in case it is too big */
  359. uxSize = TRC_ALIGN_CEIL(uxSize, sizeof(TraceUnsignedBaseType_t));
  360. if (sizeof(TraceEvent6_t) + uxSize > TRC_MAX_BLOB_SIZE)
  361. {
  362. uxSize = TRC_MAX_BLOB_SIZE - sizeof(TraceEvent6_t);
  363. }
  364. TRACE_EVENT_BEGIN(sizeof(TraceEvent6_t) + uxSize);
  365. TRACE_EVENT_ADD_6_DATA(uxParam1, uxParam2, uxParam3, uxParam4, uxParam5, uxParam6, puxData, uxSize);
  366. TRACE_EVENT_END(sizeof(TraceEvent6_t) + uxSize);
  367. return TRC_SUCCESS;
  368. }
  369. traceResult xTraceEventGetSize(const void* const pvAddress, uint32_t* puiSize)
  370. {
  371. /* This should never fail */
  372. TRC_ASSERT(pvAddress != (void*)0);
  373. /* This should never fail */
  374. TRC_ASSERT(puiSize != (void*)0);
  375. /* This should never fail */
  376. TRC_ASSERT((sizeof(TraceEvent0_t) + ((uint32_t)(uint16_t)(TRC_EVENT_GET_PARAM_COUNT(((const TraceEvent0_t*)pvAddress)->EventID)) * sizeof(uint32_t))) <= (uint32_t)(TRC_MAX_BLOB_SIZE)); /*cstat !MISRAC2012-Rule-11.5 Suppress pointer checks*/
  377. return TRC_EVENT_GET_SIZE(pvAddress, puiSize);
  378. }
  379. #endif