GR-PEACHでRAMディスク(Mbed::MemFileSystem)

昨日、ルネサスさんよりGR-PEACHのRev.Cボードと、GR-KURUMIを頂きました。まだ電源も入れてないですが、使うのが楽しみです。

さて、mbedにはFATFileSystemというライブラリがあって、この中にMemFileSystemというクラスがあります。GR-PEACHはRAMが10Mもあるので、RAMディスクみたいに使えたら便利だと思いましたが、このMemFileSystemがぐぐっても使い方がよくわからないので、実際に使ってみました。

ちなみに、mbedのFATFileSystemライブラリは乱立(?)していて、どれも違いがよくわからないのですが、GR-PEACHでは、mbed officialのSDFileSystemがサポートされているということで、これに含まれているFATFileSystemを使うことにします。

MemFileSystem.h をインクルードすると、FATFileSystem の仮想関数と整合性がとれていないので、コンパイルエラーになったので修正しています。これさえ修正すれば、FATの下位レイヤインタフェースは実装されてるのでそのまま動きます。注意点は、RAM上にファイルシステム構築するために、下のように、format()を呼ぶ必要があることくらいです。

#include "MemFileSystem.h"

int main(void)
{
  MemFileSystem ramfs("ram");

  ramfs.format();

  FILE *fp = fopen("/ram/test.txt", "w");
  //ファイル操作
  fclose(fp);
}

しかしながら、MemFileSystemは電源切ったらそれっきりなので、このままではテンポラリファイルにしか使えません。なので、MemFileSystemのFATをSDFileSystemのファイルにダンプ/ロードすることで、永続化できるようにしました。SDFileSystemが使えるなら、はじめからそっちに読み書きすれば良いと言われるかもしれませんが、SDFileSystem と MemFileSystem で速度比較もしてみたところ、下の実行結果(100kbyteの書き込み)では、MemFileSystemが50倍速い結果になったので、使いどころはありそうです。

Mem: Writing ... [OK]
Mem: Reading data ... [OK]
Dump from MemFs to SDFs ... [OK]
Load from SDFs to MemFs ... [OK]
Mem: Reading data ... [OK]
Mem: Writing 10 times ...[OK] avg = 87980usec
SD: Writing 10 times ...[OK] avg = 4584465usec

ダンプ、ロードの使い方は、下のような感じです。
素のFATFileSystemでは、ボリューム数が1つまでになっていて、SDFileSystemと、MemFileSystemを同時に開くことができなかったので、ボリューム数上限も2つに変更してます。

#include "SDFileSystem.h"
#include "MemFileSystem.h"

SDFileSystem sd(P8_5, P8_6, P8_3, P8_4, "sd");

void dump()
{
  MemFileSystem *ramfs = new MemFileSystem("ram");

  ramfs->format();
  FILE *fp = fopen("/ram/test.txt", "w");
  //ファイル操作
  fclose(fp);

  //ここでダンプしたFATを
  FILE *dumpfp = fopen("/sd/fatdump", "w");
  ramfs->dump(dumpfp);
  fclose(dumpfp);

  delete ramfs;
}

void load()
{
  MemFileSystem *ramfs = new MemFileSystem("ram");

  //ここでロードする
  FILE *dumpfp = fopen("/sd/fatdump", "r");
  ramfs->load(dumpfp);
  fclose(dumpfp);

  FILE *fp = fopen("/ram/test.txt", "w");
  //ファイル操作
  fclose(fp);
  
  delete ramfs;
}

int main(void)
{
  dump();
  load();
}


今回テストで作ったプログラムと、拡張したSDFileSystemはこちらです。

MemFilesystem_test - a mercurial repository | mbed
SDFileSystem - a mercurial repository | mbed