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

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

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

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

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

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

  • fujitaさんの調査結果はとても興味深いですね。

    RX631なら内蔵RAM/ROMのアクセス時間は同じなのでどちらで実行しても変わらないと思ってましたが、RAMの方が遅くなるんですね。

    これはCPUの命令・オペランドバスがRAMのアクセス権を取り合うためだと考えられます。

    fujitaさんの2件目のテストプログラムではオペランドのアクセスが無いので、実行時間に差が出ないのでしょう。

    この辺りの動作については、ハードウェアマニュアルの16.2.1 CPUバスに説明があります。

    アクセス先が異なれば同時動作出来るのでプログラムがROMに、データがRAMにあるケースなら同時アクセスで速くなるという事ですね。

    キャッシュの存在を考察されていますが、RXには一般的なキャッシュは無いので影響はないですね。

    また、命令キューはCPUコアの中にあるのでプログラムがROM・RAMのどこにあっても命令は同じように先読みされます。

  • fujita nozomuさん
    「単純な時間待ちであれば ROM と 内蔵 RAM とで実行時間の差はほゞありません」大体想像の範囲でしたね、CPU内部の配線と外部のプリント配線では特性が違いますし、バスバッファーのデータが安定するまでのWAITが必要になりますしSDRAMならリフレッシュ期間で遅くなりますよね、でも実際に調べたみたのがすごい。
  • windyponさん
    「命令キューはCPUコアの中にあるのでプログラムがROM・RAMのどこにあっても命令は同じように先読みされます。」ということは外部BUSも同じように動作するのですか?そうとすればパイプライン的なことになって外部BUSと意外と差が大きくならない、fujitaさんの調査結果で1割程度なんでしょうか。
  • 2017/3/30 11:38 の書き込みについてもう少し説明します。
     
    .GLB _isalnum ;
     
    で、標準関数を抜き出せます。
     マップファイルを見れば関数のアドレスが分かるのでヘッダファイルに次のように書けば良いのです。
     
    #define isalnum ((long (*)(long )) 0xFFFE11A5 )
     
     しかし全関数に対してそのような作業は大変です。書いた順番では無くアルファベット順に並び替えられたりもします。
     それでROM出力にアドレスの一覧を出力するために、次の命令があります。関数の数だけ有ります。
     自分の好きな順番に並べられます。
     
    .LWORD _isalnum ;
     
     これをHEW、E1で読み出しテキストにコピーします。
     エディタの機能を使ってブロック状に切り出し、次のように貼り付けます。関数の数だけ並びます。
     
    #define _3_1_ 0xFFFE11A5
    #define _3_2_ 0xFFFE11B5
     
     この値を次のようにしてコピーします。
     
    #define isalnum ((long (*)(long )) _3_1_ ) // 英字または10進数字かどうか判定
    #define isalpha ((long (*)(long )) _3_2_ ) // 英字かどうか判定
  • >フラッシュの書き換え回数が気になるならば 1日当たりの書き換え回数を概算で求めて・・・
    >・・・コードをRAM上に置いてデバグとか考えるだけで無駄でしょう。

     完成した関数をROMに書き開発中の部分をRAMに設定すれば、RAMの部分だけコンパイルや書き込みをすれば良いので時間を短縮できると考えています。
  • > それでROM出力にアドレスの一覧を出力するために、次の命令があります。関数の数だけ有ります。
    > 自分の好きな順番に並べられます。
    >
    > .LWORD _isalnum ;

    使いたい関数の数だけ BRA.A 命令並べた方が良くないですか?

  • > RAMの部分だけコンパイルや書き込みをすれば良いので時間を短縮できると考えています。

    どの程度短縮できるという試算ですか?
  • わわいです
    SHのはなしですが、リンカのオプションに「外部シンボル割り付け情報ファイル」ってのがあって、それでシンボルアドレス情報が出力できるんで、それをリンクするとOKOKってのがあります
  • わわいです
    むかしのはなしですが、内蔵フラッシュの書き込み回数が100回ってデバイスがあって、外部RAMを増設してデバッグしてた、ということがありますねー
    もちっとむかしだと、ワンタイムROM(一度書き込むと消去できないROM)のヤツもあって、RAMを増設、ができなかったので、しようがないのでチップを100個ぐらい用意して使い捨てでデバッグ、とかやってましたねー
  • リカルドさん
    「標準関数を抜き出せます。」ということで、なるほどですね。