C言語ライブラリーモージュルだけをROMにするのは可能でしょうか?

現在CS+でRX63Nでソフトを作成しております

なにぶんRAMが128K Byteのようで、これをまだまだ先になりそうですが

SDカードやLANやUSBからファームを転送してRAM上で動作させるといいんじゃないかと

その場合ROMは大容量なのでC言語ライブラリーモージュルだけをROMにもたせることができれば

いいのじゃないかと素人考えで、そんなことは可能なんでしょうか?

Parents
  • 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 nozomuさん
    実際にやってみられましたか、ROM と比べて RAM 上のコードでは 1割程度の性能低下、これは内蔵RAMでですよね、これが外部RAMやSDRAMになるともっと遅くなるのではないでしょうか、内蔵RAMですとノーウェイトでやって もROMと比較して1割程度の性能低下であるとすれば、ビット幅も両方32ビットですし、ROMキャツシュが陰にあるのかも、リリース品はROMで出荷するのが理想的ですよね、ただ昨今バグ発覚で現地に赴いてノートパソコン接続して書き変えなんて数が多いとやってられませんから、インターネットに接続されていれば、ファイルシステムで動作していれば、ファイルをおきかえるだけでいいので、最近ルネサスさんもイーサーネット経由でROMをプログラムできるようなサンプルも用意されているようで、ここまで便利になったところで、これからはハッカーに壊されないようにセキリュテイ向上の努力でしょうか。
Reply
  • fujita nozomuさん
    実際にやってみられましたか、ROM と比べて RAM 上のコードでは 1割程度の性能低下、これは内蔵RAMでですよね、これが外部RAMやSDRAMになるともっと遅くなるのではないでしょうか、内蔵RAMですとノーウェイトでやって もROMと比較して1割程度の性能低下であるとすれば、ビット幅も両方32ビットですし、ROMキャツシュが陰にあるのかも、リリース品はROMで出荷するのが理想的ですよね、ただ昨今バグ発覚で現地に赴いてノートパソコン接続して書き変えなんて数が多いとやってられませんから、インターネットに接続されていれば、ファイルシステムで動作していれば、ファイルをおきかえるだけでいいので、最近ルネサスさんもイーサーネット経由でROMをプログラムできるようなサンプルも用意されているようで、ここまで便利になったところで、これからはハッカーに壊されないようにセキリュテイ向上の努力でしょうか。
Children
  • > 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 であり、効率の良いものではないでしょう。

  • fujita nozomuさん
    「単純な時間待ちであれば ROM と 内蔵 RAM とで実行時間の差はほゞありません」大体想像の範囲でしたね、CPU内部の配線と外部のプリント配線では特性が違いますし、バスバッファーのデータが安定するまでのWAITが必要になりますしSDRAMならリフレッシュ期間で遅くなりますよね、でも実際に調べたみたのがすごい。