trcDiagnostics.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. /*
  2. * 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 of the diagnostics.
  9. */
  10. #include <trcRecorder.h>
  11. #if (TRC_USE_TRACEALYZER_RECORDER == 1) && (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING)
  12. static TraceDiagnosticsData_t *pxDiagnostics TRC_CFG_RECORDER_DATA_ATTRIBUTE;
  13. traceResult xTraceDiagnosticsInitialize(TraceDiagnosticsData_t *pxBuffer)
  14. {
  15. uint32_t i;
  16. /* This should never fail */
  17. TRC_ASSERT(pxBuffer != (void*)0);
  18. pxDiagnostics = pxBuffer;
  19. for (i = 0u; i < (TRC_DIAGNOSTICS_COUNT); i++)
  20. {
  21. pxDiagnostics->metrics[i] = 0;
  22. }
  23. xTraceSetComponentInitialized(TRC_RECORDER_COMPONENT_DIAGNOSTICS);
  24. return TRC_SUCCESS;
  25. }
  26. traceResult xTraceDiagnosticsGet(TraceDiagnosticsType_t xType, TraceBaseType_t* pxValue)
  27. {
  28. /* This should never fail */
  29. TRC_ASSERT(xTraceIsComponentInitialized(TRC_RECORDER_COMPONENT_DIAGNOSTICS));
  30. /* This should never fail */
  31. TRC_ASSERT((TraceUnsignedBaseType_t)xType < TRC_DIAGNOSTICS_COUNT);
  32. /* This should never fail */
  33. TRC_ASSERT(pxValue != (void*)0);
  34. *pxValue = pxDiagnostics->metrics[(TraceUnsignedBaseType_t)xType];
  35. return TRC_SUCCESS;
  36. }
  37. traceResult xTraceDiagnosticsSet(TraceDiagnosticsType_t xType, TraceBaseType_t xValue)
  38. {
  39. /* This should never fail */
  40. TRC_ASSERT(xTraceIsComponentInitialized(TRC_RECORDER_COMPONENT_DIAGNOSTICS));
  41. /* This should never fail */
  42. TRC_ASSERT((TraceUnsignedBaseType_t)xType < TRC_DIAGNOSTICS_COUNT);
  43. pxDiagnostics->metrics[(TraceUnsignedBaseType_t)xType] = xValue;
  44. return TRC_SUCCESS;
  45. }
  46. traceResult xTraceDiagnosticsAdd(TraceDiagnosticsType_t xType, TraceBaseType_t xValue)
  47. {
  48. /* This should never fail */
  49. TRC_ASSERT(xTraceIsComponentInitialized(TRC_RECORDER_COMPONENT_DIAGNOSTICS));
  50. /* This should never fail */
  51. TRC_ASSERT((TraceUnsignedBaseType_t)xType < TRC_DIAGNOSTICS_COUNT);
  52. pxDiagnostics->metrics[(TraceUnsignedBaseType_t)xType] += xValue;
  53. return TRC_SUCCESS;
  54. }
  55. traceResult xTraceDiagnosticsIncrease(TraceDiagnosticsType_t xType)
  56. {
  57. return xTraceDiagnosticsAdd(xType, 1);
  58. }
  59. traceResult xTraceDiagnosticsDecrease(TraceDiagnosticsType_t xType)
  60. {
  61. return xTraceDiagnosticsAdd(xType, -1);
  62. }
  63. traceResult xTraceDiagnosticsSetIfHigher(TraceDiagnosticsType_t xType, TraceBaseType_t xValue)
  64. {
  65. /* This should never fail */
  66. TRC_ASSERT(xTraceIsComponentInitialized(TRC_RECORDER_COMPONENT_DIAGNOSTICS));
  67. /* This should never fail */
  68. TRC_ASSERT((TraceUnsignedBaseType_t)xType < TRC_DIAGNOSTICS_COUNT);
  69. if (xValue > pxDiagnostics->metrics[xType])
  70. {
  71. pxDiagnostics->metrics[(TraceUnsignedBaseType_t)xType] = xValue;
  72. }
  73. return TRC_SUCCESS;
  74. }
  75. traceResult xTraceDiagnosticsSetIfLower(TraceDiagnosticsType_t xType, TraceBaseType_t xValue)
  76. {
  77. /* This should never fail */
  78. TRC_ASSERT(xTraceIsComponentInitialized(TRC_RECORDER_COMPONENT_DIAGNOSTICS));
  79. /* This should never fail */
  80. TRC_ASSERT((TraceUnsignedBaseType_t)xType < TRC_DIAGNOSTICS_COUNT);
  81. if (xValue < pxDiagnostics->metrics[(TraceUnsignedBaseType_t)xType])
  82. {
  83. pxDiagnostics->metrics[(TraceUnsignedBaseType_t)xType] = xValue;
  84. }
  85. return TRC_SUCCESS;
  86. }
  87. traceResult xTraceDiagnosticsCheckStatus(void)
  88. {
  89. /* It is probably good if we always check this */
  90. if (xTraceIsComponentInitialized(TRC_RECORDER_COMPONENT_DIAGNOSTICS) == 0U)
  91. {
  92. return TRC_FAIL;
  93. }
  94. if (pxDiagnostics->metrics[TRC_DIAGNOSTICS_ENTRY_SLOTS_NO_ROOM] > 0)
  95. {
  96. (void)xTraceWarning(TRC_WARNING_ENTRY_TABLE_SLOTS);
  97. pxDiagnostics->metrics[TRC_DIAGNOSTICS_ENTRY_SLOTS_NO_ROOM] = 0;
  98. }
  99. if (pxDiagnostics->metrics[TRC_DIAGNOSTICS_ENTRY_SYMBOL_LONGEST_LENGTH] > (TRC_CFG_ENTRY_SYMBOL_MAX_LENGTH))
  100. {
  101. (void)xTraceWarning(TRC_WARNING_ENTRY_SYMBOL_MAX_LENGTH);
  102. pxDiagnostics->metrics[TRC_DIAGNOSTICS_ENTRY_SYMBOL_LONGEST_LENGTH] = 0;
  103. }
  104. if (pxDiagnostics->metrics[TRC_DIAGNOSTICS_BLOB_MAX_BYTES_TRUNCATED] > 0)
  105. {
  106. (void)xTraceWarning(TRC_WARNING_EVENT_SIZE_TRUNCATED);
  107. pxDiagnostics->metrics[TRC_DIAGNOSTICS_BLOB_MAX_BYTES_TRUNCATED] = 0;
  108. }
  109. if (pxDiagnostics->metrics[TRC_DIAGNOSTICS_STACK_MONITOR_NO_SLOTS] > 0)
  110. {
  111. (void)xTraceWarning(TRC_WARNING_STACKMON_NO_SLOTS);
  112. pxDiagnostics->metrics[TRC_DIAGNOSTICS_STACK_MONITOR_NO_SLOTS] = 0;
  113. }
  114. return TRC_SUCCESS;
  115. }
  116. #endif