trcObject.c 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  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 strings.
  9. */
  10. #include <trcRecorder.h>
  11. #if (TRC_USE_TRACEALYZER_RECORDER == 1) && (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING)
  12. #include <trcTypes.h>
  13. #ifndef TRC_SEND_NAME_ONLY_ON_DELETE
  14. #define TRC_SEND_NAME_ONLY_ON_DELETE 0
  15. #endif
  16. /*cstat !MISRAC2004-6.3 !MISRAC2012-Dir-4.6_a Suppress basic char type usage*/
  17. traceResult xTraceObjectRegisterInternal(uint32_t uiEventCode, void* const pvObject, const char* szName, TraceUnsignedBaseType_t uxStateCount, const TraceUnsignedBaseType_t uxStates[], TraceUnsignedBaseType_t uxOptions, TraceObjectHandle_t* pxObjectHandle)
  18. {
  19. TraceEntryHandle_t xEntryHandle;
  20. TraceUnsignedBaseType_t i;
  21. void *pvAddress;
  22. TRACE_ALLOC_CRITICAL_SECTION();
  23. /* This should never fail */
  24. TRC_ASSERT(pxObjectHandle != (void*)0);
  25. /* This should never fail */
  26. TRC_ASSERT(uxStateCount <= (uint32_t)(TRC_ENTRY_TABLE_STATE_COUNT));
  27. TRACE_ENTER_CRITICAL_SECTION();
  28. if (pvObject != (void*)0)
  29. {
  30. /* An address was supplied */
  31. if (xTraceEntryCreateWithAddress(pvObject, &xEntryHandle) == TRC_FAIL)
  32. {
  33. TRACE_EXIT_CRITICAL_SECTION();
  34. return TRC_FAIL;
  35. }
  36. pvAddress = pvObject;
  37. }
  38. else
  39. {
  40. /* No address was supplied */
  41. if (xTraceEntryCreate(&xEntryHandle) == TRC_FAIL)
  42. {
  43. TRACE_EXIT_CRITICAL_SECTION();
  44. return TRC_FAIL;
  45. }
  46. TRC_ASSERT_ALWAYS_EVALUATE(xTraceEntryGetAddress(xEntryHandle, &pvAddress) == TRC_SUCCESS);
  47. }
  48. for (i = 0u; i < uxStateCount; i++)
  49. {
  50. /* This should never fail */
  51. TRC_ASSERT_ALWAYS_EVALUATE(xTraceEntrySetState(xEntryHandle, (uint32_t)i, uxStates[i]) == TRC_SUCCESS);
  52. }
  53. /* This should never fail */
  54. TRC_ASSERT_ALWAYS_EVALUATE(xTraceEntrySetOptions(xEntryHandle, (uint32_t)uxOptions) == TRC_SUCCESS);
  55. *pxObjectHandle = (TraceObjectHandle_t)xEntryHandle;
  56. TRACE_EXIT_CRITICAL_SECTION();
  57. if ((szName != (void*)0) && (szName[0] != (char)0)) /*cstat !MISRAC2004-6.3 !MISRAC2012-Dir-4.6_a Suppress basic char type usage*/ /*cstat !MISRAC2004-17.4_b We need to access every character in the string*/
  58. {
  59. /* Not a null or empty string */
  60. /* This will set the symbol and create an event for it */
  61. /* This should never fail */
  62. TRC_ASSERT_ALWAYS_EVALUATE(xTraceObjectSetName((TraceObjectHandle_t)xEntryHandle, szName) == TRC_SUCCESS);
  63. }
  64. switch (uxStateCount)
  65. {
  66. case 0:
  67. xTraceEventCreate1(uiEventCode, (TraceUnsignedBaseType_t)pvAddress);
  68. break;
  69. case 1:
  70. xTraceEventCreate2(uiEventCode, (TraceUnsignedBaseType_t)pvAddress, uxStates[0]);
  71. break;
  72. case 2:
  73. xTraceEventCreate3(uiEventCode, (TraceUnsignedBaseType_t)pvAddress, uxStates[0], uxStates[1]);
  74. break;
  75. case 3:
  76. xTraceEventCreate4(uiEventCode, (TraceUnsignedBaseType_t)pvAddress, uxStates[0], uxStates[1], uxStates[2]);
  77. break;
  78. default:
  79. return TRC_FAIL;
  80. break;
  81. }
  82. return TRC_SUCCESS;
  83. }
  84. /*cstat !MISRAC2004-6.3 !MISRAC2012-Dir-4.6_a Suppress basic char type usage*/
  85. traceResult xTraceObjectRegister(uint32_t uiEventCode, void* const pvObject, const char* szName, TraceUnsignedBaseType_t uxState, TraceObjectHandle_t *pxObjectHandle)
  86. {
  87. return xTraceObjectRegisterInternal(uiEventCode, pvObject, szName, 1u, &uxState, 0u, pxObjectHandle);
  88. }
  89. /*cstat !MISRAC2004-6.3 !MISRAC2012-Dir-4.6_a Suppress basic char type usage*/
  90. traceResult xTraceObjectRegister2(uint32_t uiEventCode, void* const pvObject, const char* szName, TraceUnsignedBaseType_t uxState1, TraceUnsignedBaseType_t uxState2, TraceObjectHandle_t *pxObjectHandle)
  91. {
  92. TraceUnsignedBaseType_t auxStates[2] = { uxState1, uxState2 };
  93. return xTraceObjectRegisterInternal(uiEventCode, pvObject, szName, 2u, auxStates, 0u, pxObjectHandle);
  94. }
  95. traceResult xTraceObjectUnregister(TraceObjectHandle_t xObjectHandle, uint32_t uiEventCode, TraceUnsignedBaseType_t uxState)
  96. {
  97. void* pvObject = (void*)0;
  98. const char *szName = (void*)0; /*cstat !MISRAC2004-6.3 !MISRAC2012-Dir-4.6_a Suppress basic char type usage*/
  99. #if (TRC_SEND_NAME_ONLY_ON_DELETE == 1)
  100. uint32_t uiLength;
  101. uint32_t i;
  102. #endif
  103. /* If asserts are disabled this variable will not get used, this stops warnings. */
  104. (void)szName;
  105. /* This should never fail */
  106. TRC_ASSERT_ALWAYS_EVALUATE(xTraceEntryGetAddress((TraceEntryHandle_t)xObjectHandle, &pvObject) == TRC_SUCCESS);
  107. /* This should never fail */
  108. TRC_ASSERT_ALWAYS_EVALUATE(xTraceEntryGetSymbol((TraceEntryHandle_t)xObjectHandle, &szName) == TRC_SUCCESS);
  109. #if (TRC_SEND_NAME_ONLY_ON_DELETE == 1)
  110. /* Send name event because this is a delete */
  111. for (i = 0u; (szName[i] != (char)0) && (i < 128u); i++) {} /*cstat !MISRAC2004-6.3 !MISRAC2012-Dir-4.6_a Suppress basic char type usage*/ /*cstat !MISRAC2004-17.4_b We need to access every character in the string*/
  112. uiLength = i;
  113. /* Send the name event, if possible */
  114. (void)xTraceEventCreateData1(PSF_EVENT_OBJ_NAME, (TraceUnsignedBaseType_t)pvObject, (TraceUnsignedBaseType_t*)szName, uiLength + 1); /* +1 for termination */
  115. #endif /* (TRC_SEND_NAME_ONLY_ON_DELETE == 1) */
  116. /* Send the delete event, if possible */
  117. (void)xTraceEventCreate2(uiEventCode, (TraceUnsignedBaseType_t)(pvObject), uxState); /*cstat !MISRAC2004-11.3 !MISRAC2012-Rule-11.4 !MISRAC2012-Rule-11.6 Suppress conversion from pointer to integer check*/
  118. return xTraceEntryDelete(xObjectHandle);
  119. }
  120. /*cstat !MISRAC2004-6.3 !MISRAC2012-Dir-4.6_a Suppress basic char type usage*/
  121. traceResult xTraceObjectSetName(TraceObjectHandle_t xObjectHandle, const char* szName)
  122. {
  123. void* pvObject = (void*)0;
  124. uint32_t uiLength;
  125. uint32_t i;
  126. /* If asserts are disabled this variable will not get used, this stops warnings. */
  127. (void)pvObject;
  128. if (szName == (void*)0)
  129. {
  130. szName = ""; /*cstat !MISRAC2012-Rule-17.8 Suppress modified function parameter check*/
  131. }
  132. /* This should never fail */
  133. TRC_ASSERT_ALWAYS_EVALUATE(xTraceEntryGetAddress((TraceEntryHandle_t)xObjectHandle, &pvObject) == TRC_SUCCESS);
  134. for (i = 0u; (szName[i] != (char)0) && (i < 128u); i++) {} /*cstat !MISRAC2004-6.3 !MISRAC2012-Dir-4.6_a Suppress basic char type usage*/ /*cstat !MISRAC2004-17.4_b We need to access every character in the string*/
  135. uiLength = i;
  136. #if (TRC_SEND_NAME_ONLY_ON_DELETE == 0)
  137. /* Attempt to send name event now since we don't do it on delete events */
  138. (void)xTraceEventCreateData1(PSF_EVENT_OBJ_NAME, (TraceUnsignedBaseType_t)pvObject, (TraceUnsignedBaseType_t*)szName, uiLength + 1); /* +1 for termination */
  139. #endif /* (TRC_SEND_NAME_ONLY_ON_DELETE == 0) */
  140. return xTraceEntrySetSymbol((TraceEntryHandle_t)xObjectHandle, szName, uiLength);
  141. }
  142. /*cstat !MISRAC2004-6.3 !MISRAC2012-Dir-4.6_a Suppress basic char type usage*/
  143. traceResult xTraceObjectRegisterWithoutHandle(uint32_t uiEventCode, void* pvObject, const char* szName, TraceUnsignedBaseType_t uxState)
  144. {
  145. TraceObjectHandle_t xObjectHandle;
  146. return xTraceObjectRegisterInternal(uiEventCode, pvObject, szName, 1u, &uxState, 0u, &xObjectHandle);
  147. }
  148. /*cstat !MISRAC2004-6.3 !MISRAC2012-Dir-4.6_a Suppress basic char type usage*/
  149. traceResult xTraceObjectRegisterWithoutHandle2(uint32_t uiEventCode, void* pvObject, const char* szName, TraceUnsignedBaseType_t uxState1, TraceUnsignedBaseType_t uxState2)
  150. {
  151. TraceObjectHandle_t xObjectHandle;
  152. TraceUnsignedBaseType_t auxStates[2] = { uxState1, uxState2 };
  153. return xTraceObjectRegisterInternal(uiEventCode, pvObject, szName, 2u, auxStates, 0u, &xObjectHandle);
  154. }
  155. traceResult xTraceObjectUnregisterWithoutHandle(uint32_t uiEventCode, void* pvObject, TraceUnsignedBaseType_t uxState)
  156. {
  157. TraceEntryHandle_t xEntryHandle;
  158. traceResult xResult;
  159. TRACE_ALLOC_CRITICAL_SECTION();
  160. TRACE_ENTER_CRITICAL_SECTION();
  161. if (xTraceEntryFind(pvObject, &xEntryHandle) == TRC_FAIL)
  162. {
  163. TRACE_EXIT_CRITICAL_SECTION();
  164. return TRC_FAIL;
  165. }
  166. xResult = xTraceObjectUnregister((TraceObjectHandle_t)xEntryHandle, uiEventCode, uxState);
  167. TRACE_EXIT_CRITICAL_SECTION();
  168. return xResult;
  169. }
  170. /*cstat !MISRAC2004-6.3 !MISRAC2012-Dir-4.6_a Suppress basic char type usage*/
  171. traceResult xTraceObjectSetNameWithoutHandle(void* pvObject, const char* szName)
  172. {
  173. TraceEntryHandle_t xEntryHandle;
  174. traceResult xResult;
  175. TRACE_ALLOC_CRITICAL_SECTION();
  176. TRACE_ENTER_CRITICAL_SECTION();
  177. if (xTraceEntryFind(pvObject, &xEntryHandle) == TRC_FAIL)
  178. {
  179. /* No previous entry found. Create one. */
  180. if (xTraceEntryCreateWithAddress(pvObject, &xEntryHandle) == TRC_FAIL)
  181. {
  182. TRACE_EXIT_CRITICAL_SECTION();
  183. return TRC_FAIL;
  184. }
  185. }
  186. xResult = xTraceObjectSetName((TraceObjectHandle_t)xEntryHandle, szName);
  187. TRACE_EXIT_CRITICAL_SECTION();
  188. return xResult;
  189. }
  190. traceResult xTraceObjectSetSpecificStateWithoutHandle(void* pvObject, uint32_t uiIndex, TraceUnsignedBaseType_t uxState)
  191. {
  192. TraceEntryHandle_t xEntryHandle;
  193. traceResult xResult;
  194. TRACE_ALLOC_CRITICAL_SECTION();
  195. TRACE_ENTER_CRITICAL_SECTION();
  196. if (xTraceEntryFind(pvObject, &xEntryHandle) == TRC_FAIL)
  197. {
  198. TRACE_EXIT_CRITICAL_SECTION();
  199. return TRC_FAIL;
  200. }
  201. xResult = xTraceObjectSetSpecificState((TraceObjectHandle_t)xEntryHandle, uiIndex, uxState);
  202. TRACE_EXIT_CRITICAL_SECTION();
  203. return xResult;
  204. }
  205. traceResult xTraceObjectSetOptionsWithoutHandle(void* pvObject, uint32_t uiMask)
  206. {
  207. TraceEntryHandle_t xEntryHandle;
  208. traceResult xResult;
  209. TRACE_ALLOC_CRITICAL_SECTION();
  210. TRACE_ENTER_CRITICAL_SECTION();
  211. if (xTraceEntryFind(pvObject, &xEntryHandle) == TRC_FAIL)
  212. {
  213. /* No previous entry found. Create one. */
  214. if (xTraceEntryCreateWithAddress(pvObject, &xEntryHandle) == TRC_FAIL)
  215. {
  216. TRACE_EXIT_CRITICAL_SECTION();
  217. return TRC_FAIL;
  218. }
  219. }
  220. xResult = xTraceObjectSetOptions((TraceObjectHandle_t)xEntryHandle, uiMask);
  221. TRACE_EXIT_CRITICAL_SECTION();
  222. return xResult;
  223. }
  224. #endif