mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
bc2879a956
Add back a feature that was available in the old heap implementation in release/v2.1 and earlier: keep track of which task allocates each block from the heap. The task handle is conditionally added as another word in the heap poisoning header under this configuration option CONFIG_HEAP_TASK_TRACKING. To allow custom monitoring and debugging code to be added, add helper functions in multi_heap.c and multi_heap_poisoning.c to provide access to information in the block headers. Add esp_heap_debug_dump_totals() to monitor heap usage esp_heap_debug_dump_totals() dumps into a user-provided data structure a summary of the amound of heap memory in region type that is used by each task. Optionally it will also dump into another data structure the metadata about each allocated block for a given list of tasks or for all tasks (limited by available space). Address change requests on PR #1498 This set of changes fixes the files ine3b702c
to just add the CONFIG_HEAP_TASK_TRACKING option without adding the new function heap_caps_get_per_task_info() in case that is the only portion of the PR that will be accepted. Part of the change is to remove the new .c and .h files containing that function and to remove the line to compile it from components/heap/component.mk since it should not have been included ine3b702c
. One or more additional commits to add the new function will follow. The other changes here: - uint32_t get_all_caps() moves to heap_private.h - replace "void* foo" with "void *foo" - add braces around single-line "if" blocks - replace tab characters with spaces Address change requests on PR #1498, part 2 This set of changes fixes the files incdf32aa
to add the new function heap_caps_get_per_task_info() with its new name and to add the line to compile it in components/heap/component.mk. This does not address all the suggested changes because there are some needing further discussion. This commit does not include the suggested change to move the declaration of the new function into esp_heap_caps.h because the new function references TaskHandle_t so esp_heap_caps.h would have to include freertos/FreeRTOS.h and freertos/task.h, but FreeRTOS.h includes esp_heap_caps.h through two other header files which results in compilation errors because not all of FreeRTOS.h has been read yet. Change heap_caps_get_per_task_info() to take struct of params In addition to moving the large number of function parameters into a struct as the single parameter, the following changes were made: - Clear out the totals for any prepopulated tasks so the app code doesn't have to do it. - Rather than partitioning the per-task totals into a predetermined set of heap capabilities, take a list of <caps,mask> pairs to compare the caps to the heap capabilities as masked. This lets the caller configure the desired partitioning, or none. - Allow the totals array pointer or the blocks array pointer to be NULL to indicate not to collect that part of the information. - In addition to returning the total space allocated by each task, return the number of blocks allocated by each task. - Don't need to return the heap capabilities as part of the details for each block since the heap region (and therefore its capabilities) can be determined from the block address. - Renamed heap_task_info.h to esp_heap_task_info.h to fit the naming convention, and renamed the structs for totals and block details to better fit the revised function name. - Provide full Doxygen commenting for the function and parameter structs. Add copyright header to new files Merges https://github.com/espressif/esp-idf/pull/1498
76 lines
2.4 KiB
C
76 lines
2.4 KiB
C
// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
#pragma once
|
|
|
|
#include <stdlib.h>
|
|
#include <stdint.h>
|
|
#include <freertos/FreeRTOS.h>
|
|
#include <soc/soc_memory_layout.h>
|
|
#include "multi_heap.h"
|
|
#include "rom/queue.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* Some common heap registration data structures used
|
|
for heap_caps_init.c to share heap information with heap_caps.c
|
|
*/
|
|
|
|
/* Type for describing each registered heap */
|
|
typedef struct heap_t_ {
|
|
uint32_t caps[SOC_MEMORY_TYPE_NO_PRIOS]; ///< Capabilities for the type of memory in this heap (as a prioritised set). Copied from soc_memory_types so it's in RAM not flash.
|
|
intptr_t start;
|
|
intptr_t end;
|
|
portMUX_TYPE heap_mux;
|
|
multi_heap_handle_t heap;
|
|
SLIST_ENTRY(heap_t_) next;
|
|
} heap_t;
|
|
|
|
/* All registered heaps.
|
|
|
|
Forms a single linked list, even though most entries are contiguous.
|
|
This means at the expense of 4 bytes per heap, new heaps can be
|
|
added at runtime in a fast & thread-safe way.
|
|
*/
|
|
extern SLIST_HEAD(registered_heap_ll, heap_t_) registered_heaps;
|
|
|
|
bool heap_caps_match(const heap_t *heap, uint32_t caps);
|
|
|
|
/* return all possible capabilities (across all priorities) for a given heap */
|
|
inline static uint32_t get_all_caps(const heap_t *heap)
|
|
{
|
|
if (heap->heap == NULL) {
|
|
return 0;
|
|
}
|
|
uint32_t all_caps = 0;
|
|
for (int prio = 0; prio < SOC_MEMORY_TYPE_NO_PRIOS; prio++) {
|
|
all_caps |= heap->caps[prio];
|
|
}
|
|
return all_caps;
|
|
}
|
|
|
|
/*
|
|
Because we don't want to add _another_ known allocation method to the stack of functions to trace wrt memory tracing,
|
|
these are declared private. The newlib malloc()/realloc() implementation also calls these, so they are declared
|
|
separately in newlib/syscalls.c.
|
|
*/
|
|
void *heap_caps_realloc_default(void *p, size_t size);
|
|
void *heap_caps_malloc_default(size_t size);
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|