78 lines
2.8 KiB
C
78 lines
2.8 KiB
C
|
/* Heap Task Tracking Example
|
||
|
|
||
|
This example code is in the Public Domain (or CC0 licensed, at your option.)
|
||
|
|
||
|
Unless required by applicable law or agreed to in writing, this
|
||
|
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
||
|
CONDITIONS OF ANY KIND, either express or implied.
|
||
|
*/
|
||
|
#include <stdio.h>
|
||
|
#include "freertos/FreeRTOS.h"
|
||
|
#include "freertos/task.h"
|
||
|
#include "esp_heap_task_info.h"
|
||
|
#include "esp_log.h"
|
||
|
|
||
|
|
||
|
#define MAX_TASK_NUM 20 // Max number of per tasks info that it can store
|
||
|
#define MAX_BLOCK_NUM 20 // Max number of per block info that it can store
|
||
|
|
||
|
static size_t s_prepopulated_num = 0;
|
||
|
static heap_task_totals_t s_totals_arr[MAX_TASK_NUM];
|
||
|
static heap_task_block_t s_block_arr[MAX_BLOCK_NUM];
|
||
|
|
||
|
static void esp_dump_per_task_heap_info(void)
|
||
|
{
|
||
|
heap_task_info_params_t heap_info = {0};
|
||
|
heap_info.caps[0] = MALLOC_CAP_8BIT; // Gets heap with CAP_8BIT capabilities
|
||
|
heap_info.mask[0] = MALLOC_CAP_8BIT;
|
||
|
heap_info.caps[1] = MALLOC_CAP_32BIT; // Gets heap info with CAP_32BIT capabilities
|
||
|
heap_info.mask[1] = MALLOC_CAP_32BIT;
|
||
|
heap_info.tasks = NULL; // Passing NULL captures heap info for all tasks
|
||
|
heap_info.num_tasks = 0;
|
||
|
heap_info.totals = s_totals_arr; // Gets task wise allocation details
|
||
|
heap_info.num_totals = &s_prepopulated_num;
|
||
|
heap_info.max_totals = MAX_TASK_NUM; // Maximum length of "s_totals_arr"
|
||
|
heap_info.blocks = s_block_arr; // Gets block wise allocation details. For each block, gets owner task, address and size
|
||
|
heap_info.max_blocks = MAX_BLOCK_NUM; // Maximum length of "s_block_arr"
|
||
|
|
||
|
heap_caps_get_per_task_info(&heap_info);
|
||
|
|
||
|
for (int i = 0 ; i < *heap_info.num_totals; i++) {
|
||
|
printf("Task: %s -> CAP_8BIT: %d CAP_32BIT: %d\n",
|
||
|
heap_info.totals[i].task ? pcTaskGetTaskName(heap_info.totals[i].task) : "Pre-Scheduler allocs" ,
|
||
|
heap_info.totals[i].size[0], // Heap size with CAP_8BIT capabilities
|
||
|
heap_info.totals[i].size[1]); // Heap size with CAP32_BIT capabilities
|
||
|
}
|
||
|
|
||
|
printf("\n\n");
|
||
|
}
|
||
|
|
||
|
static void example_task(void *args)
|
||
|
{
|
||
|
uint32_t size = 0;
|
||
|
const char *TAG = "example_task";
|
||
|
while (1) {
|
||
|
/*
|
||
|
* Allocate random amount of memory for demonstration
|
||
|
*/
|
||
|
size = (esp_random() % 1000);
|
||
|
void *ptr = malloc(size);
|
||
|
if (ptr == NULL) {
|
||
|
ESP_LOGE(TAG, "Could not allocate heap memory");
|
||
|
abort();
|
||
|
}
|
||
|
esp_dump_per_task_heap_info();
|
||
|
free(ptr);
|
||
|
vTaskDelay(pdMS_TO_TICKS(2000));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void app_main(void)
|
||
|
{
|
||
|
/*
|
||
|
* Create example task to demonstrate heap_task_tracking
|
||
|
*/
|
||
|
xTaskCreate(&example_task, "example_task", 3072, NULL, 5, NULL);
|
||
|
}
|