Обычно пользователю библиотек 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: поиск утечки памяти в приложении. |