Динамическое выделение памяти (ключи –heap, -heap1, -heap2, -heap3) — КиберПедия 

Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...

Динамическое выделение памяти (ключи –heap, -heap1, -heap2, -heap3)

2022-10-05 26
Динамическое выделение памяти (ключи –heap, -heap1, -heap2, -heap3) 0.00 из 5.00 0 оценок
Заказать работу

Компилятор Си++ использует секции неинициализированных данных.heap (локальная куча) и.heap1 (глобальная куча) для создания динамической кучи времени выполнения, используемой функцией malloc(). При помощи ключей -heap и -heap1 можно определить размер кучи в глобальной и локальной памяти вычислительного устройства. Величина кучи задается после знака "равно", и измеряется в 32-разрядных словах:

linker -heap= 0x40000 -heap1= 0x100000,

под локальную кучу выделено 256K слов, а под глобальную 1Mb слов.

Между ключами -heap и -heap1, знаком "=" и размером кучи не должно быть пробелов.

По умолчанию размеры локальной и глобальной куч равны 1K слов. Если размер кучи не установлен пользователем, редактор связей выдает напоминание, что под кучу выделено всего 1K слов. 

Редактор связей создает секции.heap и.heap1 только в том случае, если они имеются во входных файлах, в частности, в библиотеке работы с динамической памятью. Во всех других случаях данные ключи игнорируются.

Редактор связей создает также глобальные символы __HEAP_SIZE и __HEAP1_SIZE. Им присваиваются значения, равные размерам локальной и глобальной куч памяти времени выполнения.

О ключах – heap2 и – heap3

В связи с тем, что процессор может работать с четырьмя шинами и более, и соответственно, возможность работы с четырьмя областями памяти, возникает желание располагать данные более чем в двух областях. Для этого и была добавлена возможность создания еще двух куч. Размер их по умолчанию ноль, в остальном их свойства повторяют свойства первых двух куч. Размер их содержат переменные __HEAP2_SIZE и __HEAP3_SIZE. Для того, чтобы целенаправленно выделять память в нужной области можно использовать функции malloc0, malloc1, malloc2 и malloc3.

4.8.5 Определение размера стека (ключ -stack=[размер])

Для работы программ (на процессорах серии 1879ВМ), при осуществлении вызова функций, сохранения регистров и адресов возврата, используется стек. Стек представляет собой секцию неинициализированных данных с именем.stack, размер которой задается на этапе создания исполняемого файла, то есть во время редактирования связей. Размер стека задается при помощи параметра -stack=[размер] и измеряется в 32-разрядных словах.

Следующий пример демонстрирует процесс определения стека (секции.stack) размером 4K слов:

linker - stack= 0x1000

По умолчанию размер стека равен 1K слов.

Между ключом -stack, знаком "=" и размером стека не должно быть пробелов.

Если в файле конфигурации не указано обратное, секция.stack выделяется в памяти среди прочих секций. Однако для увеличения быстродействия рекомендуется данную секцию помещать в наиболее быструю из доступных память процессора. Механизм размещения секций по заранее определенным адресам приводится в описании файла конфигурации (см. 4.11.3 Секция SECTIONS).

4.8.6 Определение имени точки входа (ключ -start=<имя_метки>)

Адрес памяти, с которого программа начинает выполняться, называется точкой входа. Когда загрузчик помещает программу в память вычислительного устройства, счетчик команд должен быть инициализирован, в него необходимо записать адрес начала программы.

По умолчанию, когда в командной строке не задано имя точки входа, редактор связей полагает, что она имеет имя start. Если глобальный символ с данным именем в таблице символов не обнаружен, или обнаружен, но не определен, то пользователю выдается ошибка " точка входа start не определена ".

Ключ -start=<имя_метки> позволяет задать свое имя метки, с которой будет запущена программа. Метка обязательно должна быть определена в одной из секций, и иметь глобальный тип связывания. Редактор связей вычисляет ее адрес и сохраняет его, как адрес точки входа.

Следующий пример демонстрирует процесс определения пользовательской точки входа, которая в программе помечена меткой BEGIN:

linker file1.elf file2.elf -start= BEGIN

Между ключом -start, знаком "=" и именем метки не должно быть пробела.

Обычно точка входа с именем start определена в стартовом коде, который хранится в библиотеке времени выполнения. При подсоединении данной библиотеки в процессе редактирования связей стартовый код автоматически добавляется к пользовательской программе.

 

Примечание Если использовать стандартную библиотеку, и при этом определить собственную точку входа, то стандартный стартовый код не будет использован, а при дополнительном задании ключа ‑d{1..4} можно и вовсе удалить его из исполняемого файла. Тогда пользователь берет на себя ответственность по правильной установке регистра стека ar7 при запуске программы, и по обработке возврата из программы.

 


Поделиться с друзьями:

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...

Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.011 с.