トロンフォーラム

第8回 メモリ管理機能

固定長メモリプール

固定長メモリプールは、固定サイズのメモリブロックを管理するための機能です。

メモリブロックのサイズが固定である以外は、基本的に可変長メモリプールと同じ機能です。

機能的に同じであれば、可変長メモリプールで代用すればいいようにも思えますが、固定長の場合は可変長の場合のようなメモリの断片化(フラグメンテーション)が発生しないため、メモリブロックを効率的に管理できるというメリットがあります。また、固定長メモリプールはメモリブロックのサイズを管理する必要がない分、管理領域のサイズが小さくなり、処理もわずかですが速くなります。

さらに、実際のプログラムでは、固定サイズのメモリブロックを多用するような用途がたくさんあります。

たとえば、ネットワークからの受信パケットを処理する場合やディスクのセクタを処理する場合などは固定長で十分なことがあります。また、センサーなどのちょっとした入出力デバイスと通信する場合は、固定サイズに決まったフォーマットのパケットにデータを設定して送受信することもよくあります。

当然、用途によってメモリプールのサイズは異なります。それぞれの用途に応じたサイズの固定長メモリプールを個別に用意することで、ある処理のメモリ不足が全く関係のない処理のメモリ不足を引き起こすことがないように実装することが可能となり、システムの安定性を増すことができます。

リスト2に、固定長メモリプールを利用した例を示します。

※ 以下のサンプルプログラムはこちらからダウンロードできます。

リスト2は、リスト1で空になっていた以下の関数を置き換えています。また、追加で必要となる関数や定義なども加えてあります。

  • createTranslateTask
    変換用のタスクXを生成する。
  • commandRequest
    requestコマンドを処理する。
  • commandDisplay
    displayコマンドを処理する。

リスト2では、以下の2つのコマンドが追加されます。

  • request
    タスクXに数値の変換を依頼する。
    スペースを空けて数値を指定する。
  • display
    タスクXで変換した結果を表示する。

requestコマンドでは、引数で指定された値を32ビットの二進数に変換し、変換した結果は別のコマンド(display)によって表示します。

実際に実行した際のログを図3に示します※3

図3 リスト2の実行結果

図3 リスト2の実行結果

実際に変換を行うのは別のタスクXであり、タスクXにはメッセージバッファ※4を利用して変換する値を送信します。タスクXは変換結果を固定長メモリプールから獲得したメモリブロックに設定し、変換結果を設定したメモリブロックへのポインタをメールボックス※4を利用して初期タスクに送信しています。

requestコマンドとdisplayコマンドによる一連の処理を図示すると図4のようになります。

図4 リスト2で追加した変換機能の全体構成

図4 リスト2で追加した変換機能の全体構成

リスト2のタスクXの処理であれば元のタスクで変換することも可能です。

ただし、例えば、複雑で時間のかかる処理が必要となる場合や、別のタスクからの入力などを待ってから変換する必要がある場合、他の機器との通信が必要となる場合などにはタスクを分離した方がよいことがあります。

図4のようにコマンド入力と実際の処理を分離した構成にすれば、時間のかかる処理をバックグランドで実行しながら、コンソールからの入力にも対応できるようになります。

まとめ

組込み機器では、限りある資源をいかに効率良く利用できるが開発の鍵となります。特にメモリは消費電力や製品のコストを大きく左右する資源ですので、できるだけ効率的に利用する必要があります。

T-Kernelでは、このメモリを効率良く利用するための機能として、可変長メモリプールと固定長メモリプールを提供しています。これらの機能を利用して、効率の良いメモリ管理を行うシステムを開発してください。

第7回 タスク間同期・通信機能4第9回 タスク例外


※3 図3はT-Kernel 2.0 Software Packageに含まれるエミュレータで動作させた場合の表示です。Eclipseでデバッグする場合は、コンソールの一覧()でgtermを選択したうえで、コンソールのピン留め()を利用して表示が切り替わらないように設定してください。ブレークポイントを設定していると別のコンソールに切り替わってしまいます。

※4 メッセージバッファ、メールボックスについては本連載の第4回を参照してください。

Return Top