From 37c14850bf501502d3b66f7a6657ce6cdc5bfdb7 Mon Sep 17 00:00:00 2001 From: Hakan Bastedt Date: Wed, 10 Apr 2024 10:36:01 +0200 Subject: [PATCH] Replaced runningaverage (uses malloc) with CircularBuffer --- Firmware/platformio.ini | 1 - Firmware/src/main.cpp | 21 +++++++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/Firmware/platformio.ini b/Firmware/platformio.ini index cfef3a7..4e185a2 100755 --- a/Firmware/platformio.ini +++ b/Firmware/platformio.ini @@ -22,4 +22,3 @@ build_flags = -Wl,--no-warn-rwx-segment lib_deps = SPI rlogiacco/CircularBuffer - robtillaart/RunningAverage diff --git a/Firmware/src/main.cpp b/Firmware/src/main.cpp index 67fb91a..a491201 100755 --- a/Firmware/src/main.cpp +++ b/Firmware/src/main.cpp @@ -23,8 +23,9 @@ void indexPulseEncoderCB1(void) encCnt++; Encoder1.indexPulse(); } -#include -RunningAverage irqServeDelays(1000); // To get the max delay of the irq serve time over the last second +// #include +// RunningAverage irqServeDelays(1000); // To get the max delay of the irq serve time over the last second +CircularBuffer irqServeDelays; #include "StepGen3.h" StepGen3 *Step = 0; @@ -84,11 +85,17 @@ void handleStepper(void) oldIrqTime = irqTime; uint32_t diffT = longTime.extendTime(micros()) - irqTime; // Time from interrupt was received by isr - irqServeDelays.add(diffT); - if (irqServeDelays.bufferIsFull()) // Do max calcs, just waiting a second + irqServeDelays.push(diffT); + if (irqServeDelays.isFull()) // Do max calcs, just waiting a second { - uint16_t maxInBuffer = irqServeDelays.getMaxInBuffer(); - if (maxIrqServeTime > maxInBuffer) // Reduce by one, slowly eating up excess time + uint16_t maxInBuffer = 0; + using index_t = decltype(irqServeDelays)::index_t; + for (index_t i = 0; i < irqServeDelays.size(); i++) + { + if (maxInBuffer < irqServeDelays[i]) + maxInBuffer = irqServeDelays[i]; + } + if (maxIrqServeTime > maxInBuffer) // Reduce by one, slowly eating up excess time maxIrqServeTime--; if (maxIrqServeTime < maxInBuffer) maxIrqServeTime = maxInBuffer; @@ -180,8 +187,6 @@ void setup(void) pinMode(PC9, OUTPUT); // Step Z pinMode(PC10, OUTPUT); // Dir Z - - baseTimer = new HardwareTimer(TIM11); // The base period timer setFrequencyAdjustedMicrosSeconds(baseTimer, BASE_PERIOD / 1000); // baseTimer->setOverflow(BASE_PERIOD / 1000, MICROSEC_FORMAT); // Or the line above, This one is uncalibrated