esp32之内存泄漏检测机制

8 篇文章 2 订阅
6 篇文章 1 订阅

在FreeRTOS嵌入式实时系统上开发,经常需要对内存进行优化,或者因使用不当造成内存泄漏(最难受的莫过于某个库出现内存泄漏),人为内存泄漏比较容易找出来,但是函数库存在内存泄漏却是很难发现,作者在解决内存泄漏的过程中也遇到不少坑,难以定位问题存在。

试想有一种方法可以在代码开发阶段实时调试内存,以避免代码量庞大后再出现内存泄漏问题,于是写了一个简单的内存泄漏实时监测任务,用于开发者开发阶段内存调试,同时可用于任务堆栈分配的优化。

具体代码如下:

/*
 * memory_check.c
 *
 *  Created on: 2019年3月3日
 *      Author: zifeng
 */
 
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"
#include "esp_log.h"
 
#include "memory_check.h"
 
/**
 * MEMORY_CHECK_TAG   指针变量存放在全局静态区
 * MEMORY_CHECK_TAG   指针变量指向的值不能改变
 * "memory_check"     字符串常量存放文字常量区
 */
static const char *MEMORY_CHECK_TAG = "memory_check";
 
void memory_check_task(void *pvParameter){
    while (1) {
        ESP_LOGW(MEMORY_CHECK_TAG, "%d: - INTERNAL RAM left %dKB", __LINE__,
                heap_caps_get_free_size( MALLOC_CAP_INTERNAL )/1024);
        ESP_LOGW(MEMORY_CHECK_TAG, "%d: - SPI      RAM left %dkB", __LINE__,
                heap_caps_get_free_size( MALLOC_CAP_SPIRAM )/1024);
        vTaskDelay(2000 / portTICK_PERIOD_MS);
    }
    vTaskDelete(NULL);
}
 
void thread_check_func(const char *thread_name, int thread_line) {
    ESP_LOGW(thread_name, "%d: - Thread\tdepth left %d", thread_line,
            uxTaskGetStackHighWaterMark(NULL));
}
 
 
最终效果:


 ———————————————— 
版权声明:本文为CSDN博主「物联网研究室」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fengfeng0328/article/details/88094771

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值