2016-09-06 2 views
1

私は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を使用することによって、私の元の問題を解決する方法を、知らないでは誰もが私に私が進む可能性がどのようなアドバイスを与えることができますか?

多くのおかげで、 マイケル

+0

フラグメンテーションはおそらく、リアルタイムシステムでのmallocの問題の中で最も少なくなります。デフォルトのmallocは、決定論的でも本質的にスレッドセーフでもありません。割り振りに時間がかかり、失敗する可能性があります。スレッドが割り振りまたは空きを部分的に先取りして、プリエンプト・スレッドが割り振り/解放操作を実行すると、ヒープ管理が破損し、その後のいくつかのalloc/free。あなたのCライブラリにはmutex経由のスレッドセーフティを提供するフックがあるかもしれませんが、それはリアルタイムの確定的な振る舞いにさらに影響を与える可能性があります – Clifford

答えて

2

1)のmalloc /無料の標準ライブラリのバージョンとリンクしないでください。代わりに、OSMemGet/OSMemPutへのラッパーとして機能するmalloc/freeの独自の実装を作成してください。

2)OSMemCreateで複数のメモリパーティションを作成できます。アプリケーションのために調整されたブロックサイズを保持する、小規模、中規模、および大規模なパーティションを作成し、無駄を削減します。

mallocがさまざまなメモリパーティションから適切なサイズのブロックを取得するようにするには、空き領域が適切なメモリパーティションに返るようにいくつかの魔法を考案する必要があります。 (おそらく、mallocは余分な単語を割り当て、最初の単語のメモリパーティションにポインタを格納し、ポインタが格納されている単語の後ろのアドレスを返します。その後、freeは前の単語からメモリパーティションポインタを取得します)

malloc/freeを使用する代わりに、静的に割り当てられた変数を使用するようにコードを書き直すか、OSMemGet/OSMemPutを直接呼び出すことができます。

+0

このヒントは素晴らしい;-)私はあなたの提案のように実装しました。 – michael