如何获取 freeRTOS 中进程的内存使用情况

How can i get memory usage by a process in freeRTOS

众所周知,我们可以使用 ps、top 和 vmstat 等命令或读取 pseudo-filesystem /proc 来获取 Linux 中进程当前使用的 RAM .但是我怎样才能在 freeRTOS 中获得相同的信息,我们不能使用命令并且不存在文件系统。

首先,RTOS 中没有进程上下文。在 FreeRTOS 中有任务(类似于 Linux 中的线程)和一旦 Scheduler 启动后再次丢失的主上下文。每个任务占用的栈内存由客户端在创建任务时配置。

但是一旦系统 运行ning 您可以使用以下 API.

查询堆栈是否达到最大值

uxTaskGetStackHighWaterMardk(TaskHandle_t task)

请参考https://www.freertos.org/uxTaskGetStackHighWaterMark.html

请记住,INCLUDE_uxTaskGetStackHighWaterMark 应定义为 1 才能使用此功能。

对于堆内存,我假设您正在使用一种 FreeRTOS 堆分配策略(heap_1、heap_2 等)。在这种情况下,如果您已全局覆盖 malloc/free/new/new[]/delete/delete[] 以使用 FreeRTOS pvPortMalloc,则有一种方法可以注册一个挂钩函数,该函数在系统 运行 超出堆时被调用。

参考https://www.freertos.org/a00016.html

同时,可以使用以下 API.

从调度程序中检索 运行 时间状态

void vTaskGetRunTimeStats( char *pcWriteBuffer );

当然,这会 suspend/unsuspend 调度程序频繁执行,因此不会成为您的生产代码的真正解决方案,但仍然是一个很好的调试辅助工具。

参考https://www.freertos.org/rtos-run-time-stats.html.