загрузка сценария компоновщика против виртуального адреса - PullRequest
3 голосов
/ 20 октября 2011

У меня есть следующий скрипт компоновщика, который должен связать код для запуска на микроконтроллере на основе флэш-памяти.В флеш-накопителе по адресу 0x0 и в оперативной памяти 0x40000000.Я хочу поместить раздел данных во флэш-память, но связать программу так, чтобы доступ к разделу данных осуществлялся в оперативной памяти.Дело в том, что при запуске контроллера я вручную скопирую его из флэш-памяти в нужное место в ОЗУ.

MEMORY 
{
    flash   : ORIGIN = 0x00000000, LENGTH = 512K
    ram : ORIGIN = 0x40000000, LENGTH = 32K
    usbram   : ORIGIN = 0x7FD00000, LENGTH = 8K
    ethram   : ORIGIN = 0x7FE00000, LENGTH = 16K
}

SECTIONS
{
    .text : { *(.text) } >flash
    __end_of_text__ = .;
    .data : 
    {
        __data_beg__ = .;
        __data_beg_src__ = __end_of_text__;
        *(.data)
        __data_end__ = .;
    } >ram AT>flash
    .bss : 
    {
        __bss_beg__ = .;
        *(.bss)
    } >ram
}

Код, показанный выше, создает следующий вывод:

40000000 <__data_beg__>:
40000000:   00000001    andeq   r0, r0, r1
40000004:   00000002    andeq   r0, r0, r2
40000008:   00000003    andeq   r0, r0, r3
4000000c:   00000004    andeq   r0, r0, r4
40000010:   00000005    andeq   r0, r0, r5
40000014:   00000006    andeq   r0, r0, r6

который представляет собой массив вида

int foo[] = {1,2,3,4,5,6};

Проблема в том, что он связан с 0x40000000, а не с областью флэш-памяти, как я хотел.Я ожидал, что в части сценария компоновщика AT> flash будет указана ссылка на flash, как объяснено в руководстве по LD.

http://sourceware.org/binutils/docs/ld/Output-Section-Attributes.html#Output-Section-Attributes

и вот мой вызов ld:

arm-elf-ld  -T ./lpc2368.ld entry.o main.o -o binary.elf

Спасибо.

Ответы [ 2 ]

1 голос
/ 08 декабря 2012

Ваш скрипт компоновщика связывает .data с RAM и загружает .data во FLASH. Это связано с командой AT.

Почему вы хотите связать энергозависимые данные с флэш-памятью? Данные и Bss ВСЕГДА должны быть связаны с ОЗУ. Ваш скрипт компоновщика совершенно правильный. Вы бы только связали текст и сохранили данные во флэш-памяти.

Пожалуйста, посмотрите на свой файл карты. Было бы обязательно назначить адрес RAM для переменных данных.

Затем код загрузчика программы копирует байты (data_end - data_beg) из data_beg_src в data_beg.

Итак, первые данные, которые являются массивом, копируются в начало SRAM.

Если вам нужно связать данные для прошивки:

 Data :
  {
   *(.data);
  } > flash

Linker теперь будет LINK и загружать .data во флэш-память. Но на твоем месте я бы этого не сделал.

0 голосов
/ 19 ноября 2015

Ваш виртуальный адрес .data = 0x40000000

Ваш логический адрес .data = 0x00000000

Это можно увидеть с помощью команды objdump -h file.elf

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  8 .data         00000014  40000000  00000000  00001000  2**2
                  CONTENTS, ALLOC, LOAD, DATA
...