我有下面的鏈接腳本應該鏈接代碼以在基於閃存的微控制器上運行。 uC在地址0x0處具有閃存,在0x40000000處具有RAM。我想把數據部分放到閃存中,但鏈接程序,以便在RAM中完成對數據部分的訪問。關鍵是,當控制器啓動時,我會手動將它從閃存中複製到適當的RAM位置。鏈接器腳本加載與虛擬地址對比
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部分能夠指定鏈接到閃存,正如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
感謝。
可以看出通過'link'你的意思是訪問將在適當的RAM偏移量?因此,這裏的鏈接器假設你已經將數據複製到了指定地址的RAM中(在這種情況下是'__data_beg__')?也就是說,將'__data_beg_src__'(flash)複製到'__data_beg__'(RAM)? – sherrellbc