trcISR.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  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 ISR tagging.
  9. */
  10. #include <trcRecorder.h>
  11. #if (TRC_USE_TRACEALYZER_RECORDER == 1) && (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING)
  12. TraceISRData_t* pxTraceISRData TRC_CFG_RECORDER_DATA_ATTRIBUTE;
  13. traceResult xTraceISRInitialize(TraceISRData_t *pxBuffer)
  14. {
  15. uint32_t uiCoreIndex;
  16. uint32_t uiStackIndex;
  17. /* This should never fail */
  18. TRC_ASSERT(pxBuffer != (void*)0);
  19. pxTraceISRData = pxBuffer;
  20. for (uiCoreIndex = 0u; uiCoreIndex < (uint32_t)(TRC_CFG_CORE_COUNT); uiCoreIndex++)
  21. {
  22. TraceISRCoreData_t* pxCoreData = &pxTraceISRData->cores[uiCoreIndex];
  23. /* Initialize ISR stack */
  24. for (uiStackIndex = 0u; uiStackIndex < (uint32_t)(TRC_CFG_MAX_ISR_NESTING); uiStackIndex++)
  25. {
  26. pxCoreData->handleStack[uiStackIndex] = 0;
  27. }
  28. pxCoreData->stackIndex = -1;
  29. pxCoreData->isPendingContextSwitch = 0u;
  30. }
  31. xTraceSetComponentInitialized(TRC_RECORDER_COMPONENT_ISR);
  32. return TRC_SUCCESS;
  33. }
  34. /*cstat !MISRAC2004-6.3 !MISRAC2012-Dir-4.6_a Suppress basic char type usage*/
  35. traceResult xTraceISRRegister(const char* szName, uint32_t uiPriority, TraceISRHandle_t *pxISRHandle)
  36. {
  37. TraceEntryHandle_t xEntryHandle;
  38. uint32_t i, uiLength = 0u;
  39. /* We need to check this */
  40. if (xTraceIsComponentInitialized(TRC_RECORDER_COMPONENT_ISR) == 0U)
  41. {
  42. return TRC_FAIL;
  43. }
  44. /* This should never fail */
  45. TRC_ASSERT(pxISRHandle != (void*)0);
  46. if (szName == (void*)0)
  47. {
  48. szName = ""; /*cstat !MISRAC2012-Rule-17.8 Suppress modified function parameter check*/
  49. }
  50. /* Always save in symbol table, in case the recording has not yet started */
  51. /* We need to check this */
  52. if (xTraceEntryCreate(&xEntryHandle) == TRC_FAIL)
  53. {
  54. return TRC_FAIL;
  55. }
  56. 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*/
  57. uiLength = i;
  58. /* This should never fail */
  59. TRC_ASSERT_ALWAYS_EVALUATE(xTraceEntrySetSymbol(xEntryHandle, szName, uiLength) == TRC_SUCCESS);
  60. /* This should never fail */
  61. TRC_ASSERT_ALWAYS_EVALUATE(xTraceEntrySetState(xEntryHandle, 0u, (TraceUnsignedBaseType_t)uiPriority) == TRC_SUCCESS);
  62. *pxISRHandle = (TraceISRHandle_t)xEntryHandle;
  63. return xTraceEventCreateData2(
  64. PSF_EVENT_DEFINE_ISR,
  65. (TraceUnsignedBaseType_t)xEntryHandle,
  66. (TraceUnsignedBaseType_t)uiPriority,
  67. (TraceUnsignedBaseType_t*)szName,
  68. uiLength + 1
  69. );
  70. }
  71. traceResult xTraceISRBegin(TraceISRHandle_t xISRHandle)
  72. {
  73. TraceISRCoreData_t* pxCoreData;
  74. TRACE_ALLOC_CRITICAL_SECTION();
  75. /* This should never fail */
  76. TRC_ASSERT(xTraceIsComponentInitialized(TRC_RECORDER_COMPONENT_ISR));
  77. TRACE_ENTER_CRITICAL_SECTION();
  78. /* We are at the start of a possible ISR chain.
  79. * No context switches should have been triggered now.
  80. */
  81. pxCoreData = &pxTraceISRData->cores[TRC_CFG_GET_CURRENT_CORE()];
  82. if (pxCoreData->stackIndex == -1)
  83. {
  84. pxCoreData->isPendingContextSwitch = 0u;
  85. }
  86. if (pxCoreData->stackIndex < ((TRC_CFG_MAX_ISR_NESTING) - 1))
  87. {
  88. pxCoreData->stackIndex++;
  89. pxCoreData->handleStack[pxCoreData->stackIndex] = xISRHandle;
  90. #if (TRC_CFG_INCLUDE_ISR_TRACING == 1)
  91. (void)xTraceEventCreate1(PSF_EVENT_ISR_BEGIN, (TraceUnsignedBaseType_t)xISRHandle); /*cstat !MISRAC2004-11.3 !MISRAC2012-Rule-11.4 Suppress conversion from pointer to integer check*/
  92. #endif
  93. }
  94. else
  95. {
  96. TRACE_EXIT_CRITICAL_SECTION();
  97. (void)xTraceError(TRC_ERROR_ISR_NESTING_OVERFLOW);
  98. return TRC_FAIL;
  99. }
  100. TRACE_EXIT_CRITICAL_SECTION();
  101. return TRC_SUCCESS;
  102. }
  103. traceResult xTraceISREnd(TraceBaseType_t xIsTaskSwitchRequired)
  104. {
  105. TraceISRCoreData_t* pxCoreData;
  106. TRACE_ALLOC_CRITICAL_SECTION();
  107. (void)xIsTaskSwitchRequired;
  108. /* This should never fail */
  109. TRC_ASSERT(xTraceIsComponentInitialized(TRC_RECORDER_COMPONENT_ISR));
  110. TRACE_ENTER_CRITICAL_SECTION();
  111. pxCoreData = &pxTraceISRData->cores[TRC_CFG_GET_CURRENT_CORE()];
  112. pxCoreData->stackIndex--;
  113. #if (TRC_CFG_INCLUDE_ISR_TRACING == 1)
  114. /* Is there a pending task-switch? (perhaps from an earlier ISR) */
  115. pxCoreData->isPendingContextSwitch |= (uint32_t)xIsTaskSwitchRequired;
  116. if (pxCoreData->stackIndex >= 0)
  117. {
  118. /* Store return to interrupted ISR (if nested ISRs)*/
  119. (void)xTraceEventCreate1(PSF_EVENT_ISR_RESUME, (TraceUnsignedBaseType_t)pxCoreData->handleStack[pxCoreData->stackIndex]); /*cstat !MISRAC2004-11.3 !MISRAC2012-Rule-11.4 Suppress conversion from pointer to integer check*/
  120. }
  121. else
  122. {
  123. /* Store return to interrupted task, if no context switch will occur in between. */
  124. if ((pxCoreData->isPendingContextSwitch == 0U) || (xTraceKernelPortIsSchedulerSuspended() == 1U)) /*cstat !MISRAC2004-13.7_b For some kernel ports xTraceKernelPortIsSchedulerSuspended() will never return 1, and that is expected*/
  125. {
  126. (void)xTraceEventCreate1(PSF_EVENT_TASK_ACTIVATE, (TraceUnsignedBaseType_t)xTraceTaskGetCurrentReturn()); /*cstat !MISRAC2004-11.3 !MISRAC2012-Rule-11.4 !MISRAC2012-Rule-11.6 Suppress conversion from pointer to integer check*/
  127. }
  128. }
  129. #endif
  130. TRACE_EXIT_CRITICAL_SECTION();
  131. return TRC_SUCCESS;
  132. }
  133. #if ((TRC_CFG_USE_TRACE_ASSERT) == 1)
  134. traceResult xTraceISRGetCurrentNesting(int32_t* puiValue)
  135. {
  136. /* This should never fail */
  137. TRC_ASSERT(xTraceIsComponentInitialized(TRC_RECORDER_COMPONENT_ISR));
  138. /* This should never fail */
  139. TRC_ASSERT(puiValue != (void*)0);
  140. TraceISRCoreData_t* pxCoreData = &pxTraceISRData->cores[TRC_CFG_GET_CURRENT_CORE()];
  141. *puiValue = pxCoreData->stackIndex;
  142. return TRC_SUCCESS;
  143. }
  144. int32_t xTraceISRGetCurrentNestingReturned(void)
  145. {
  146. /* This should never fail */
  147. TRC_ASSERT(xTraceIsComponentInitialized(TRC_RECORDER_COMPONENT_ISR));
  148. return pxTraceISRData->cores[TRC_CFG_GET_CURRENT_CORE()].stackIndex;
  149. }
  150. traceResult xTraceISRGetCurrent(TraceISRHandle_t* pxISRHandle)
  151. {
  152. /* This should never fail */
  153. TRC_ASSERT(xTraceIsComponentInitialized(TRC_RECORDER_COMPONENT_ISR));
  154. /* This should never fail */
  155. TRC_ASSERT(pxISRHandle != (void*)0);
  156. TraceISRCoreData_t* pxCoreData = &pxTraceISRData->cores[TRC_CFG_GET_CURRENT_CORE()];
  157. if (pxCoreData->stackIndex < 0)
  158. {
  159. return TRC_FAIL;
  160. }
  161. *pxISRHandle = pxCoreData->handleStack[pxCoreData->stackIndex];
  162. return TRC_SUCCESS;
  163. }
  164. #endif
  165. /* DEPRECATED */
  166. /*cstat !MISRAC2004-6.3 !MISRAC2012-Dir-4.6_a Suppress basic char type usage*/
  167. TraceISRHandle_t xTraceSetISRProperties(const char* szName, uint32_t uiPriority)
  168. {
  169. TraceISRHandle_t xISRHandle = 0;
  170. (void)xTraceISRRegister(szName, uiPriority, &xISRHandle);
  171. return xISRHandle;
  172. }
  173. #endif