Как устроена куча Blackfin Печать
Добавил(а) microsin   

Обычно пользователю библиотек Analog Devices для работы с кучами достаточно использовать только функции heap_malloc, heap_space_unused, heap_free [1]. Но иногда при поиске причин проблем требуется заглянуть глубже. Здесь приведено описание библиотеки для обслуживания куч процессоров Blackfin от компании Analog Devices.

Файл Описание
heapinfo.h Заголовочный файл, где определена информационная структура кучи heapdata а также декларация сервисных функций для низкоуровневой работы с кучами.
stdlib_bf.h Этот хедер содержит все расширения стандартного заголовка ANSI stdlib.h, относящиеся к специфике ADSP Blackfin. По умолчанию этот файл подключается заголовком stdlib.h. Чтобы запретить расширения, скомпилируйте проект с опцией: -D__NO_ANSI_EXTENSIONS__.
xalloc.h Библиотечный заголовочный файл, здесь определены типы для блока, выделенного в куче (_Cell) и для информации управления кучей (_Altab). Не должен использоваться напрямую в программах пользователя (подключается другими библиотечными заголовками).
_Sbrk.c Внутренние библиотечные функции для управления кучей (_heap_initheaps, _heap_Sbrk, _Sbrk).
heapinfo.c Функции для получения информации о кучах (space_unused, heap_space_unused, peak_size, heap_peak_size).
heapinit.c Функция инициализации кучи (heap_init).
heapinstall.c Функции инсталляции кучи (heap_install, heap_install_impl).
heaplookup.c Сервисные функции для работы с кучей (heap_lookup, heap_address_from_index).
heapprint.c Функция вывода в консоль информации о кучах (heap_print, heap_print_heaps). Обычно используется только в целях отладки.
heaptab.s Шаблон для таблицы heap_table, где хранятся данные о кучах. Обычно в этой таблице имеется 3 записи. Первая запись это информация о системной куче (system heap, имеет индекс 0, и находится в памяти L1), вторая запись это информация о так называемой куче пользователя (user heap, имеет индекс 1 и находится в L3, т. е. в SDRAM).
имяпроекта_heaptab.c Автоматически генерируемый средой VisualDSP++ файл, который является заменой heaptab.s в проектах C/C++.

heap_table. Это массив ячеек, каждая из которых содержит три беззнаковых 32-битных числа: базовый адрес кучи, длина кучи и идентификатор кучи:

unsigned long base;
unsigned long length;
unsigned long id;

heapdata. Структура heapdata позволяет создавать связанные списки блоков памяти, выделенных в куче.

typedef struct t_heapdata
{
  char *base;              // Начало кучи в адресном пространстве.
  size_t length;           // Размер кучи
  unsigned long userid;    // Идентификатор (индекс) кучи. Куча с индексом 0
                           // является кучей по умолчанию, еще она называется
                           // системной кучей, и она обычно находится в L1 (SRAM).
                           // Куча с индексом 1, если она определена, обычно
                           // находится в L3 (SDRAM).
  char *current;           // Текущая (последняя выделенная) область памяти в куче.
  struct t_heapdata *next_heap;  //Ссылка на следующую кучу в таблице.
#ifdef _FAST_MULTI_HEAPS
  _Altab _Aldata;          // Информация управления кучей.
#endif
} heapdata;

_Altab. Структура, где хранятся данные, необходимые для обслуживания кучи.

typedef struct
{
   /* Информация управления кучей */
   _Cell **_Plast;   /* == null, или указывает на место,
                        откуда продолжится сканирование malloc */
   _Cell *_Head;     /* == null, или указывает на свободную ячейку
                        с самым малым адресом */
} _Altab;

[Ссылки]

1. VisualDSP: работа с динамически выделяемой памятью.
2. VisualDSP: поиск утечки памяти в приложении.