From cb31fc4009755ba095e85804cecafc7a70e0c667 Mon Sep 17 00:00:00 2001 From: RedHawk Date: Mon, 29 May 2023 20:01:35 +0300 Subject: [PATCH] clock: [#55] Overflow handling for FreeRTOS stats. --- source/shoh/freertos/FreeRTOSConfig.h | 3 ++- source/shoh/src/peripherals/Clock.cpp | 16 +++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/source/shoh/freertos/FreeRTOSConfig.h b/source/shoh/freertos/FreeRTOSConfig.h index da1e190..34d21e9 100644 --- a/source/shoh/freertos/FreeRTOSConfig.h +++ b/source/shoh/freertos/FreeRTOSConfig.h @@ -126,9 +126,10 @@ to exclude the API function. */ * must set up LPC_SCT1. */ void vConfigureTimerForRunTimeStats(void); +unsigned long ulGetTimeForRunTimeStats(void); #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() vConfigureTimerForRunTimeStats() /* The value is read directly from the counter register for efficiency and low overhead. */ -#define portGET_RUN_TIME_COUNTER_VALUE() LPC_SCT1->COUNT_U +#define portGET_RUN_TIME_COUNTER_VALUE() ulGetTimeForRunTimeStats() /* Cortex-M specific definitions. */ #ifdef __NVIC_PRIO_BITS diff --git a/source/shoh/src/peripherals/Clock.cpp b/source/shoh/src/peripherals/Clock.cpp index 298d495..feb5b88 100644 --- a/source/shoh/src/peripherals/Clock.cpp +++ b/source/shoh/src/peripherals/Clock.cpp @@ -29,7 +29,7 @@ extern "C" { /** * @brief This function is used by FreeRTOS to configure the collection of - * time used by tasks. + * time used by tasks. (This timer is also used for logging timestamps.) */ void vConfigureTimerForRunTimeStats (void) @@ -55,6 +55,20 @@ extern "C" { LPC_SCT1->CONFIG = SCT_CONFIG_32BIT_COUNTER; LPC_SCT1->CTRL_U = SCT_CTRL_CLRCTR_L; } + + /** + * @brief Used by FreeRTOS to collect runtime statistics. + * @paragraph FreeRTOS is unable to handle the counter overflow, so it must be done from our side. + * This solution will break eventually later on, presumably after 1193 hours of runtime, + * since unsigned long won't be able to hold more than that amount of milliseconds. + * FreeRTOS expects to get unsigned long, so there's nothing more that can be done. + * @return unsigned long + */ + unsigned long ulGetTimeForRunTimeStats(void) + { + return (unsigned long)(((double)(counter_overflows - 1) * max_counter_value) + LPC_SCT1->COUNT_U) + / ((double)Chip_Clock_GetMainClockRate() / 1000); + } } /**