2016-10-09 139 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段映射文件中列出的变量是在编译时定义的,并且是静态分配的。它们不会出现在堆中,因为这不是堆。