[英]STM32 ExtRAM GCC-MAP file
我在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
>...
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
malloc使用堆在运行时动态分配内存。 链接器在代码运行之前在构建时创建映射文件。 链接器仅知道在编译时定义的变量。 链接器不知道如何在运行时使用堆。 因此,映射文件可能无法逐项列出可能在堆中创建的变量。
在.bss和.data节的映射文件中列出的变量是在编译时定义并静态分配的。 它们不会出现在堆中,因为那不是堆的用途。
好的,我发现在MAP文件中没有列出位于extRAM堆中的变量。 这意味着,如果extRAM中的堆中有变量,但未在堆地址(0x6000000)下列出,则RAM中列出的对象的大小会减小,就像内部RAM中的变量/对象一样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.