У меня есть следующий скрипт компоновщика, который должен связать код для запуска на микроконтроллере на основе флэш-памяти.В флеш-накопителе по адресу 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
Спасибо.