ESP32 FreeRtos任务内存优化

本文介绍了如何在Cortex-M实时操作系统(RTOS)环境中动态获取任务占用的内存空间,包括使用ESP.getHeapSize()和ESP.getFreeHeap()获取总内存和剩余内存,以及uxTaskGetStackHighWaterMark获取任务栈的最大使用量。强调了任务内存应保持为使用内存的两倍以确保稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

如何动态获取任务实际所占有的内存空间,并根据该值对任务的内存大小进行优化设置。

API:

    ESP.getHeapSize() //本程序Heap最大尺寸

    ESP.getFreeHeap() //当前Free Heap最大尺寸

    uxTaskGetStackHighWaterMark(taskHandle) //Task内存使用最大水位线,内存是水

   

    What is the Highest Water Mark?

    the minimum amount of remaining stack space that was available to the task

    since the task started executing - that is the amount of stack that remained

    unused when the task stack was at its greatest (deepest) value. This is what

    is referred to as the stack 'high water mark'.

任务内存最好为使用内存的两倍!!!

程序实现

TaskHandle_t taskHandle;
int taskMem = 1024;

void task(void *ptParam) {
  //volatile char hello[1000] = {0}; //必须要用volatile修饰语,否则会被编译器优化掉
  while (1) {

    //不推荐在task中执行,因为Serial.print也会消耗内存
    // vTaskDelay(2000);
    // int waterMark = uxTaskGetStackHighWaterMark(nullptr);
    // Serial.print("Task Free Memory: ");
    // Serial.print(waterMark);
    // Serial.println(" Bytes");
    // Serial.print("Task Used Memory: ");
    // Serial.print(taskMem - waterMark);
    // Serial.println(" Bytes");
    // Serial.println("");

  }
}
void setup() {
  Serial.begin(115200);

  int heapSize = ESP.getHeapSize();
  Serial.print("Total Heap Size:  ");
  Serial.print(heapSize);
  Serial.println(" Bytes");

  int heapFree = ESP.getFreeHeap();
  Serial.print("Free Heap Size:  ");
  Serial.print(heapFree);
  Serial.println(" Bytes");
  Serial.println("");


  Serial.println("Create Task ...");
  xTaskCreate(task, "", taskMem, NULL, 1, &taskHandle);

  Serial.print("Free Heap Size:  ");
  Serial.print(ESP.getFreeHeap());
  Serial.println(" Bytes");
  Serial.println("");

  vTaskDelay(2000);
  int waterMark = uxTaskGetStackHighWaterMark(taskHandle);
  Serial.print("Task Free Memory: ");
  Serial.print(waterMark);
  Serial.println(" Bytes");
  Serial.print("Task Used Memory: ");
  Serial.print(taskMem - waterMark);
  Serial.println(" Bytes");

}

void loop() {

}

实现环境

内存管理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值