profiler.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #include "profiler.h"
  2. #include "profiler_port.h"
  3. #include <stdint.h>
  4. typedef struct
  5. {
  6. uint8_t level;
  7. uint32_t counter;
  8. } ProfilerEvent;
  9. uint32_t ProfilerDurationTicks;
  10. #if PROFILER_TYPE == PROFILER_TYPE_STATISTICS
  11. uint32_t ProfilerTime[PROFILER_MAX_LEVEL + 1];
  12. uint32_t ProfilerCounts[PROFILER_MAX_LEVEL + 1];
  13. uint8_t ProfilerStack[PROFILER_MAX_LEVEL + 1];
  14. uint8_t ProfilerSp;
  15. ProfilerEvent ProfilerBuffer;
  16. uint32_t ProfilerStartTicks = 0;
  17. #endif
  18. uint8_t ProfilerEnable = 0;
  19. uint8_t ProfilerRunning = 0;
  20. int8_t ProfilerError = 0;
  21. void profiler_init()
  22. {
  23. ProfilerEnable = 0;
  24. ProfilerError = 0;
  25. ProfilerDurationTicks = PROFILER_CLOCK * (float)PROFILER_DURATION;
  26. #if PROFILER_TYPE == PROFILER_TYPE_STATISTICS
  27. for (int i = 0; i < PROFILER_MAX_LEVEL; i++)
  28. {
  29. ProfilerTime[i] = 0;
  30. ProfilerCounts[i] = 0;
  31. }
  32. ProfilerSp = 0;
  33. #elif PROFILER_TYPE == PROFILER_TYPE_TRACE
  34. #endif
  35. profiler_init_hw();
  36. }
  37. void profiler_enable()
  38. {
  39. ProfilerEnable = 1;
  40. profiler_enable_hw();
  41. }
  42. void profiler_bg()
  43. {
  44. #if PROFILER_TYPE == PROFILER_TYPE_STATISTICS
  45. if (!ProfilerEnable)
  46. {
  47. return;
  48. }
  49. else
  50. {
  51. PROFILER_DISABLE_IRQ();
  52. uint32_t ticks = profiler_getTicks();
  53. if (!ProfilerRunning)
  54. {
  55. /* If counter overflow, return directly */
  56. if (ticks + 2 * ProfilerDurationTicks > ticks)
  57. {
  58. ProfilerSp = 0;
  59. ProfilerStack[ProfilerSp] = 0;
  60. ProfilerSp += 1;
  61. ProfilerCounts[0] += 1;
  62. ProfilerBuffer.counter = ticks;
  63. ProfilerBuffer.level = 0;
  64. ProfilerStartTicks = ticks;
  65. ProfilerRunning = 1;
  66. }
  67. }
  68. else
  69. {
  70. uint32_t ticks = profiler_getTicks();
  71. int32_t delta = ticks - ProfilerBuffer.counter;
  72. if(delta<0)
  73. {
  74. delta+=1000;
  75. }
  76. ProfilerTime[0] += delta;
  77. ProfilerBuffer.counter = ticks;
  78. ProfilerBuffer.level = 0;
  79. if (ticks > ProfilerStartTicks + ProfilerDurationTicks)
  80. {
  81. ProfilerRunning = 0;
  82. ProfilerEnable = 0;
  83. }
  84. else
  85. {
  86. ProfilerCounts[0] += 1;
  87. ProfilerBuffer.counter = ticks;
  88. ProfilerBuffer.level = 0;
  89. }
  90. if (ProfilerSp != 1)
  91. {
  92. ProfilerError = -1;
  93. }
  94. }
  95. PROFILER_ENABLE_IRQ();
  96. }
  97. #elif PROFILER_TYPE == PROFILER_TYPE_TRACE
  98. #endif
  99. }
  100. void profiler_start(uint8_t lv)
  101. {
  102. #if PROFILER_TYPE == PROFILER_TYPE_STATISTICS
  103. if (!ProfilerRunning)
  104. {
  105. return;
  106. }
  107. if (lv <= 0 || lv > PROFILER_MAX_LEVEL)
  108. {
  109. return;
  110. }
  111. PROFILER_DISABLE_IRQ();
  112. uint32_t ticks = profiler_getTicks();
  113. int32_t delta = ticks - ProfilerBuffer.counter;
  114. if(delta<0)
  115. {
  116. delta+=1000;
  117. }
  118. ProfilerTime[ProfilerStack[ProfilerSp - 1]] += delta;
  119. ProfilerCounts[lv] += 1;
  120. ProfilerStack[ProfilerSp] = lv;
  121. ProfilerSp += 1;
  122. ProfilerBuffer.counter = ticks;
  123. ProfilerBuffer.level = lv;
  124. PROFILER_ENABLE_IRQ();
  125. #elif PROFILER_TYPE == PROFILER_TYPE_TRACE
  126. #endif
  127. }
  128. void profiler_end(uint8_t lv)
  129. {
  130. #if PROFILER_TYPE == PROFILER_TYPE_STATISTICS
  131. if (!ProfilerRunning)
  132. {
  133. return;
  134. }
  135. if (lv <= 0 || lv > PROFILER_MAX_LEVEL)
  136. {
  137. return;
  138. }
  139. PROFILER_DISABLE_IRQ();
  140. uint32_t ticks = profiler_getTicks();
  141. int32_t delta = ticks - ProfilerBuffer.counter;
  142. if(delta<0)
  143. {
  144. delta+=1000;
  145. }
  146. ProfilerTime[ProfilerStack[ProfilerSp - 1]] += delta;
  147. ProfilerSp -= 1;
  148. ProfilerBuffer.counter = ticks;
  149. ProfilerBuffer.level = lv;
  150. PROFILER_ENABLE_IRQ();
  151. #elif PROFILER_TYPE == PROFILER_TYPE_TRACE
  152. #endif
  153. }