VisualDSP работи с динамично разпределена памет, dsp, програмиране
Библиотеката за изпълнение на Blackfin C/C ++ съдържа 4 стандартни функции за управление на купчината: calloc, free, malloc и realloc. По подразбиране приложението определя една купчина, така наречената купчина по подразбиране (купчина по подразбиране), който обслужва всички заявки за динамично разпределение на блокове памет, където някои алтернативни купчини не са изрично посочени. Купчината по подразбиране е дефинирана в стандартния файл с описание на свързващия файл (* .ldf) и заглавката на времето за изпълнение.
Ако една купчина по подразбиране е достатъчна, не са необходими допълнителни стъпки, за да започнете да използвате динамично разпределение на паметта - т.е. функциите calloc, free, malloc и realloc са налични веднага след стартирането на приложението. Може да се наложи само да промените параметрите (например размера) на системната купчина. Това се прави в настройките на проекта, раздел LDF Settings -> System Heap.
Може да се дефинира произволен брой допълнителни купчини. Тези купчини ще обслужват тези заявки за разпределение, които изрично посочват конкретна купчина. Тези допълнителни купчини могат да бъдат съобщени чрез разширените функции за разпределение heap_calloc, heap_free, heap_malloc и heap_realloc. Има и допълнителна функция heap_space_unused, вижте по-долу за подробности.
Използването на множество купчини позволява на програмиста да избира между блокова памет - или да използва бърза, но скъпа памет (SRAM, L1), или да използва по-бавна, но достатъчно памет (SDRAM, L3). Това важи особено за проектите VDK, където API-тата активно използват купчината на системата за създаване на нишки.
Следващото ще ви покаже как да дефинирате купчината, как да работите с купчини, как да използвате интерфейса на купчината и как да освободите място на купчината.
[Определяне на купчината]
Купчината може да бъде дефинирана или на етапа на изграждане на проекта за приложение (време за връзка), или по време на изпълнението му (време на изпълнение). И в двата случая купчината има 3 атрибута:
Системният куп по подразбиране, дефиниран от времето за връзка, винаги има идентификатор на потребителя 0.
Освен това купчините се индексират. Това е нещо като идентификатор на потребителя, но разликата е, че индексът не се присвоява от потребителя, а от системата. Всички разпределения и освобождавания на блокове памет използват индексите на купчината, но не и идентификационния номер на купчината. Стойността на потребителския идентификатор на купчина може да бъде преобразувана в нейния индекс чрез извикване с помощта на _heap_lookup () (вижте "Определяне на купчини по време на изграждане (време на връзка)"). Бъдете внимателни, за да сте сигурни, че сте предали правилния идентификатор на всяка функция.
[Определяне на купчини по време на изграждане (Link-Time)]
Ето стъпка по стъпка процес за създаване на купчина в L3 памет (SDRAM).
един. Отворете свойствата на проекта (Меню на проекта -> Опции на проекта.).
2. Отидете на LDF Settings -> User Heap.
3. В полето за въвеждане на "Heap name:" въведете име за новата купчина. Това име трябва да отговаря на изискванията на имена C, т.е.не трябва да съдържа интервали или други специални символи.
4. В списъка „Типове памет:“ изберете типа памет, където ще се създава купчината.
пет. Посочете размера на купчината - "Размер на купчината:".

Адресите, които се появяват в тази таблица, могат да бъдат буквални (изрично посочени като числа) или могат да бъдат символи, които се разпознават от свързващия елемент. Купчината по подразбиране използва символи, генерирани от линкера, използвайки .ldf файла.
Таблицата _heap_ трябва да бъде разпределена в постоянна памет. Използва се за инициализиране на структурата на време за изпълнение ___heaps, когато е направена първата заявка към купчината. Когато паметта се разпределя от която и да е купчина, библиотеката инициализира структурата ___heaps, използвайки данните в таблицата _heap_ и задава ___nheaps на броя на наличните купчини.
Тъй като функциите за разпределение използват индекси на купчина вместо техните идентификатори на потребителите, купчините, конфигурирани по този начин, трябва да имат идентификатор на потребителя, свързан с индексите, преди да ги използват изрично:
[Дефиниране на купчини по време на изпълнение]
Купчините могат да бъдат дефинирани и инсталирани по време на изпълнение с помощта на функцията _heap_install ():
Тази функция може да вземе всяка част от паметта и да започне да я използва като купчина. Функцията ще върне индекса на купчината, която е била разпределена като новоинсталирана купчина, или ще върне отрицателна стойност, ако са открити проблеми с разпределението на купчината (вижте "Съвети за работа с купчини").
Причините, поради които _heap_install () може да се провали, са както следва (но може да има и други причини, които не са изброени тук):
• Вече има купчина, в която е зададен посоченият идентификатор на потребителя.
• Новата купчина е твърде малка за използване (посоченият параметър за дължина е твърде малък).
[Съвети за работа с купчини]
Размерите на купчината (параметър за дължина) трябва да бъдат цели числа, делими на степен две, за да се използва паметта по-ефективно. Разпределителят на купчина работи с размери на блокове като 256, 512 или 1024 байта.
За съвместимост с C ++, извикванията към malloc и calloc с размер на блока 0 ще разпределят блок с размер 1.