[MCUXpresso IDE] ヒープメモリのモニタリング方法


普段ヒープメモリってどのくらい使用されているのか、十分なのかモニターしたことってありますか?

通常は、ヒープメモリを動的にモニターできるツールってそんなに無いので、適切なヒープメモリ容量を設定することが難しいですよね?

今回は、そんなヒープメモリのモニタリング方法をMCUXpresso IDEを使って紹介したいと思います。

是非参考にしてください。

やりたいこと

やりたいことは単純です。

ヒープメモリの使用量をチェックすることです。

ここでは、FreeRTOSを使っている場合とそうでない場合で方法が異なります。

FreeRTOSを使っている場合は、MCUXpresso IDEのFreeRTOSプラグインを使用した方法で設定方法も超簡単です。

問題は、FreeRTOSを使用していない場合なんです。

ふつうは難しいのですが、ちょっとしたアイディアでチェックする方法を紹介します。

統合開発環境

NXPのマイコンは、完全無償で使用できる「MCUXpresso IDE」を使用します。

MCUXpresso IDEのダウンロード

ヒープメモリのモニタリング方法

FreeRTOSを使っている場合は超簡単!!

FreeRTOSを使用している場合は、MCUXPresso IDEのツールバーから以下のように設定するだけです。

ヒープメモリのモニタリング設定
ヒープメモリのモニタリング設定

ヒープメモリの使用量のモニタリング

ヒープメモリをモニタリングしているところ
ヒープメモリをモニタリングしているところ

どうでしょうか?簡単ですよね。

注意:このFreeRTOSのヒープメモリ管理ツールを使う場合は、FreeRTOSのヒープ管理スキーム「Heap 4」に設定する必要があります。これ以外だとモニタリングはできません。「Heap3」設定は、標準Cライブラリを使っていますので、FreeRTOSのプラグインツールは使えません。
ヒープスキームの設定
ヒープスキームの設定
豆知識:通常、ヒープメモリは、アプリケーションで使用されるメモリを動的に割り当てて使用します。例えば、有名なのは「malloc」の動的メモリ割り当てや、printf関数、sprintf関数、strcmp関数などの標準C関数などでもヒープメモリが使用されます。 RTOSを使用した場合は、特にprintf関数などは「Thread Safe」ではないため、複数のタスクからprintf関数をコールすると実行結果が保証されないしOS管理外でのメモリ使用になってしまうのであまり推奨されません。セマフォやMutexを使用した方がよいでしょう。

ですが、どうしても標準C関数を使用したりするケースがあると思いますが、その場合は「FreeRTOSのヒープメモリ管理」を使用することができません。次に紹介する方法などでヒープ容量をチェックすることができるので参考にしてください

FreeRTOSを使っていない場合

さて、次にFreeRTOSを使用していない場合、ベアメタルのケースです。または、上記のFreeRTOSConfig.hのヒープスキームの設定で「Heap4」以外を使用した場合(例:Heap 3)も同様にMCUXpressoのモニタリングツールは使用できないので、次の方法でヒープ容量をチェックできます。

この場合は先ほどと違いGUIメニューやグラフィック画面でのモニタリングツールはありません。原始的な方法でモニタリングします。

「Expression View」を使います

「Expression View」は、MCUXpressoのツールバーから、Window – Show View – Others… – Debug – Expressionsをクリックすると表示されます。

Expression表示方法
Expression表示方法
expression表示方法つづき
expression表示方法つづき

そして、表示された「Expressions」に以下の式を入力します。コピペでOKです。

使用済みサイズ:
((unsigned int)__end_of_heap)-((unsigned int)&_pvHeapStart)

空きサイズ:
((unsigned int)&_pvHeapLimit)-((unsigned int)__end_of_heap)

ヒープ合計サイズ:
(unsigned int)&_pvHeapLimit-(unsigned int)&_pvHeapStart

Expression Viewを使用したヒープモニタリング
Expression Viewを使用したヒープモニタリング

デバッグを開始してステップ実行すると、上記のようにヒープサイズをモニタリングすることが可能です。

尚、上記の変数は、リンカーファイルに配置されている変数を利用しています。

最後に

今回はヒープメモリのモニタリング方法を紹介しました。適切なメモリ容量やヒープメモリの割り当てサイズなどの決定に有効なので是非参考にしてください。