0

我在 FreeRTOS 下使用带有外部 512*16 RAM 的 STM32F417。当我看到一个 MAP 文件时,已用内存的地址仍在内部 RAM 中。RTOS 堆定义:

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

arm-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
>...

地图文件:

> .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
4

2 回答 2

1

malloc 使用堆在运行时动态分配内存。链接器在构建时创建映射文件,在您的代码运行之前。链接器只知道在编译时定义的变量。链接器不知道在运行时将如何使用堆。因此,映射文件不可能逐项列出可能在堆中创建的变量。

映射文件中 .bss 和 .data 部分中列出的变量在编译时定义并静态分配。它们不会出现在堆中,因为那不是堆的用途。

于 2016-10-10T12:32:25.843 回答
0

好的,我发现在 MAP 文件中没有列出位于 extRAM 堆中的变量。这意味着如果有变量位于 extRAM 的堆中,但未在堆地址 (0x6000000) 下列出,则 RAM 中列出的对象的大小与位于内部 RAM 中的变量/对象相同。

于 2016-10-10T09:15:36.247 回答