私はuCOS-IIIで使用するCライブラリを開発中です。 CPUはARM Cortex M4 SAM4Cです。図書館内では、ここでは特に関係のないサードパーティ製の製品Xを使用したいと考えています。 Xのソースコードは完全に利用可能で、問題なくコンパイルできます。uCOS-IIIでのメモリ割り当て
Xでは、calloc()とfree()を使用して、多くのメモリ割り当てが実行されます。 問題は、メモリの断片化のために、mallocの明示的な使用が組込みシステムには適していないことです。 OSMemCreate/OSMemGet/OSMemPutは、静的に割り当てられたメモリブロックからメモリのチャンクを割り当てたり解放したりするために使用されます。
質問-1:
malloc関数の「標準実装」を回避する一般的なアドバイスは何ですか?私は、固定メモリプールへのアクセスを持っている私は、(例えば、特殊なタスク専用)、malloc関数のようなものを好むだろう
質問-2:
がどのようにOSMemCreateは()を正しく使用する必要がありますか?私はまず、特定のブロックサイズのメモリパーティションを初期化する必要があります。要求されるメモリの量は、4バイトと約800バイトの間です。私は要求に応じてブロックを得ることができますが、固定サイズです。ブロックサイズ= 4の場合、ブロックはメモリ内で連続していないので、16バイトを割り当てることはできません。ブロックサイズ= 800で4バイトしか必要ない場合は、ほとんどのブロックが未使用のままになり、すぐにブロックが使い果たされます。だから私は
... OSMemCreateを使用することによって、私の元の問題を解決する方法を、知らないでは誰もが私に私が進む可能性がどのようなアドバイスを与えることができますか?
多くのおかげで、 マイケル
フラグメンテーションはおそらく、リアルタイムシステムでのmallocの問題の中で最も少なくなります。デフォルトのmallocは、決定論的でも本質的にスレッドセーフでもありません。割り振りに時間がかかり、失敗する可能性があります。スレッドが割り振りまたは空きを部分的に先取りして、プリエンプト・スレッドが割り振り/解放操作を実行すると、ヒープ管理が破損し、その後のいくつかのalloc/free。あなたのCライブラリにはmutex経由のスレッドセーフティを提供するフックがあるかもしれませんが、それはリアルタイムの確定的な振る舞いにさらに影響を与える可能性があります – Clifford