Файл STM32 ExtRAM GCC-MAP
Я использую STM32F417 с внешней 512*16 RAM под FreeRTOS. Когда я вижу файл MAP, адрес используемой памяти все еще находится во внутренней памяти. RTOS Heap def:
> 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
2 ответа
Куча используется malloc для динамического выделения памяти во время выполнения. Компоновщик создает файл карты во время сборки, прежде чем ваш код будет запущен. Компоновщик знает только о переменных, которые определены во время компиляции. Компоновщик не знает, как будет использоваться куча во время выполнения. Поэтому файл карты не может перечислять переменные, которые могут быть созданы в куче.
Переменные, перечисленные в файле карты в разделах.bss и.data, определяются во время компиляции и распределяются статически. Они не появляются в куче, потому что это не то, для чего куча.
ОК, я обнаружил, что в файле MAP нет перечисленных переменных, расположенных в куче extRAM. Это означает, что объекты, перечисленные в ОЗУ, имеют меньший размер, если в extRAM есть переменные, расположенные в куче, но не перечислены в адресе кучи (0x6000000) так же, как переменные / объект, находящийся во внутренней ОЗУ.