2016-10-09 4 views
0

FreeRTOS에서 외부 512 * 16 RAM으로 STM32F417을 사용합니다. MAP 파일을 볼 때 사용 된 메모리의 주소는 여전히 내부 RAM에 있습니다. 데프 RTOS 힙 :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

OK, MAP 파일에서 extRAM 힙에있는 변수가 나열되어 있지 않음을 발견했습니다. extRAM의 힙에 변수가 있지만 내부 RAM에있는 변수/개체와 같은 방식으로 힙 주소 (0x6000000) 아래에 나열되지 않은 변수가있는 경우 RAM에 나열된 개체의 크기가 더 작다는 의미입니다.

1

힙은 런타임시 메모리를 동적으로 할당하기 위해 malloc에서 사용됩니다. 링커는 코드가 실행되기 전에 빌드 타임에 맵 파일을 만듭니다. 링커는 컴파일 타임에 정의 된 변수 만 알고 있습니다. 링커는 런타임에 힙을 사용하는 방법을 알지 못합니다. 따라서 맵 파일은 힙에서 작성 될 수있는 변수를 항목별로 나눌 수 없습니다.

.bss 및 .data 섹션의 맵 파일에 나열된 변수는 컴파일 타임에 정의되어 정적으로 할당됩니다. 힙에 표시되지 않기 때문에 힙에 나타나지 않습니다.