モダンOSのお砂場(84)STM32 NucleoでMbed OS6、RAM使用量の取得

Joseph Halfmoon

別シリーズ「やっつけな日常」第69回でMbed OS6に「流れ着き」ました。久しぶりにKeil Studio Cloudを開いたところ、いろいろ改良進んでいるみたいです。ただしビルド後の表示ではRAMは全量OSが使っているような表示で「実際どのくらい使っているのか?」が分かりませんでした。今回はAPIに聞いてみます。

※「モダンOSのお砂場」投稿順Indexはこちら

※Arm社のWeb開発環境(無料)、Arm Keil Studio Cloud 上でArm社のRTOS、Arm Mbed OS6 を使って実験してます。ターゲット機はST Microelectronis製STM32F401RE搭載、NUCLEO-F401REボードです。

Keil Studio Cloud上でのメモリ使用量表示

約1年数か月前のことになりますが、ずっとお世話になっていた Arm Mbed Online Compiler の終了と後継の Keil Studio Cloudへの移行の時期でした。当時、Keil Studio Cloudに慣れるためにいろいろやってみたのですが、不満点がいくつかありました。その一つがビルド後のメモリ使用量がどこにも見当たらない、という点です。旧Online Compilerが、FlashとRAMの使用量を美麗な棒グラフで表示してくれていたのに比べると「イマイチ」と感じました。

それより1年以上の時間が経過し、Keil Studio Cloudも、Mbed OSもいろいろ改良が進んだみたいです。その一端が、ビルド後出力の末尾に現れてました。BuildResults

メモリの使用量が表示されてますな。Flash(ROM)が総量512KB中36KB使用だと。まだまだ余裕ね。でもMemory(SRAM)をみると搭載の96KB全て使用という主張です。これは「RAMの全量をOSが管理しているからね」ということでしょう。多分OSにお願いすればアロケートしてくれるメモリは存在するハズ。

実際にどこまでSRAM使っているのか不明。プログラムを開発しているときに残り容量を知るにはどうしたら良いの?

立派なRTOSであるMbed OS6に当然ながら抜かりは有りませぬ。各種ステータスを取得するためのAPIも充実しとります。そいつらを必要に応じて呼んでやれば情報が得られます。

ステータス取得の準備

さて、メモリ情報などOSのステータス情報を得るためのAPIについては以下のページに記述があります。

Mbed statistics

上記に記されているAPIを呼び出してやれば即情報取得、と思いきや、そのままではダメです(実際に以下の準備を飛ばしてビルドするとオブジェクトは作成可能でしたが、走らせるとオール0が返ってきます。意味なしだなオイ。)

コンフィギュレーション・オプション

というものを設定してやらないとなりません。これはリソースの限られたRTOSゆえに取り込む機能は必要最小限にする、ための仕組みだと思います。オプショナルな機能は明示的に使用する方にスイッチを設定しないと取り込まれないようです。

そのようなスイッチ類は、各種パス内に json形式の mbed_lib.json という名のファイル中で定義されているようです。ただし、ユーザーコード側でそれらファイルをいじってしまうと何がどうなるのか制御しきれなくなるので、

ルートフォルダの中にある、mbed_app.json

という名のファイルにオプションを記すのがお作法みたいです。(ちなみにFreeRTOSでは、FreeRTOSConfig.hというファイルがビルドツリーの中にある筈なのでそれで似たような機能のON/OFFが行えます。)

別シリーズで作成したプロジェクトの場合、mbed_app.jsonは存在しなかったので、自前で New file して作成しました。こんな感じ。mbed_app_json

mbed_app.jsonの中の設定は以下です。mbed_app_jsonSRC

なお上記の設定は、さきほどの「Mbed statistics」ページに書かれている、ステータス関係のAPIを全部イネーブルにするゴージャス(無駄にリソース食う)なスイッチです。通常は必要なスイッチだけ enable にするべきかと。

これでAPIが使えるようになったので、上記ページのExampleの一部をコピペして以前のmain.cpp ソースの一部を以下のように書き変えました。memStat

なお、Exampleのソースは %ld でフォーマット指定されていて、Keil Studio Cloud上でビルドするとウォーニングがぼろぼろ出ます。本当の問題を見逃しそうなので勝手に %u に変えました。

実機上での動作確認

NUCLEO F401REに書き込み、Keil Studio Cloud「内蔵」のシリアル・モニタで見たところが以下に。memINFO

OS管理下のヒープが88068バイトも握っているけど、実際に使われているのはごくわずかね。余裕のよっちゃん、古い。

しかし、何も宣言しないのに printf(デフォルトでUSBシリアルに向いている。ボーレートは9600)が使えたり、シリアル・モニタが開いたりとKeil Studio Cloud、何気に大分進歩してないかい? まあ、折角なので使ってみるってもんか。

モダンOSのお砂場(83)UNO R4でFreeRTOS、Renesas RA4M1の基礎知識 へ戻る

モダンOSのお砂場(85) NucleoでArduinoからMbed OS6、デジタルIO へ進む