FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

RISC-VのSpike-ISSを使ったFreeRTOSの起動ルーティンの解析(3)

f:id:msyksphinz:20170201002310j:plain

前回の続きで、ROMにはさらにいくつかの情報を挿入しなければならない。0x1020から挿入しなければならないのが、以下のRISC-Vのコンフィグレーションに関する情報だ。

前回の記事で紹介した以下のものになる。

platform {
  vendor ucb;
  arch spike;
};
rtc {
  addr 0x40000000;
};
ram {
  0 {
    addr 0x80000000;
    size 0xaef00000;
  };
};
core {
  0 {
    0 {
      isa rv64imafdc;
      timecmp 0x40000008;
      ipi 0x40001000;
    };
  };
};

これをまずは文字列として定義し、それをROMの初期値としてコピーする。

github.com

  std::stringstream s;
  s << std::hex <<
      "platform {\n" \
      "  vendor ucb;\n" \
      "  arch spike;\n" \
      "};\n" \
      "rtc {\n" \
      "  addr 0x40000000;\n" \
      "};\n" \
      "ram {\n" \
      "  0 {\n" \
      "    addr 0x80000000;\n" \
      "    size 0xaef00000;\n" \
      "  };\n" \
      "};\n" \
      "core {\n" \
      "  0 {\n" \
      "    0 {\n" \
      "      isa rv64ima;\n" \
      "      timecmp 0x40000008;\n" \
      "      ipi 0x40001000;\n" \
      "    };\n" \
      "  };\n" \
      "};\n";

  std::string config_string = s.str();
  memcpy (&m_memory[0x20], config_string.c_str(), config_string.size());

最後にmemcpyをして、ROMの当該位置に値を挿入した。

結構やっつけだが、これでROMについては完成。

さらにSpike-ISSとの不一致部分について調査していたのだが、ここから先はタイマ割り込みに入ってしまった。。。さてどうやって実現しようか。