summaryrefslogtreecommitdiff
path: root/src/SystemTask
diff options
context:
space:
mode:
authorJF <jf@codingfield.com>2020-07-02 21:38:52 +0200
committerJF <jf@codingfield.com>2020-07-02 21:38:52 +0200
commita83f067af9af82f034596f6f6154f4dccf598ace (patch)
treeb19b858f1b82a5eefe8f906f2d7cce253627ea77 /src/SystemTask
parent89e7033830bd73a35f4bb2faf14ccf06f3785712 (diff)
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.
Diffstat (limited to 'src/SystemTask')
-rw-r--r--src/SystemTask/SystemMonitor.h46
-rw-r--r--src/SystemTask/SystemTask.cpp2
-rw-r--r--src/SystemTask/SystemTask.h7
3 files changed, 55 insertions, 0 deletions
diff --git a/src/SystemTask/SystemMonitor.h b/src/SystemTask/SystemMonitor.h
new file mode 100644
index 00000000..50dd295a
--- /dev/null
+++ b/src/SystemTask/SystemMonitor.h
@@ -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];
+ };
+ }
+} \ No newline at end of file
diff --git a/src/SystemTask/SystemTask.cpp b/src/SystemTask/SystemTask.cpp
index 61b3c638..1f01b1b5 100644
--- a/src/SystemTask/SystemTask.cpp
+++ b/src/SystemTask/SystemTask.cpp
@@ -169,6 +169,8 @@ void SystemTask::Work() {
dateTimeController.UpdateTime(systick_counter);
batteryController.Update();
+ monitor.Process();
+
if(!nrf_gpio_pin_read(pinButton))
watchdog.Kick();
}
diff --git a/src/SystemTask/SystemTask.h b/src/SystemTask/SystemTask.h
index ab5f7010..e006058f 100644
--- a/src/SystemTask/SystemTask.h
+++ b/src/SystemTask/SystemTask.h
@@ -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
};
}
} \ No newline at end of file