2013-04-09 1 views
3

Я пишу настраиваемый скрипт компоновщика для приложения 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 
} 

ответ

1

Учитывая ваш пример сценария компоновщика, эти два вопроса связаны.

Из того, что я понимаю, адрес исполнения используется компоновщиком для разрешения символа всех элементов, не относящихся к ПК, но как насчет адреса загрузки?

Точно так же как линкер может влиять на SDRAM (rx) или (rw) во время выполнения? Действительно ли это что-то меняет, когда я изменяю эти параметры в областях памяти?

LOAD адрес полезен, как все должно быть запрограммирован на FLASH. Вот почему .ram_data должен иметь AT>ROM. Он сообщает компоновщику, что данные будут LOAD из ROM/Flash. Вы должны сделать некоторый код загрузки ассемблера, который скопирует его с flash на SDRAM в этом случае.

На второй вопрос можно ответить, поставив >ROM на раздел .ram_data. Если вы это сделаете, компоновщик будет жаловаться на то, что раздел , который можно записать, помещается в только для чтения. Хорошо отметить разделы MEMORY с информацией для чтения/записи, так как это может помочь вам убедиться, что у вас есть разделы в нужных местах. То есть, это перекрестная проверка информации, которую вы даете компоновщику.

Ошибка >RAM AT>ROM вместо этого >ROM делает концепции/вопросы похожими.

+0

Хорошо, спасибо! В моем случае имя немного вводит в заблуждение, «ПЗУ» на самом деле находится в SDRAM, содержимое со вспышки копируется в раздел «ПЗУ» в sdram и выполняется в разделе «ОЗУ» в sdram. Поэтому линкер не знает о флэш-адресе (0xffff0000 в моем случае), а код загрузки, выполняющий копию, записывается с помощью условных инструкций ПК. –

+0

@ Étienne я вижу. Ну, вы можете фактически выполнить из ** NOR ** flash в некоторых ситуациях (это, вероятно, медленнее для вас с SDRAM). В этом случае '.text' остается в * flash *, а' .data' копируется в SDRAM из * flash *. Вы можете сделать свой код загрузчика не относящимся к ПК относительным, указав область памяти ** FLASH ** и перечислить объекты загрузчика в этом разделе. Однако, если оба ваших ** ПЗУ ** и ** ОЗУ ** находятся в SDRAM, использование 'AT' не требуется и уничтожает память. –

1

Из того, что я понимаю, адрес исполнения используется линкер, чтобы сделать разрешение символов всех элементов, которые не являются PC относительной, но что об адресе нагрузки? В контексте голосовой ARM нет такой вещи, как загрузчик программ, и нет никакого способа, чтобы линкер мог влиять на то, где я пишу программу во флеше, и для чего она фактически используется?

Эта информация хранится в ELF исполняемый файл, и используется как инструмент objcopy, чтобы определить, как двоичный файл (например, .bin или .hex) выложена. В конечном счете, это заканчивается тем, что говорит программисту, куда поставить программу.

Точно так же как линкер может влиять на SDRAM (rx) или (rw) во время выполнения? Действительно ли это что-то меняет, когда я изменяю эти параметры в областях памяти?

В этом конкретном случае использования, я считаю, что эти флаги являются информационными. Они в основном используются для динамически загружаемых программ.

+0

Хорошо, спасибо за ответ! В этом конкретном случае я использую рукописный программист, который не читает двоичную информацию, но хорошо знать, что он используется для этой цели. –

Смежные вопросы