現在CS+でRX63Nでソフトを作成しております
なにぶんRAMが128K Byteのようで、これをまだまだ先になりそうですが
SDカードやLANやUSBからファームを転送してRAM上で動作させるといいんじゃないかと
その場合ROMは大容量なのでC言語ライブラリーモージュルだけをROMにもたせることができれば
いいのじゃないかと素人考えで、そんなことは可能なんでしょうか?
RX63N で RAM 上でコードを実行した場合、ROM と比べてどの程度の効率で実行できるのか具体的な説明が『RX63N グループ、RX631 グループ ユーザーズマニュアル ハードウェア編』で見つけられなかったので、RX63N を搭載している GR-SAKURA で下記のコードを試してみましたが
gr_sketch.cpp:
/* GR-SAKURA Sketch Template V2.13 */ #include void tarai(int, int, int); byte ramtarai[0x100]; void setup() { Serial.begin(9600); memcpy(ramtarai, (const void*)tarai, sizeof(ramtarai)); } void loop() { unsigned long start; start = millis(); tarai(12, 6, 0); unsigned long romtime = millis() - start; start = millis(); ((void(*)(int, int, int))ramtarai)(12, 6, 0); unsigned long ramtime = millis() - start; Serial.print("ROM: "); Serial.print(romtime); Serial.print(", RAM: "); Serial.print(ramtime); Serial.println(); }
tarai.cpp:
int tarai(int x, int y, int z) { return (x > y) ? tarai(tarai(x - 1, y, z), tarai(y - 1, z, x), tarai(z - 1, x, y)) : y; }
実行結果:
ROM: 5019, RAM: 5513 ROM: 5019, RAM: 5514 ROM: 5018, RAM: 5514 ROM: 5018, RAM: 5514 ROM: 5018, RAM: 5514 ROM: 5018, RAM: 5515 ROM: 5018, RAM: 5514 ROM: 5018, RAM: 5514 ROM: 5018, RAM: 5514 ROM: 5019, RAM: 5513
ROM と比べて RAM 上のコードでは 1割程度の性能低下が見られました。
想像してたほどの性能低下はないなというのと、それでも RAM の方が性能が落ちてるのは命令キューの関係だろうか? という感じですが、正直よくわかりません。
> ROM と比べて RAM 上のコードでは 1割程度の性能低下、これは内蔵RAMでですよね
内蔵RAMですが、頻繁な関数呼び出しを行っており、一般的なコードではこれ程の性能低下はないと思います。
void wait(void) { for (volatile unsigned long i = 0; i < 10000000UL; i++) { ; } }
↑ のような関数呼び出しを行わない単純な時間待ちであれば ROM と 内蔵 RAM とで実行時間の差はほゞありませんでした。
> 内蔵RAMですとノーウェイトでやって もROMと比較して1割程度の性能低下であるとすれば、ビット幅も両方32ビットですし、ROMキャツシュが陰にあるのかも
キャッシュではありませんが RX63N には「8バイト ×4本の命令キュー」という仕組みがあり、ROM からの命令の命令読み出しの効率化を図っているようです。
> これが外部RAMやSDRAMになるともっと遅くなるのではないでしょうか
RX63N の命令キューは 8バイトを単位として ROM を読み出す仕組みのようですが、それに対して外部バスや SDRAM はバス幅は最大でも 32bit であり、効率の良いものではないでしょう。