パーティーには少し遅れましたが、最近見つけてテストした組み込みシステム用の非常に効率的なメモリ アロケータを共有したいと思います: https://github.com/dimonomid/umm_malloc
これは、ARM7 で動作するように特別に設計されたメモリ管理ライブラリです。個人的には PIC32 デバイスで使用していますが、16 ビットおよび 8 ビット デバイスで動作するはずです (16 ビット PIC24 でテストする計画がありますが、私はまだテストしていません)
デフォルトのアロケータを使用した場合、断片化にひどく打ちのめされました。私のプロジェクトでは、数バイトから数百バイトまでさまざまなサイズのブロックが割り当てられることが多く、「メモリ不足」エラーに直面することもありました。私の PIC32 デバイスには合計 32K の RAM があり、8192 バイトがヒープに使用されています。特定の瞬間に 5K を超える空きメモリがありますが、フラグメンテーションのために、デフォルトのアロケータには、断片化されていない最大メモリ ブロックが約 700 バイトしかありません。これは残念なので、より効率的な解決策を探すことにしました。
私はすでにいくつかのアロケーターを認識していましたが、それらすべてにいくつかの制限があるか (ブロックサイズは 2 のべき乗である必要があり、2 からではなく、たとえば 128 バイトから開始するなど)、または単にバグがありました。以前は毎回、デフォルトのアロケータに戻さなければなりませんでした。
しかし、今回は幸運です。これを見つけました: http://hempeldesigngroup.com/embedded/stories/memorymanager/
このメモリ アロケータを試してみたところ、空きメモリが 5K の場合とまったく同じ状況で、3800 バイトを超えるブロックがありました。私には信じられないほど (700 バイトと比較して)、ハードテストを実行しました。デバイスは 30 時間以上も重く動作しました。メモリ リークはなく、すべて正常に動作します。また、FreeRTOS リポジトリでこのアロケータを見つけました: http://svnmios.midibox.org/listing.php?repname=svn.mios32&path=%2Ftrunk%2FFreeRTOS%2FSource%2Fportable%2FMemMang%2F&rev=1041&peg=1041#、およびこれ事実は、umm_malloc の安定性の追加の証拠です。だから私は完全にumm_mallocに切り替えました。私はそれにとても満足しています。
少し変更する必要がありました。マクロ UMM_TEST_MAIN が定義されていない場合、構成に少しバグがあったため、github リポジトリを作成しました (リンクはこの投稿の上部にあります)。現在、ユーザー依存の構成は別のファイル umm_malloc_cfg.h に保存されています。
このアロケータに適用されているアルゴリズムについてはまだ深く理解していませんが、アルゴリズムについて非常に詳細に説明されているので、興味のある人は誰でもファイル umm_malloc.c の先頭を見ることができます。少なくとも、「ビニング」アプローチは、断片化の少ないことに大きな利益をもたらすはずです: http://g.oswego.edu/dl/html/malloc.html
マイクロコントローラ用の効率的なメモリ アロケータが必要な人は、少なくともこれを試してみるべきだと思います。