2016-01-07 55 views
2

我必須將數組放在內存中的特定地址處。我正在使用GCC。在特定地址放置變量會生成大的二進制文件

我聲明這樣的變量:

uint8_t __attribute__((section (".mySection"))) buffer[1234]; 

而且在鏈接腳本我有:

MEMORY 
{ 
FLASH (rx)  : ORIGIN = 0x08000000, LENGTH = 1024K 
RAM (xrw)  : ORIGIN = 0x20000000, LENGTH = 145K 
MYSEC (x)  : ORIGIN = 0x20025000, LENGTH = 155K 
} 

及更高版本:

.mySection : 
{ 
    *(.mySection); 
} > MYSEC 

這是當然的代碼爲嵌入式系統(臂)。通常我的程序需要22 KB,這個修改需要384 MB(!)。

我不明白爲什麼。如果我刪除__attribute__,則需要22 KB。 我錯過了什麼?使用


代碼:

#inculde (...) 

uint8_t __attribute__((section (".mySection"))) buffer = 5; 

int main(void){ 
    buffer = 10; 
} 

全部鏈接腳本(默認情況下,不是我寫的,部分被縮短:

/* Entry Point */ 
ENTRY(Reset_Handler) 

/* Highest address of the user mode stack */ 
_estack = 0x20050000; /* end of RAM */ 
/* Generate a link error if heap and stack don't fit into RAM */ 
_Min_Heap_Size = 0x200;  /* required amount of heap */ 
_Min_Stack_Size = 0x400; /* required amount of stack */ 

/* Specify the memory areas */ 
MEMORY 
{ 
FLASH (rx)  : ORIGIN = 0x08000000, LENGTH = 1024K 
RAM (xrw)  : ORIGIN = 0x20000000, LENGTH = 145K 
MYSEC (x)  : ORIGIN = 0x20025000, LENGTH = 155K 
} 

/* Define output sections */ 
SECTIONS 
{ 
    /* The startup code goes first into FLASH */ 
    .isr_vector : 
    { 
    (...) 
    } >FLASH 

    /* The program code and other data goes into FLASH */ 
    .text : 
    { 
    (...) 
    } >FLASH 

    /* Constant data goes into FLASH */ 
    .rodata : 
    { 
    (...) 
    } >FLASH 

    .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH 
    .ARM : { 
    (...) 
    } >FLASH 

    .preinit_array  : 
    { 
    (...) 
    } >FLASH 
    .init_array : 
    { 
    (...) 
    } >FLASH 
    .fini_array : 
    { 
    (...) 
    } >FLASH 

    /* used by the startup to initialize data */ 
    _sidata = LOADADDR(.data); 

    /* Initialized data sections goes into RAM, load LMA copy after code */ 
    .data : 
    { 
    (...) 
    } >RAM AT> FLASH 



    .mySection : 
    { 
    *(.mySection); 
    } > MYSEC 


    /* Uninitialized data section */ 
    . = ALIGN(4); 
    .bss : 
    { 
    (...) 
    } >RAM 

    /* User_heap_stack section, used to check that there is enough RAM left */ 
    ._user_heap_stack : 
    { 
    (...) 
    } >RAM 

    /* Remove information from the standard libraries */ 
    /DISCARD/ : 
    { 
    (...) 
    } 

    .ARM.attributes 0 : { *(.ARM.attributes) } 
} 
+4

您的384M非常接近從鏈接描述文件內存佈局的最低地址到最高地址的區域大小。因此,我傾向於猜測,鏈接器正在輸出一個包含整個空間的圖像。至少在什麼都分配給最頂層和最底層的時候。 –

+0

'MYSEC'是否包含任何初始化數據? – user3386109

+0

@ user3386109是的。在「緩衝區」上有一些賦值操作,所以MYSEC已經初始化變量(緩衝區)。 – zupazt3

回答

0

我假設你的輸出文件是一個純粹的二進制格式,而不是一個ELF,所以你沒有ELF的引導程序,在這種情況下,將初始化的數據放在高位地址顯然會創建一個大的輸出文件,這是因爲在二進制格式中你沒有任何機制來提供特定的地址,所以文件被映射爲1:1進入記憶。這意味着整個地址空間直到您的自定義初始化變量需要包含在輸出文件中。 這與.data部分的情況相同,這就是爲什麼.data部分在啓動時明確從Flash複製到RAM區域的原因。

p.s.你可以找到my article有幫助(這個問題在那裏描述)。

相關問題