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) }
}
您的384M非常接近從鏈接描述文件內存佈局的最低地址到最高地址的區域大小。因此,我傾向於猜測,鏈接器正在輸出一個包含整個空間的圖像。至少在什麼都分配給最頂層和最底層的時候。 –
'MYSEC'是否包含任何初始化數據? – user3386109
@ user3386109是的。在「緩衝區」上有一些賦值操作,所以MYSEC已經初始化變量(緩衝區)。 – zupazt3