diff options
author | JF <jf@codingfield.com> | 2020-07-02 21:38:52 +0200 |
---|---|---|
committer | JF <jf@codingfield.com> | 2020-07-02 21:38:52 +0200 |
commit | a83f067af9af82f034596f6f6154f4dccf598ace (patch) | |
tree | b19b858f1b82a5eefe8f906f2d7cce253627ea77 /src/SystemTask/SystemMonitor.h | |
parent | 89e7033830bd73a35f4bb2faf14ccf06f3785712 (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/SystemMonitor.h')
-rw-r--r-- | src/SystemTask/SystemMonitor.h | 46 |
1 files changed, 46 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 |