众所周知,我们可以使用ps,top和vmstat之类的命令或读取伪文件系统/ proc来获取Linux进程当前使用的RAM。但是我如何在freeRTOS中获得相同的信息,而我们无法使用命令并且不存在文件系统。
答案 0 :(得分:0)
首先,RTOS中没有进程上下文。在FreeRTOS中,有一些任务(类似于Linux中的线程),而一旦 Scheduler 启动,它们的主要上下文又会丢失。客户端在创建任务时配置每个任务占用的堆栈内存。
但是,一旦系统运行,您就可以使用以下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 );
当然,这会经常挂起/取消挂起调度程序,因此,这不是真正的生产代码解决方案,但仍然是很好的调试辅助。