2

RenesasのRX62NでMicriumのμC/OS-III RTOSを使用しています。

データを動的に割り当てて解放する必要があるシステムを構築しました。関数malloc()およびfree()が RTOS でうまく機能しないことがわかりました。ただし、RTOS にはこのためのカスタム関数があります。Mem_HeapAlloc ()関数。この関数は、RTOS で作成された'heap' の一部のメモリを割り当てます。問題は、おそらくすべてがヒーププールに入るために、無料の機能がないことです。

RTOSではプールを作ることも可能です。このプールの問題は、含まれているすべてのブロックが同じサイズである必要があることです。さまざまなサイズを割り当てて解放しているため、これは良い解決策ではありません。

メモリ RTOS 機能について説明しているドキュメントを見つけました。ここでは、 第 4 章で機能について説明しています。

この問題を解決する方法を知っている人はいますか?

私たちがすでに持っていたいくつかの解決策

  • すべてのブロック サイズを最大の割り当てと同じにします。 最小割り当てと最大割り当てが大きく異なるため、多くのオーバーヘッドがあります。
  • フリーはしないでください。 これは解決策ではありません。メモリ リークが発生します。

誰かが私たちを助けてくれることを願っています。何か不明な点があれば、私に聞いてください

前もって感謝します

4

1 に答える 1

2
  • you can allocate your objects in multiples of block sizes.

まだ内部の断片化が発生しているため、使用可能なスペースを十分に活用できません。

あなたはまだメモリプールを使用して次の利点があります

  • メモリプールを使用すると、一定の実行時間(断片化なし)でメモリを割り当てることができます。プール内の数千のオブジェクトのメモリ解放は1つの操作であり、mallocを使用して各オブジェクトにメモリを割り当てる場合は1つずつではありません。

  • メモリプールは階層ツリー構造にグループ化できます。これは、ループや再帰などの特別なプログラミング構造に適しています。

  • 固定サイズのブロックメモリプールは、割り当てられたブロックのサイズなどの特性を記述した、割り当てごとの割り当てメタデータを格納する必要はありません。特に小さな割り当ての場合、これにより大幅なスペースの節約になります。

于 2012-05-23T10:09:12.193 に答える