ARM Cortex-M3(NXPのLCP17xx)のコードを作成しています。私はこれまで静的メモリを使用してきましたが、すべてがうまく機能しました。動的メモリのサポートを追加しようとしましたが、mallocを呼び出すと、システムがスタックします。
アームベアメタル用にgccでコンパイルし、newlibを使用しています。バージョン:gcc-arm-none-eabi-4_6-2012q1
mallocサポートを追加するために、単純な_sbrk関数を実装し、リンカースクリプトを変更して、ヒープ用のスペースを確保しました(この部分に関するさまざまなチュートリアルを読みましたが、次に発生した問題については説明していません)。
いくつかのLEDの助けを借りて、コードが呼び出されるポイントまで実行されmalloc
、その後は続行されないことを確信できます。それは私の機能にさえ到達しません_sbrk
。また、後でコードにsizeof
への呼び出しを含めると、への呼び出しでスタックします。malloc
それで、コードを呼び出すときに到達したり戻ったりmalloc
することなくスタックするという間違ったことは何ですか?_sbrk
呼び出しが含まれている場合と含まれていない場合に生成されるメモリマップをしばらく見つめた後、malloc
それはによって使用される構造に関連していると思われmalloc
ます。
これは、RAMメモリを定義するldスクリプトの一部です。
.bss :
{
_start_bss = .;
*(.bss)
*(COMMON)
_ebss = .;
. = ALIGN (8);
_end = .;
} >sram
. = ALIGN(4);
_end_bss = .;
. = ALIGN(256);
_start_heap = .;
PROVIDE( __cs3_heap_start = _start_heap)
_end_stack = 0x10008000;
次に、_end_stackが割り込みベクタテーブルに設定されます。
そして今、異なるマップの比較。コードでmallocを使用しない場合:
*(COMMON)
0x1000000c _ebss = .
0x10000010 . = ALIGN (0x8)
*fill* 0x1000000c 0x4 00
0x10000010 _end = .
0x10000010 . = ALIGN (0x4)
0x10000010 _end_bss = .
0x10000100 . = ALIGN (0x100)
0x10000100 _start_heap = .
コードでmallocを使用したメモリマップ:
*(COMMON)
COMMON 0x10000848 0x4 ...arm-none-eabi/lib/armv7-m/libc.a(lib_a-reent.o)
0x10000848 errno
0x1000084c _ebss = .
0x10000850 . = ALIGN (0x8)
*fill* 0x1000084c 0x4 00
0x10000850 _end = .
.bss.__malloc_max_total_mem
0x10000850 0x4
.bss.__malloc_max_total_mem
0x10000850 0x4 ...arm-none-eabi/lib/armv7-m/libc.a(lib_a-mallocr.o)
0x10000850 __malloc_max_total_mem
(...) It goes on (...)
0x1000085c __malloc_current_mallinfo
0x10000884 . = ALIGN (0x4)
0x10000884 _end_bss = .
0x10000900 . = ALIGN (0x100)
0x10000900 _start_heap = .