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

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
4

2 に答える 2

1

ヒープは、実行時にメモリを動的に割り当てるために malloc によって使用されます。リンカーは、コードが実行される前のビルド時にマップ ファイルを作成します。リンカーは、コンパイル時に定義された変数についてのみ認識します。リンカーは、実行時にヒープがどのように使用されるかを認識していません。したがって、マップ ファイルは、ヒープで作成される可能性のある変数を項目化できない可能性があります。

マップ ファイルの .bss および .data セクションにリストされている変数は、コンパイル時に定義され、静的に割り当てられます。ヒープの目的ではないため、ヒープには表示されません。

于 2016-10-10T12:32:25.843 に答える
0

OK、MAP ファイルに、extRAM ヒープにある変数がリストされていないことがわかりました。これは、変数が extRAM のヒープに配置されているが、内部 RAM に配置されている変数/オブジェクトと同じようにヒープ アドレス (0x6000000) の下にリストされていない場合、RAM にリストされているオブジェクトのサイズが小さいことを意味します。

于 2016-10-10T09:15:36.247 に答える