2016-10-09 140 views
0

我在FreeRTOS下使用帶外部512 * 16 RAM的STM32F417。當我看到一個MAP文件時,已用內存的地址仍在內部RAM中。 RTOS堆DEF: STM32 ExtRAM GCC-MAP文件

> static unsigned char ucHeap[ 60*1024 ]__attribute__ > ((section(".ExRam"))); 

臂GCC-link.ld文件

> rom (rx) : ORIGIN = 0x08000000, LENGTH = 0x00100000 
> ram (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00020000 
>ram2 (rwx) : ORIGIN = 0x60000000, LENGTH = 0x00100000 
>... 
>ExRam (NOLOAD): {  *(.ExRam.) } > ram2 
>... 

MAP文件:

> .ExRam 0x60000000  0xf000 
>*(.ExRam.) 
>.ExRam  0x60000000  0xf000 ..\obj\heap_4.o 
> 
> .ARM.extab *(.ARM.extab * .gnu.linkonce.armextab.*) 
>   0x6000f000    __exidx_start = . 

變量,爲什麼不能在0x6000000區域?:

>.bss   0x200053ac  0x2c ..\obj\tcp_in.o 
>.bss   0x200053d8  0x4 ..\obj\raw.o 
>.bss   0x200053dc  0x10 ..\obj\ip_addr.o 
>.bss   0x200053ec  0x100 ..\obj\ssl_ciphersuites.o 
>.bss   0x200054ec  0x678 ..\obj\dns.o 
>.bss   0x20005b64  0x8 ..\obj\lwip_timers.o 

回答

0

行, 我發現在MAP文件中沒有列出位於extRAM堆中的變量。這意味着,如果在extRAM的堆中有變量,但是在堆地址(0x6000000)下列出的變量與位於內部RAM中的變量/對象相同,則RAM中列出的對象的大小較小。

1

malloc使用堆在運行時動態分配內存。在代碼運行之前,鏈接器會在構建時創建映射文件。鏈接器只知道在編譯時定義的變量。鏈接器不知道如何在運行時使用堆。因此映射文件不可能逐項列出可能在堆中創建的變量。

在.bss和.data段映射文件中列出的變量是在編譯時定義的,並且是靜態分配的。它們不會出現在堆中,因爲這不是堆。