現在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 の方が性能が落ちてるのは命令キューの関係だろうか? という感じですが、正直よくわかりません。
fujitaさんの調査結果はとても興味深いですね。
RX631なら内蔵RAM/ROMのアクセス時間は同じなのでどちらで実行しても変わらないと思ってましたが、RAMの方が遅くなるんですね。
これはCPUの命令・オペランドバスがRAMのアクセス権を取り合うためだと考えられます。
fujitaさんの2件目のテストプログラムではオペランドのアクセスが無いので、実行時間に差が出ないのでしょう。
この辺りの動作については、ハードウェアマニュアルの16.2.1 CPUバスに説明があります。
アクセス先が異なれば同時動作出来るのでプログラムがROMに、データがRAMにあるケースなら同時アクセスで速くなるという事ですね。
キャッシュの存在を考察されていますが、RXには一般的なキャッシュは無いので影響はないですね。
また、命令キューはCPUコアの中にあるのでプログラムがROM・RAMのどこにあっても命令は同じように先読みされます。