Reduce RAM memory usage by tuning the stack of the stasks and the heap allocated for FreeRTOS.

Add Monitor to log the stack usage of each task.
This commit is contained in:
JF
2020-07-02 21:38:52 +02:00
parent 89e7033830
commit a83f067af9
7 changed files with 62 additions and 6 deletions

View File

@@ -0,0 +1,46 @@
#pragma once
#include <FreeRTOS.h>
#include <task.h>
#include <nrf_log.h>
namespace Pinetime {
namespace System {
struct DummyMonitor {};
struct FreeRtosMonitor {};
template<class T>
class SystemMonitor {
public:
SystemMonitor() = delete;
};
template<>
class SystemMonitor<DummyMonitor> {
public:
void Process() const {}
};
template<>
class SystemMonitor<FreeRtosMonitor> {
public:
void Process() const {
if(xTaskGetTickCount() - lastTick > 10000) {
NRF_LOG_INFO("---------------------------------------\nFee heap : %d", xPortGetFreeHeapSize());
auto nb = uxTaskGetSystemState(tasksStatus, 10, NULL);
for (int 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:
mutable TickType_t lastTick = 0;
mutable TaskStatus_t tasksStatus[10];
};
}
}

View File

@@ -169,6 +169,8 @@ void SystemTask::Work() {
dateTimeController.UpdateTime(systick_counter);
batteryController.Update();
monitor.Process();
if(!nrf_gpio_pin_read(pinButton))
watchdog.Kick();
}

View File

@@ -10,6 +10,7 @@
#include <drivers/Watchdog.h>
#include <Components/Ble/NimbleController.h>
#include <drivers/SpiNorFlash.h>
#include "SystemMonitor.h"
namespace Pinetime {
namespace System {
@@ -72,6 +73,12 @@ namespace Pinetime {
bool doNotGoToSleep = false;
void GoToRunning();
#if configUSE_TRACE_FACILITY == 1
SystemMonitor<FreeRtosMonitor> monitor;
#else
SystemMonitor<DummyMonitor> monitor;
#endif
};
}
}