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

@ -442,6 +442,7 @@ set(INCLUDE_FILES
libs/date/includes/date/tz_private.h libs/date/includes/date/tz_private.h
DisplayApp/LittleVgl.h DisplayApp/LittleVgl.h
SystemTask/SystemTask.h SystemTask/SystemTask.h
SystemTask/SystemMonitor.h
) )
include_directories( include_directories(

View file

@ -63,7 +63,7 @@
#define configTICK_RATE_HZ 1024 #define configTICK_RATE_HZ 1024
#define configMAX_PRIORITIES ( 3 ) #define configMAX_PRIORITIES ( 3 )
#define configMINIMAL_STACK_SIZE ( 120 ) #define configMINIMAL_STACK_SIZE ( 120 )
#define configTOTAL_HEAP_SIZE ( 1024*20 ) #define configTOTAL_HEAP_SIZE ( 1024*11 )
#define configMAX_TASK_NAME_LEN ( 4 ) #define configMAX_TASK_NAME_LEN ( 4 )
#define configUSE_16_BIT_TICKS 0 #define configUSE_16_BIT_TICKS 0
#define configIDLE_SHOULD_YIELD 1 #define configIDLE_SHOULD_YIELD 1
@ -85,7 +85,7 @@
/* Run time and task stats gathering related definitions. */ /* Run time and task stats gathering related definitions. */
#define configGENERATE_RUN_TIME_STATS 0 #define configGENERATE_RUN_TIME_STATS 0
#define configUSE_TRACE_FACILITY 0 #define configUSE_TRACE_FACILITY 1
#define configUSE_STATS_FORMATTING_FUNCTIONS 0 #define configUSE_STATS_FORMATTING_FUNCTIONS 0
/* Co-routine definitions. */ /* Co-routine definitions. */
@ -96,7 +96,7 @@
#define configUSE_TIMERS 1 #define configUSE_TIMERS 1
#define configTIMER_TASK_PRIORITY ( 0 ) #define configTIMER_TASK_PRIORITY ( 0 )
#define configTIMER_QUEUE_LENGTH 32 #define configTIMER_QUEUE_LENGTH 32
#define configTIMER_TASK_STACK_DEPTH ( 240 ) #define configTIMER_TASK_STACK_DEPTH ( 200 )
/* Tickless Idle configuration. */ /* Tickless Idle configuration. */
#define configEXPECTED_IDLE_TIME_BEFORE_SLEEP 2 #define configEXPECTED_IDLE_TIME_BEFORE_SLEEP 2

View file

@ -13,7 +13,7 @@ void NrfLogger::Init() {
NRF_LOG_DEFAULT_BACKENDS_INIT(); NRF_LOG_DEFAULT_BACKENDS_INIT();
if (pdPASS != xTaskCreate(NrfLogger::Process, "LOGGER", 512, nullptr, 0, &m_logger_thread)) if (pdPASS != xTaskCreate(NrfLogger::Process, "LOGGER", 200, this, 0, &m_logger_thread))
APP_ERROR_HANDLER(NRF_ERROR_NO_MEM); APP_ERROR_HANDLER(NRF_ERROR_NO_MEM);
} }

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); dateTimeController.UpdateTime(systick_counter);
batteryController.Update(); batteryController.Update();
monitor.Process();
if(!nrf_gpio_pin_read(pinButton)) if(!nrf_gpio_pin_read(pinButton))
watchdog.Kick(); watchdog.Kick();
} }

View file

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

View file

@ -37,7 +37,7 @@ nimble_port_freertos_init(TaskFunction_t host_task_fn)
* provided by NimBLE and in case of FreeRTOS it does not need to be wrapped * provided by NimBLE and in case of FreeRTOS it does not need to be wrapped
* since it has compatible prototype. * since it has compatible prototype.
*/ */
xTaskCreate(nimble_port_ll_task_func, "ll", configMINIMAL_STACK_SIZE + 400, xTaskCreate(nimble_port_ll_task_func, "ll", configMINIMAL_STACK_SIZE + 100,
NULL, configMAX_PRIORITIES - 1, &ll_task_h); NULL, configMAX_PRIORITIES - 1, &ll_task_h);
#endif #endif
@ -46,6 +46,6 @@ nimble_port_freertos_init(TaskFunction_t host_task_fn)
* have separate task for NimBLE host, but since something needs to handle * have separate task for NimBLE host, but since something needs to handle
* default queue it is just easier to make separate task which does this. * default queue it is just easier to make separate task which does this.
*/ */
xTaskCreate(host_task_fn, "ble", configMINIMAL_STACK_SIZE + 400, xTaskCreate(host_task_fn, "ble", configMINIMAL_STACK_SIZE + 200,
NULL, tskIDLE_PRIORITY + 1, &host_task_h); NULL, tskIDLE_PRIORITY + 1, &host_task_h);
} }