2011-10-20 25 views
3

我有下面的鏈接腳本應該鏈接代碼以在基於閃存的微控制器上運行。 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 

感謝。

回答

1

您的鏈接描述文件鏈接.data到RAM和LOADS .data到FLASH。這是由於AT命令。

爲什麼要將易失性數據鏈接到閃存?數據和BSS必須始終與RAM連接。您的鏈接器腳本非常正確。你只能將文本和常量數據鏈接到Flash中。

請看看你的地圖文件。它一定會分配一個RAM地址給數據變量。

程序加載器代碼然後將拷貝(data_end_data_beg)字節從data_beg_src複製到data_beg。

因此,第一個數據是陣列複製到SRAM的開始。

如果您需要將數據鏈接到flash:

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

連接器將現在LINK和LOAD。數據到閃存。但如果我是你,我不會那樣做。

+0

可以看出通過'link'你的意思是訪問將在適當的RAM偏移量?因此,這裏的鏈接器假設你已經將數據複製到了指定地址的RAM中(在這種情況下是'__data_beg__')?也就是說,將'__data_beg_src__'(flash)複製到'__data_beg__'(RAM)? – sherrellbc

0

你。數據虛擬地址= 0x40000000之後

你。數據邏輯地址= 00000000

這可以用命令 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