How to use SystemView Heap Monitoring - Custom Heap

From SEGGER Wiki
Jump to: navigation, search

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.

A typical heap organization would have the following organization: heap organization.svg ...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.


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