esp32之内存泄漏检测机制

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fengfeng0328/article/details/88094771

在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));
}


最终效果:

具体代码已上传资源,如需要可自行下载。 

猜你喜欢

转载自blog.csdn.net/fengfeng0328/article/details/88094771