Skip to content

Commit ddc06d4

Browse files
[Silabs]Migration memMonitoring to cmsisos with some cleanup due to api changes (project-chip#33270)
* Migration memMonitoring to cmsisos with some cleanup due to api changes change namespace and method names * fixup * Apply suggestion to use new/delete instead of longer MemoryMalloc/MemoryFree api
1 parent 997ccd0 commit ddc06d4

File tree

3 files changed

+64
-61
lines changed

3 files changed

+64
-61
lines changed

examples/platform/silabs/MatterConfig.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ CHIP_ERROR SilabsMatterConfig::InitMatter(const char * appName)
240240
#endif
241241

242242
#ifdef HEAP_MONITORING
243-
MemMonitoring::startHeapMonitoring();
243+
MemMonitoring::StartMonitor();
244244
#endif
245245

246246
//==============================================

examples/platform/silabs/MemMonitoring.cpp

+54-56
Original file line numberDiff line numberDiff line change
@@ -19,93 +19,91 @@
1919
#include "MemMonitoring.h"
2020

2121
#include "AppConfig.h"
22-
#include "FreeRTOS.h"
22+
#include <cmsis_os2.h>
2323
#include <platform/CHIPDeviceLayer.h>
24+
#include <sl_cmsis_os2_common.h>
2425

25-
#define BLE_STACK_TASK_NAME "Bluetooth stack"
26-
#define BLE_LINK_TASK_NAME "Bluetooth linklayer"
26+
namespace chip {
27+
namespace DeviceLayer {
28+
namespace Silabs {
2729

28-
static StackType_t monitoringStack[MONITORING_STACK_SIZE_byte / sizeof(StackType_t)];
29-
static StaticTask_t monitoringTaskStruct;
30+
static osThreadId_t sMonitorThreadHandle;
31+
constexpr uint32_t kMonitorTaskSize = 1024;
32+
static uint8_t monitorStack[kMonitorTaskSize];
33+
static osThread_t sMonitorTaskControlBlock;
34+
constexpr osThreadAttr_t kMonitorTaskAttr = { .name = "MemMonitor",
35+
.attr_bits = osThreadDetached,
36+
.cb_mem = &sMonitorTaskControlBlock,
37+
.cb_size = osThreadCbSize,
38+
.stack_mem = monitorStack,
39+
.stack_size = kMonitorTaskSize,
40+
.priority = osPriorityLow };
3041

3142
size_t nbAllocSuccess = 0;
3243
size_t nbFreeSuccess = 0;
3344
size_t largestBlockAllocated = 0;
3445

35-
void MemMonitoring::startHeapMonitoring()
46+
void MemMonitoring::StartMonitor()
3647
{
37-
xTaskCreateStatic(HeapMonitoring, "Monitoring", MONITORING_STACK_SIZE_byte / sizeof(StackType_t), NULL, 1, monitoringStack,
38-
&monitoringTaskStruct);
48+
sMonitorThreadHandle = osThreadNew(MonitorTask, nullptr, &kMonitorTaskAttr);
3949
}
4050

41-
void MemMonitoring::HeapMonitoring(void * pvParameter)
51+
void MemMonitoring::MonitorTask(void * pvParameter)
4252
{
53+
uint32_t threadCount = osThreadGetCount();
4354

44-
UBaseType_t appTaskValue;
45-
UBaseType_t bleEventTaskValue;
46-
UBaseType_t bleTaskValue;
47-
UBaseType_t linkLayerTaskValue;
48-
UBaseType_t openThreadTaskValue;
49-
UBaseType_t eventLoopTaskValue;
50-
51-
TaskHandle_t eventLoopHandleStruct = xTaskGetHandle(CHIP_DEVICE_CONFIG_CHIP_TASK_NAME);
52-
TaskHandle_t otTaskHandle = xTaskGetHandle(CHIP_DEVICE_CONFIG_THREAD_TASK_NAME);
53-
TaskHandle_t appTaskHandle = xTaskGetHandle(APP_TASK_NAME);
54-
TaskHandle_t bleStackTaskHandle = xTaskGetHandle(BLE_STACK_TASK_NAME);
55-
TaskHandle_t bleLinkTaskHandle = xTaskGetHandle(BLE_LINK_TASK_NAME);
56-
TaskHandle_t bleEventTaskHandle = xTaskGetHandle(CHIP_DEVICE_CONFIG_BLE_APP_TASK_NAME);
57-
58-
#if CHIP_SYSTEM_CONFIG_USE_LWIP
59-
UBaseType_t lwipTaskValue;
60-
TaskHandle_t lwipHandle = xTaskGetHandle(TCPIP_THREAD_NAME);
61-
#endif // CHIP_SYSTEM_CONFIG_USE_LWIP
55+
osThreadId_t * threadIdTable = new osThreadId_t[threadCount];
56+
// Forms a table of the active thread ids
57+
osThreadEnumerate(threadIdTable, threadCount);
6258

6359
while (true)
6460
{
65-
appTaskValue = uxTaskGetStackHighWaterMark(appTaskHandle);
66-
bleEventTaskValue = uxTaskGetStackHighWaterMark(bleEventTaskHandle);
67-
bleTaskValue = uxTaskGetStackHighWaterMark(bleStackTaskHandle);
68-
linkLayerTaskValue = uxTaskGetStackHighWaterMark(bleLinkTaskHandle);
69-
openThreadTaskValue = uxTaskGetStackHighWaterMark(otTaskHandle);
70-
eventLoopTaskValue = uxTaskGetStackHighWaterMark(eventLoopHandleStruct);
71-
#if CHIP_SYSTEM_CONFIG_USE_LWIP
72-
lwipTaskValue = uxTaskGetStackHighWaterMark(lwipHandle);
73-
#endif // CHIP_SYSTEM_CONFIG_USE_LWIP
7461

7562
SILABS_LOG("=============================");
76-
SILABS_LOG(" ");
77-
SILABS_LOG("Largest Block allocated 0x%x", largestBlockAllocated);
78-
SILABS_LOG("Number Of Successful Alloc 0x%x", nbAllocSuccess);
79-
SILABS_LOG("Number Of Successful Frees 0x%x", nbFreeSuccess);
80-
SILABS_LOG(" ");
81-
SILABS_LOG("App Task most bytes ever Free 0x%x", (appTaskValue * 4));
82-
SILABS_LOG("BLE Event most bytes ever Free 0x%x", (bleEventTaskValue * 4));
83-
SILABS_LOG("BLE Stack most bytes ever Free 0x%x", (bleTaskValue * 4));
84-
SILABS_LOG("Link Layer Task most bytes ever Free 0x%x", (linkLayerTaskValue * 4));
85-
SILABS_LOG("OpenThread Task most bytes ever Free 0x%x", (openThreadTaskValue * 4));
86-
SILABS_LOG("Event Loop Task most bytes ever Free 0x%x", (eventLoopTaskValue * 4));
87-
#if CHIP_SYSTEM_CONFIG_USE_LWIP
88-
SILABS_LOG("LWIP Task most bytes ever Free 0x%x", (lwipTaskValue * 4));
89-
#endif // CHIP_SYSTEM_CONFIG_USE_LWIP
90-
SILABS_LOG(" ");
63+
SILABS_LOG(" ");
64+
SILABS_LOG("Largest Block allocated %lu B", largestBlockAllocated);
65+
SILABS_LOG("Number Of Successful Alloc %lu", nbAllocSuccess);
66+
SILABS_LOG("Number Of Successful Frees %lu", nbFreeSuccess);
67+
SILABS_LOG(" ");
68+
69+
SILABS_LOG("Thread stack highwatermark ");
70+
for (uint8_t tIdIndex = 0; tIdIndex < threadCount; tIdIndex++)
71+
{
72+
osThreadId_t tId = threadIdTable[tIdIndex];
73+
if (tId != sMonitorThreadHandle) // don't print stats for this current debug thread.
74+
{
75+
// The smallest amount of free stack space there has been since the thread creation
76+
SILABS_LOG("\t%-10s : %6lu B", osThreadGetName(tId), osThreadGetStackSpace(tId));
77+
}
78+
}
79+
80+
SILABS_LOG(" ");
9181
SILABS_LOG("=============================");
92-
vTaskDelay(pdMS_TO_TICKS(5000));
82+
// run loop every 5 seconds
83+
osDelay(osKernelGetTickFreq() * 5);
9384
}
85+
86+
// will never get here. Still, free allocated memory before exiting
87+
delete threadIdTable;
9488
}
9589

90+
} // namespace Silabs
91+
} // namespace DeviceLayer
92+
} // namespace chip
93+
9694
extern "C" void memMonitoringTrackAlloc(void * ptr, size_t size)
9795
{
9896
if (ptr != NULL)
9997
{
100-
nbAllocSuccess++;
101-
if (largestBlockAllocated < size)
98+
chip::DeviceLayer::Silabs::nbAllocSuccess++;
99+
if (chip::DeviceLayer::Silabs::largestBlockAllocated < size)
102100
{
103-
largestBlockAllocated = size;
101+
chip::DeviceLayer::Silabs::largestBlockAllocated = size;
104102
}
105103
}
106104
}
107105

108106
extern "C" void memMonitoringTrackFree(void * ptr, size_t size)
109107
{
110-
nbFreeSuccess++;
108+
chip::DeviceLayer::Silabs::nbFreeSuccess++;
111109
}

examples/platform/silabs/MemMonitoring.h

+9-4
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,22 @@
1919
#pragma once
2020

2121
#ifdef HEAP_MONITORING
22-
#include "FreeRTOS.h"
2322

24-
#define MONITORING_STACK_SIZE_byte 1024
23+
namespace chip {
24+
namespace DeviceLayer {
25+
namespace Silabs {
2526

2627
class MemMonitoring
2728
{
2829
public:
29-
static void startHeapMonitoring();
30+
static void StartMonitor();
3031

3132
private:
32-
static void HeapMonitoring(void * pvParameter);
33+
static void MonitorTask(void * pvParameter);
3334
};
3435

36+
} // namespace Silabs
37+
} // namespace DeviceLayer
38+
} // namespace chip
39+
3540
#endif

0 commit comments

Comments
 (0)