CpuUsage.h
Go to the documentation of this file.
1 #include <Platform/System.h>
2 #include <Platform/Timers.h>
3 
4 namespace Profiling
5 {
9 class CpuUsage
10 {
11 public:
18  {
19  onReady = ready;
20  queueCalibrationLoop();
21  }
22 
26  void reset()
27  {
28  cycleTimer.start();
29  loopIterations = 0;
30  }
31 
35  unsigned getLoopIterations()
36  {
37  return loopIterations;
38  }
39 
43  uint32_t getElapsedCycles()
44  {
45  return cycleTimer.elapsedTicks();
46  }
47 
51  uint32_t getMinLoopCycles()
52  {
53  return minLoopCycles;
54  }
55 
59  unsigned getUtilisation()
60  {
61  auto elapsedCycles = getElapsedCycles();
62  if(elapsedCycles <= minLoopCycles) {
63  return 0;
64  }
65 
66  auto maxIterations = elapsedCycles / minLoopCycles;
67  if(loopIterations >= maxIterations) {
68  return 0;
69  }
70 
71  return 10000U * (maxIterations - loopIterations) / maxIterations;
72  }
73 
74 private:
75  void loop()
76  {
77  ++loopIterations;
78  queueLoop();
79  }
80 
81  void queueLoop()
82  {
83  System.queueCallback([](void* param) { static_cast<CpuUsage*>(param)->loop(); }, this);
84  }
85 
86  void calibrationLoop()
87  {
88  ++loopIterations;
89  if(loopIterations < minCalIterations) {
90  cycleTimer.start();
91  } else if(loopIterations == minCalIterations + calIterations) {
92  minLoopCycles = 8 * cycleTimer.elapsedTicks() / (calIterations * 10);
93  // Calibration completed
94  onReady();
95  reset();
96  queueLoop();
97  return;
98  }
99  queueCalibrationLoop();
100  }
101 
102  void queueCalibrationLoop()
103  {
104  System.queueCallback([](void* param) { static_cast<CpuUsage*>(param)->calibrationLoop(); }, this);
105  }
106 
107 private:
108  static constexpr uint32_t minCalIterations = 0x20000;
109  static constexpr uint32_t calIterations = 0x40000;
110  CpuCycleTimer cycleTimer;
111  unsigned loopIterations = 0;
112  uint32_t minLoopCycles = 0; // Set during calibration
113  InterruptCallback onReady = nullptr;
114 };
115 
116 } // namespace Profiling
unsigned getUtilisation()
Get the CPU utilisation figure in 1/100ths of a percent.
Definition: CpuUsage.h:59
void(* InterruptCallback)()
Definition: Interrupts.h:25
Template class to implement a polled timer.
Definition: PolledTimer.h:67
void begin(InterruptCallback ready)
Calibrate the baseline figure for minimum CPU usage.
Definition: CpuUsage.h:17
SystemClass System
Global instance of system object.
Definition: CpuUsage.h:4
void start()
Start the timer.
Definition: PolledTimer.h:103
static bool queueCallback(TaskCallback32 callback, uint32_t param=0)
Queue a deferred callback.
uint32_t getElapsedCycles()
Get the total number of CPU cycles since the last call to reset()
Definition: CpuUsage.h:43
Class to provide a CPU usage indication based on task callback availability.
Definition: CpuUsage.h:9
TickType elapsedTicks() const
Get elapsed ticks since start() was last called.
Definition: PolledTimer.h:178
void reset()
Reset counters to start a new update period.
Definition: CpuUsage.h:26
uint32_t getMinLoopCycles()
Get the figure used as the baseline cycle count.
Definition: CpuUsage.h:51
unsigned getLoopIterations()
Get the number of task callbacks made so far.
Definition: CpuUsage.h:35