Logo Pico-Framework A web-first embedded framework for C++
Loading...
Searching...
No Matches
utility.cpp
Go to the documentation of this file.
1
15#include "framework_config.h" // Must be included before DebugTrace.h to ensure framework_config.h is processed first
16#include "DebugTrace.h"
17TRACE_INIT(utility) // Initialize tracing for this module
18
19#include "utility/utility.h"
20#include "FreeRTOS.h"
21#include "task.h"
22#include <stdio.h>
23#include <stdlib.h>
24#include <string.h>
25#include <string>
26#include <algorithm>
27#include <sstream>
28#include "pico/stdlib.h"
29
30#ifndef UNIT_TEST
31#include <lwip/memp.h>
32#endif
33#include <lwip/stats.h>
34#include <lwip/pbuf.h>
35#include <lwip/sockets.h>
36#include <lwip/ip_addr.h>
37
40{
41 TRACE("Task Stack Sizes:\n");
42
43 TaskStatus_t *pxTaskStatusArray;
44 UBaseType_t uxTaskCount = uxTaskGetNumberOfTasks();
45 pxTaskStatusArray = (TaskStatus_t *)pvPortMalloc(uxTaskCount * sizeof(TaskStatus_t));
46
47 if (pxTaskStatusArray != NULL)
48 {
49 uxTaskGetSystemState(pxTaskStatusArray, uxTaskCount, NULL);
50 for (UBaseType_t i = 0; i < uxTaskCount; i++)
51 {
52 TRACE("Task %s: Stack high watermark: %u bytes\n",
53 pxTaskStatusArray[i].pcTaskName,
54 pxTaskStatusArray[i].usStackHighWaterMark);
55 }
56 vPortFree(pxTaskStatusArray);
57 }
58 else
59 {
60 TRACE("Failed to allocate memory for task status array.\n");
61 }
62}
63
66{
67 printf("\n===== SYSTEM STATS =====\n");
68 printf("Free heap size: %zu bytes\n", xPortGetFreeHeapSize());
69 printf("Minimum ever free heap: %zu bytes\n", xPortGetMinimumEverFreeHeapSize());
70 printf("Stack watermark: AcceptConnect: %zu, HandleClient: %zu, tcpip_thread: %zu\n",
71 uxTaskGetStackHighWaterMark(NULL),
72 uxTaskGetStackHighWaterMark(NULL),
73 uxTaskGetStackHighWaterMark(NULL));
74 printf("========================\n");
75}
76
79{
80 TRACE("Heap Information:\n");
81 TRACE("Free heap size: %u bytes\n", (unsigned int)xPortGetFreeHeapSize());
82 TRACE("Minimum ever free heap size: %u bytes\n", (unsigned int)xPortGetMinimumEverFreeHeapSize());
83}
84
91
93std::string toLower(std::string str)
94{
95 std::transform(str.begin(), str.end(), str.begin(),
96 [](unsigned char c)
97 { return std::tolower(c); });
98 return str;
99}
100
103{
104 TaskStatus_t *pxTaskStatusArray;
105 UBaseType_t uxArraySize = uxTaskGetNumberOfTasks();
106 unsigned long ulTotalRunTime;
107
108 TRACE("Number of tasks %d\n", uxArraySize);
109 pxTaskStatusArray = (TaskStatus_t *)pvPortMalloc(uxArraySize * sizeof(TaskStatus_t));
110
111 if (pxTaskStatusArray != NULL)
112 {
113 uxArraySize = uxTaskGetSystemState(pxTaskStatusArray, uxArraySize, &ulTotalRunTime);
114
115 for (UBaseType_t x = 0; x < uxArraySize; x++)
116 {
117 printf("Task: %d \t cPri:%d \t bPri:%d \t hw:%zu \t%s \t core: %s\n",
118 pxTaskStatusArray[x].xTaskNumber,
119 pxTaskStatusArray[x].uxCurrentPriority,
120 pxTaskStatusArray[x].uxBasePriority,
121 pxTaskStatusArray[x].usStackHighWaterMark,
122 pxTaskStatusArray[x].pcTaskName);
123 printf("%d\n", get_core_num());
124 }
125 vPortFree(pxTaskStatusArray);
126 }
127 else
128 {
129 panic("Failed to allocate space for stats\n");
130 }
131
132 HeapStats_t heapStats;
133 vPortGetHeapStats(&heapStats);
134 printf("HEAP avl: %zu, blocks %zu, alloc: %zu, free: %zu\n",
135 heapStats.xAvailableHeapSpaceInBytes,
136 heapStats.xNumberOfFreeBlocks,
137 heapStats.xNumberOfSuccessfulAllocations,
138 heapStats.xNumberOfSuccessfulFrees);
139}
140
143{
144#if LWIP_STATS && MEMP_STATS
145 TRACE("Active TCP PCBs: %d\n", lwip_stats.memp[MEMP_TCP_PCB]->used);
146#else
147 TRACE("LWIP stats are not enabled, cannot track active PCBs.\n");
148#endif
149}
150
153{
154 TRACE("\n===== TCP/IP STATE =====\n");
155#if LWIP_STATS && TRACE_INFO
156 extern void stats_display(void);
157 stats_display();
158#else
159 TRACE("lwIP stats unavailable. Ensure LWIP_STATS is enabled in lwipopts.h\n");
160#endif
161 TRACE("========================\n");
162}
163
166{
167 printf("MEM SIZE: %d\n", lwip_stats.mem.avail);
168 printf("MEM USED: %d\n", lwip_stats.mem.used);
169}
170
173{
174 uint32_t ipsr_value;
175#ifndef UNIT_TEST
176 __asm volatile("MRS %0, ipsr" : "=r"(ipsr_value));
177#else
178 ipsr_value = 0;
179#endif
180 return (ipsr_value != 0);
181}
182
184void debug_print(const char *msg)
185{
186 if (msg)
187 {
188 for (const char *p = msg; *p; ++p)
189 {
190 uart_putc(uart0, *p);
191 }
192 }
193}
195void debug_print(const std::string &msg)
196{
197 for (const char *p = msg.c_str(); *p; ++p)
198 {
199 uart_putc(uart0, *p);
200 }
201}
203void debug_print(const char *msg, size_t len)
204{
205 if (msg && len > 0)
206 {
207 for (size_t i = 0; i < len; ++i)
208 {
209 uart_putc(uart0, msg[i]);
210 }
211 }
212}
213
215void warning(const std::string &msg)
216{
217 printf("\033[31m");
218 printf("WARNING: %s\n", msg.c_str());
219 printf("\033[0m");
220}
221
223void warning(const std::string &msg, int32_t code)
224{
225 std::string fullMsg = msg + " (code: " + std::to_string(code) + ")\n";
226 printf("\033[31m");
227 printf("WARNING: %s\n", fullMsg.c_str());
228 printf("\033[0m");
229}
230
231#if PICO_RP2350
232#include "RP2350.h"
233#else
234#include "RP2040.h"
235#endif
236
238 NVIC_SystemReset();
239}
240
241
242
243
244
Macro-based debug trace system with optional SD file logging.
#define TRACE_INIT(MODULE_NAME)
Declare trace usage in a source file for a given module.
Definition DebugTrace.h:170
#define TRACE(...)
Default trace (INFO level).
Definition DebugTrace.h:187
Delegates to user or system configuration.
void printSystemMemoryInfo()
Definition utility.cpp:86
void printActivePCBs()
Definition utility.cpp:142
void runTimeStats()
Definition utility.cpp:102
void printTaskStackSizes()
Definition utility.cpp:39
std::string toLower(std::string str)
Definition utility.cpp:93
void warning(const std::string &msg)
Definition utility.cpp:215
void printHeapInfo()
Definition utility.cpp:78
void printMemsize()
Definition utility.cpp:165
void printTCPState()
Definition utility.cpp:152
int is_in_interrupt(void)
Definition utility.cpp:172
void rebootSystem()
Reboot the device immediately.
Definition utility.cpp:237
void logSystemStats()
Definition utility.cpp:65
void debug_print(const char *msg)
Definition utility.cpp:184