私はARM Cortex-M3(NXPのLCP17xx)用のコードを作成しています。私は今まで静的メモリを使用してきており、すべてがうまくいきました。動的メモリサポートを追加しようとしましたが、mallocを呼び出すと、システムが停止します。ARM Cortex-M3でのnewlibのmallocの使用
私は、裸の金属のためにgccでコンパイルしており、newlibを使用しています。バージョン:gcc-arm-none-eabi-4_6-2012q1
mallocサポートを追加するには、単純な_sbrk関数を実装し、リンカースクリプトを変更してヒープのスペースを確保しました(これについて多くのチュートリアルを読んでいます私は次に遭遇する問題をカバーしていません)。
いくつかのLEDの助けを借りて、malloc
というコードが実行されるまでコードが実行されているとは限りません。それは私の_sbrk
機能にも達しません。また、後でmalloc
への呼び出しをコードに含めると、sizeof
への呼び出しで停止することがあります。
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 = .
起動コードを適切に呼び出すと、ヒープ構造が初期化されますか? –
私は明らかに何か間違っている、問題は私が間違って何をしているのか分からないということです。メモリマップについての追加情報を追加しました。うまくいけば間違いを見つけるのに役立ちます。 –
sprintfを使用すると、非常によく似た問題が発生します。だから、それは単なるmallocの問題ではありません。それは新しいライブラリのものと関係があります。私は何を理解することはできませんが、おそらくリンクスクリプトの変更が必要です。 –