SystemMonitor: implement FreeRtosMonitor only if trace facility is set

Split SystemMonitor into h and cpp file and move the logging code of the
`Process` function into the cpp file.

Depending of the `configUSE_TRACE_FACILITY` define from
`src/FreeRTOSConfig.h` create either a "FreeRtosMonitor" or a
"DummyMonitor".

Make the `Process()` function non-const, as the FreeRtosMonitor changes
the member variable `lastTick`.

In `SystemTask.h` we then only need to use `SystemMonitor`, without
knowledge of the `configUSE_TRACE_FACILITY` define.
This commit is contained in:
Reinhold Gschweicher 2022-01-27 23:10:59 +01:00 committed by JF
parent 5fe5cee9ef
commit 187d99c0f7
4 changed files with 35 additions and 39 deletions

View File

@ -516,6 +516,7 @@ list(APPEND SOURCE_FILES
displayapp/lv_pinetime_theme.c displayapp/lv_pinetime_theme.c
systemtask/SystemTask.cpp systemtask/SystemTask.cpp
systemtask/SystemMonitor.cpp
drivers/TwiMaster.cpp drivers/TwiMaster.cpp
heartratetask/HeartRateTask.cpp heartratetask/HeartRateTask.cpp
@ -577,6 +578,7 @@ list(APPEND RECOVERY_SOURCE_FILES
FreeRTOS/port_cmsis.c FreeRTOS/port_cmsis.c
systemtask/SystemTask.cpp systemtask/SystemTask.cpp
systemtask/SystemMonitor.cpp
drivers/TwiMaster.cpp drivers/TwiMaster.cpp
components/gfx/Gfx.cpp components/gfx/Gfx.cpp
components/rle/RleDecoder.cpp components/rle/RleDecoder.cpp

View File

@ -0,0 +1,26 @@
#include "systemtask/SystemTask.h"
#if configUSE_TRACE_FACILITY == 1
// FreeRtosMonitor
#include <FreeRTOS.h>
#include <task.h>
#include <nrf_log.h>
void Pinetime::System::SystemMonitor::Process() {
if (xTaskGetTickCount() - lastTick > 10000) {
NRF_LOG_INFO("---------------------------------------\nFree heap : %d", xPortGetFreeHeapSize());
TaskStatus_t tasksStatus[10];
auto nb = uxTaskGetSystemState(tasksStatus, 10, nullptr);
for (uint32_t i = 0; i < nb; i++) {
NRF_LOG_INFO("Task [%s] - %d", tasksStatus[i].pcTaskName, tasksStatus[i].usStackHighWaterMark);
if (tasksStatus[i].usStackHighWaterMark < 20)
NRF_LOG_INFO("WARNING!!! Task %s task is nearly full, only %dB available",
tasksStatus[i].pcTaskName,
tasksStatus[i].usStackHighWaterMark * 4);
}
lastTick = xTaskGetTickCount();
}
}
#else
// DummyMonitor
void Pinetime::System::SystemMonitor::Process() {}
#endif

View File

@ -1,44 +1,16 @@
#pragma once #pragma once
#include <FreeRTOS.h> #include <FreeRTOS.h> // declares configUSE_TRACE_FACILITY
#include <task.h> #include <task.h>
#include <nrf_log.h>
namespace Pinetime { namespace Pinetime {
namespace System { namespace System {
struct DummyMonitor {}; class SystemMonitor {
struct FreeRtosMonitor {};
template <class T> class SystemMonitor {
public: public:
SystemMonitor() = delete; void Process();
}; #if configUSE_TRACE_FACILITY == 1
template <> class SystemMonitor<DummyMonitor> {
public:
void Process() const {
}
};
template <> class SystemMonitor<FreeRtosMonitor> {
public:
void Process() const {
if (xTaskGetTickCount() - lastTick > 10000) {
NRF_LOG_INFO("---------------------------------------\nFree heap : %d", xPortGetFreeHeapSize());
auto nb = uxTaskGetSystemState(tasksStatus, 10, nullptr);
for (uint32_t i = 0; i < nb; i++) {
NRF_LOG_INFO("Task [%s] - %d", tasksStatus[i].pcTaskName, tasksStatus[i].usStackHighWaterMark);
if (tasksStatus[i].usStackHighWaterMark < 20)
NRF_LOG_INFO("WARNING!!! Task %s task is nearly full, only %dB available",
tasksStatus[i].pcTaskName,
tasksStatus[i].usStackHighWaterMark * 4);
}
lastTick = xTaskGetTickCount();
}
}
private: private:
mutable TickType_t lastTick = 0; mutable TickType_t lastTick = 0;
mutable TaskStatus_t tasksStatus[10]; #endif
}; };
} }
} }

View File

@ -148,11 +148,7 @@ namespace Pinetime {
bool stepCounterMustBeReset = false; bool stepCounterMustBeReset = false;
static constexpr TickType_t batteryMeasurementPeriod = pdMS_TO_TICKS(10 * 60 * 1000); static constexpr TickType_t batteryMeasurementPeriod = pdMS_TO_TICKS(10 * 60 * 1000);
#if configUSE_TRACE_FACILITY == 1 SystemMonitor monitor;
SystemMonitor<FreeRtosMonitor> monitor;
#else
SystemMonitor<DummyMonitor> monitor;
#endif
}; };
} }
} }