summaryrefslogtreecommitdiff
path: root/src/SystemTask
diff options
context:
space:
mode:
Diffstat (limited to 'src/SystemTask')
-rw-r--r--src/SystemTask/SystemMonitor.h46
-rw-r--r--src/SystemTask/SystemTask.cpp17
-rw-r--r--src/SystemTask/SystemTask.h8
3 files changed, 66 insertions, 5 deletions
diff --git a/src/SystemTask/SystemMonitor.h b/src/SystemTask/SystemMonitor.h
new file mode 100644
index 00000000..8fcfafb2
--- /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("---------------------------------------\nFree 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..39e9751b 100644
--- a/src/SystemTask/SystemTask.cpp
+++ b/src/SystemTask/SystemTask.cpp
@@ -120,15 +120,15 @@ void SystemTask::Work() {
isSleeping = true;
break;
case Messages::OnNewTime:
- xTimerReset(idleTimer, 0);
+ ReloadIdleTimer();
displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::UpdateDateTime);
break;
case Messages::OnNewNotification:
- xTimerReset(idleTimer, 0);
+ if(isSleeping) GoToRunning();
displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::NewNotification);
break;
case Messages::BleConnected:
- xTimerReset(idleTimer, 0);
+ ReloadIdleTimer();
isBleDiscoveryTimerRunning = true;
bleDiscoveryTimer = 5;
break;
@@ -145,10 +145,10 @@ void SystemTask::Work() {
NVIC_SystemReset();
break;
case Messages::OnTouchEvent:
- xTimerReset(idleTimer, 0);
+ ReloadIdleTimer();
break;
case Messages::OnButtonEvent:
- xTimerReset(idleTimer, 0);
+ ReloadIdleTimer();
break;
default: break;
}
@@ -169,6 +169,8 @@ void SystemTask::Work() {
dateTimeController.UpdateTime(systick_counter);
batteryController.Update();
+ monitor.Process();
+
if(!nrf_gpio_pin_read(pinButton))
watchdog.Kick();
}
@@ -215,3 +217,8 @@ void SystemTask::OnIdle() {
NRF_LOG_INFO("Idle timeout -> Going to sleep")
PushMessage(Messages::GoToSleep);
}
+
+void SystemTask::ReloadIdleTimer() const {
+ if(isSleeping) return;
+ xTimerReset(idleTimer, 0);
+}
diff --git a/src/SystemTask/SystemTask.h b/src/SystemTask/SystemTask.h
index e2325bd6..5a51a776 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 {
@@ -67,6 +68,7 @@ namespace Pinetime {
static void Process(void* instance);
void Work();
+ void ReloadIdleTimer() const;
bool isBleDiscoveryTimerRunning = false;
uint8_t bleDiscoveryTimer = 0;
static constexpr uint32_t idleTime = 15000;
@@ -74,6 +76,12 @@ namespace Pinetime {
bool doNotGoToSleep = false;
void GoToRunning();
+
+#if configUSE_TRACE_FACILITY == 1
+ SystemMonitor<FreeRtosMonitor> monitor;
+#else
+ SystemMonitor<DummyMonitor> monitor;
+#endif
};
}
}