メモリ管理モジュールの使い方


FreeRTOSのメモリ管理方法は下記のように3通りの方法で管理されるように
なっていて、使用するPICの機能やRAMサイズから適切なものを3通りの中から
選択できます。

1.RAMエリアを固定的に割り付けて変更しない方法
                           (Heap_1.c)

2.ダイナミックにRAMエリアを変更しながら使う方法で
  FreeRTOSのメモリ管理関数を使う方法 (Heap_2.c)

3.ダイナミックにRAMエリアを変更しながら使う方法で
  C標準のmalloc()とfree()関数を使う方法 (Heap_3.c)

【方法1 (Heap_1.c)】

最も基本的なメモリ管理方法で、固定的にメモリエリアを割り付け
変更しない方法です。通常の組み込みシステムはタスクなどを
ダイナミックに生成したり削除したりすることはほとんど無いので
この方法が最もよく使われます。

FreeRTOSが使うRAMエリアは、FreeRTOSのFreeRTOSconfig.hファイル
内でヒープ領域として確保した領域となります。
これの最大サイズを「FreeRTOSConfig.h」ファイル内の
configTOTAL_HEAP_SIZE」で定義しておきます。ここでの指定は
ワード単位ですので、PIC32MXの場合は、バイト単位となります。

RAMを消費する主なものは下記となりますが、そのほかにダイナミックに
変数として使用されるものもありますので、正確なスタック使用サイズを
求めるのは結構難しくなります。
したがってxTaskCreate()関数でタスクのスタックサイズを指定する場合
には、十分の余裕を持って作成する必要があります。

@ TCB   :タスクごとに数10バイト消費(タスク名などの長さに依存)
A タスクごとのスタック :各タスク生成時に指定したスタックサイズ
B キュー  :指定したサイズ+数バイト
C セマフォ :数バイト

【方法2 (Heap_2.c)】

方法2は、タスクを動的に削除、生成を繰り返すようなアプリケーションで
のみ使われる方法です。
方法1と同じような単純な配列データとしてRAMを確保しますが、動的
再配置の関数(pvPortMalloc())を使って、タスクが削除されたときは
RAMをフリーとして開放し、別のタスクが生成されたとき、その領域を
再使用するようにします。
RAMを5、25、100バイトの単位で管理し開放、使用を実行します。
ただし空き領域の再整理は行わないので、フラグメンテーションの
問題は起きません。

【方法3 (Heap_3.c)】

標準C関数のmalloc()とfree()関数を使ってアプリで変数領域を確保する
方法ですが、通常は使いません。
この関数を使う場合には、いったん全タスクをvTaskSuspendAll()で休止
させ、領域を確保、開放してから、xTaskResumeAll()で再起動する必要
があります。




目次に戻る