Я пишу настраиваемый скрипт компоновщика для приложения ARM с открытым металлом. Приложение хранится во флэш-памяти, на данный момент у меня есть код загрузки, копирующий все приложение в SDRAM, и продолжающееся выполнение в SDRAM для достижения скорости. Я хочу изменить этот скрипт, чтобы сразу запустить весь код из флешки, но у меня проблемы с пониманием некоторых элементов.Адрес загрузки и адрес выполнения раздела в скрипте компоновщика
В приведенном ниже сценарии компоновщика раздел .ram_data
имеет адрес выполнения в RAM
и адрес загрузки в ROM
(оба раздела в SDRAM). Из того, что я понимаю, адрес выполнения используется компоновщиком для разрешения символа всех элементов, не относящихся к ПК, но как насчет адреса загрузки? В контексте голосовой ARM нет такой вещи, как загрузчик программ, и нет никакого способа, чтобы линкер мог влиять на то, где я пишу программу во флеше, и для чего она фактически используется?
Точно так же как линкер может влиять на SDRAM (rx) или (rw) во время выполнения? Действительно ли это что-то меняет, когда я изменяю эти параметры в областях памяти?
MEMORY
{
RAM(rw) : ORIGIN = 0x00001000, LENGTH = 12M-4K
ROM(rx) : ORIGIN = 0x007f1000, LENGTH = 60K
}
SECTIONS
{
.startup :
{ ... } > VECTOR
.rom_text :
{ ... } > ROM
.ram_data :
{
_data_start = .;
*(.data*)
_data_end = .;
} > RAM AT>ROM
.ram_bss :
{ ... } > RAM
}
Хорошо, спасибо! В моем случае имя немного вводит в заблуждение, «ПЗУ» на самом деле находится в SDRAM, содержимое со вспышки копируется в раздел «ПЗУ» в sdram и выполняется в разделе «ОЗУ» в sdram. Поэтому линкер не знает о флэш-адресе (0xffff0000 в моем случае), а код загрузки, выполняющий копию, записывается с помощью условных инструкций ПК. –
@ Étienne я вижу. Ну, вы можете фактически выполнить из ** NOR ** flash в некоторых ситуациях (это, вероятно, медленнее для вас с SDRAM). В этом случае '.text' остается в * flash *, а' .data' копируется в SDRAM из * flash *. Вы можете сделать свой код загрузчика не относящимся к ПК относительным, указав область памяти ** FLASH ** и перечислить объекты загрузчика в этом разделе. Однако, если оба ваших ** ПЗУ ** и ** ОЗУ ** находятся в SDRAM, использование 'AT' не требуется и уничтожает память. –