スポンサーサイトクラスのメンバをROMとRAMに分離する

Home > ----- / スポンサー広告 > This Entry 2009-05 / 実装技術 > This Entry [com : 0][Tb : 0]

--------

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2009-05-27

TECSの仕様を検討している際に何度か話題に上がったのですが、クラス(というか構造体)のメンバのうち、一部をROMに、残りをRAMに配置する方法がないものでしょうか? 今回はこれについて考えてみます。

C++には、メンバの一部をROMに、残りをRAMに配置するための直接的なシンタックスはありません。これはCの場合でも同じです。これを実現するには、通常次のようにしなければなりません。
struct rom_part
{
  ...
};

struct ram_part
{
  rom_part const* p_rom;
  ...
};

static rom_part const rom = { ... };
ram_part ram = { &rom, ... };

あるいは、
struct ram_part
{
  ...
};

struct rom_part
{
  ram_part const* p_ram;
  ...
};

static ram_part ram;
rom_part const rom = { &ram, ... };

のようにすることもできます。一般的には、ROMよりもRAMの方が高速ですので、前者の方が好まれますが、十分使いやすくなるのであれば、後者でもよいかもしれません。ただ、後者の場合、ROMに配置するクラスには明示的なコンストラクタやデストラクタを定義できませんので、使い勝手がよくなる可能性はそれほど高くありません。

ということで、今回は前者を中心に考えていくことにします。

本格的に考えていく前に、あらかじめ確認しておくべきことがあります。ROMに配置可能なクラスは、C互換構造体またはC互換共用体だけだということです。これらは、大雑把にいって、C言語と同様のシンプルな構造体や共用体のことです。いかにもC++らしいクラスは、いずれにしてもROMに配置することができません。

ROMに配置するデータは、何らかの形で初期値を与える必要があります。C互換型の場合はコンストラクタで初期値を与えることはできませんから、初期化子として指定するしかなくなります。しかし、何とかしてコンストラクタで値を指定したいものです。

方法があるとすれば、次のようなものぐらいでしょうか?
struct rom_part_value
{
  int a;
  int b;
  int c;
};

template <int A, int B, int C>
struct rom_part
{
  static rom_part_value value;
};

template <int A, int B, int C>
rom_part_value const rom_part<A, B, C>::value = { A, B, C };

class ram_part
{
  rom_part const* rom_;
  int x_;
public:
  template <int A, int B, int C>
  ram_part(int x, const ram_part<A, B, C>& r)
    : rom_(&r.value), x_(x) {}
  ...
}

難としては、この方法では汎整数型の値しかROMに配置できないということです。もう一工夫、ふた工夫しないと、なかなか実用にはなりそうにありません。

Comment

Post a Comment









管理者にだけ表示を許可

Trackback

http://cppemb.blog17.fc2.com/tb.php/120-bd3db6fb

C++と組み込み環境 | Page Top▲

New >>
一ヶ月はあっという間
<< old
C++で書いたHello, World!はなぜデカいか?
ブログ内検索
RSSフィード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。