Difference between revisions of "How to use SystemView Heap Monitoring - Custom Heap"
Line 1: | Line 1: | ||
+ | ==Intro== |
||
This article assumes a working SystemView setup. To gain some more info on this subject, please consult either the main article ([[How to use SystemView Heap_Monitoring]]) or the SystemView documentation. |
This article assumes a working SystemView setup. To gain some more info on this subject, please consult either the main article ([[How to use SystemView Heap_Monitoring]]) or the SystemView documentation. |
||
+ | ==Heap Initialization== |
||
A typical heap organization would have the following organization: |
A typical heap organization would have the following organization: |
||
+ | |||
[[File:heap_organization.svg]] |
[[File:heap_organization.svg]] |
||
+ | |||
...where metadata holds the information about the size of the chunk and pointers to other chunks. |
...where metadata holds the information about the size of the chunk and pointers to other chunks. |
||
This information needs to be provided during the initialization of the SystemView interface through the following function: |
This information needs to be provided during the initialization of the SystemView interface through the following function: |
||
Line 16: | Line 20: | ||
The <code>__heap_start__</code> is a symbol that is defined if the heap region is allocated in the linker script. |
The <code>__heap_start__</code> is a symbol that is defined if the heap region is allocated in the linker script. |
||
+ | ==Reporting Heap Data To SystemView== |
||
− | |||
Allocating the memory should be accompanied by a call to <code>SEGGER_SYSVIEW_HeapAlloc</code>: |
Allocating the memory should be accompanied by a call to <code>SEGGER_SYSVIEW_HeapAlloc</code>: |
||
<pre> |
<pre> |
Revision as of 14:50, 19 July 2023
Intro
This article assumes a working SystemView setup. To gain some more info on this subject, please consult either the main article (How to use SystemView Heap_Monitoring) or the SystemView documentation.
Heap Initialization
A typical heap organization would have the following organization:
...where metadata holds the information about the size of the chunk and pointers to other chunks. This information needs to be provided during the initialization of the SystemView interface through the following function:
void SEGGER_SYSVIEW_HeapDefine(void * pHeap, void * pBase, unsigned int HeapSize, unsigned int MetadataSize);
Note that the size reported to SystemView should be the internally allocated size excluding the metadata, and not the size requested by a user. Therefore, a utility function for obtaining the size to be reported to SystemView might look like this:
The __heap_start__
is a symbol that is defined if the heap region is allocated in the linker script.
Reporting Heap Data To SystemView
Allocating the memory should be accompanied by a call to SEGGER_SYSVIEW_HeapAlloc
:
static void* _MyMalloc(size_t size) { void* p = ... // a call to a custom alloc routine // SystemView needs the real internal heap block size, not the amount requested by the user SEGGER_SYSVIEW_HeapAlloc(__heap_start__, p, _GetAllocBlockSize(size)); return p; }
Freeing the memory should be accompanied by a call to SEGGER_SYSVIEW_HeapFree
:
static void _MyFree(void* p) { ... // a call to a custom freeing routine SEGGER_SYSVIEW_HeapFree(__heap_start__, p); }
Since there is no dedicated realloc SystemView API function, a combination of SEGGER_SYSVIEW_HeapFree
and SEGGER_SYSVIEW_HeapAlloc
is needed:
static void* _MyRealloc(void* p, size_t size) { void* rp = ... // a call to a custom realloc routine SEGGER_SYSVIEW_HeapFree(__heap_start__, p); // SystemView needs the real internal heap block size, not the amount requested by the user SEGGER_SYSVIEW_HeapAlloc(__heap_start__, rp, _GetAllocBlockSize(size)); return rp; }